1. 设计背景
过去几十年,随着网络和计算机技术的普及和发展,网络数据呈爆炸式增长。出于成本和单机处理能力的限制,多台机器协同合作,共同达成某一目标,已成为不可逆转的趋势。
海量数据带来的挑战,可以分为两部分:1)数据存储;2)数据计算;
首先需要解决庞大数据的存储问题;其次,存储的数据没有任何价值,为了挖掘海量数据的价值,需要在其上进行数据处理,加工,查询等操作;
在对海量数据进行处理的过程中,不难发现,不论何种问题,有一些共同的难题需要处理,比如:
如何在较短的时间内处理这些数据?——在多台机器上分布数据,并行执行数据处理过程(分布式/并行)
如何将数据分到多台机器上?
如何充分利用多台机器的资源?
当发生故障时,如何处理?
这些难题,和问题本身无关,而是由“海量”数据这一特性所带来。在此背景下,MapReduce计算框架应运而生。它尝试将数据处理中,“海量”数据这一特性带来的难题进行封装解决,使得程序员可以更专注于问题本身。
2. 难点
1)抽象和封装
将“海量”数据带来的难题进行封装解决,说起来容易;实现方面,却需要较强的问题分析与抽象能力,以及丰富的工程实践经验。如何提供简单,易用,灵活的用户接口,如何将分布式特性进行良好的封装,同时也具有合适的自定义特性,并不容易。
2)问题解决与故障处理
在多台机器上分布数据,并行执行数据处理过程同样也并非易事,有以下问题需要考虑:
数据分区(即数据怎样分布到多台机器上)
任务调度(如何在多台机器上并行处理,进行处理任务调度)
负载均衡