外部源输入
7.4.1 模型描述
外部源输入模型不是从HDFS中加载数据,而是从Hadoop的某个外部系统中获得数据。如SQL数据库或web服务。
目的
通过并并行的方式从非MapReduce框架的数据源中加载数据。
动机
使用MapReduce分析数据的一般模式是将数据存储到HDFS,然后再分析这些数据。通过这个模式,你可以将MapReduce框架和外部源连接起来,如数据库或Web服务,并能够直接将数据拉取到mapper中。
为什么你可能需要直接从源头分析数据而不是先落地,有以下几方面原因。从Hadoop系统外加载数据不需要先将其落地成文件,这样速度更快。
在MapReduce方法中,数据是以并行的方式加载而不是以串行的方式。
结构
外部源输入模式结构如图,所示:
- InputFormat创建所有的InputSplit对象,该对象的创建可能是基于用户自定义的对象。一个输入split是一个逻辑输入快,并且主要依赖于它读取数据的格式。在这个模式中,输入数据并不是基于文件的输入而是一个外部源。输入可以是一系列的SQL表或在整个集群分散的若干分布式服务。只要输入能按并行的方式读取,这就非常适合MapReduce。
- InputSplit中包含数据源再哪里以及每个数据源读取多少数据这些信息。框架使用位置信息来帮助确定如何分配map任务。自定义InputSplit还必须实现Writable接口,因为框架将使用该接口的方法将输入split信息传送给TaskTracker。分布在TaskTracker上的map任务数量和根据输入格式生成的输入split的数量相等。然后InputSplit用于初始化RecordReader进行处理。
- RecordReader使用提供的作业配置及InputSplit信息取读取键/值对。RecordReader类的实现依赖于如何读取数据源。它需要设置从外部源读取数据所需要的任何连接。
性能分析
MapReduce作业实现该模式的瓶颈将是数据源或网络。数据源对于多连接可能不具有很好的可扩展性。另外一个问题可能是网路基础设施。