什么时候可以为hadoop Mapper启动资源?
我有一个小的sqlite数据库(邮政编码 - >美国城市名称),我有一个大的用户S3文件。我想将每个用户映射到与其邮递区号关联的城市名称。什么时候可以为hadoop Mapper启动资源?
我跟随著名WordCount.java例子,但林不知道MapReduce的内部工作原理:
- 是我的映射每S3输入文件中创建一次?
- 我应该在映射器创建时连接到sqlite数据库吗?我应该在映射器的构造函数中这样做吗?
的MapReduce是一个用于编写应用程序的框架,以可靠和容错的方式在大型商品硬件集群上并行处理大数据。 MapReduce在HDFS(Hadoop分布式文件系统)之上以两个不同的阶段执行,分别称为映射阶段和缩小阶段。
对您的问题的回答我的映射器是根据s3输入文件创建的吗?
映射器创建等于拆分数量 默认情况下创建拆分等于块的数量。
高级概述是一样的东西
输入 文件 - > InputFormat-> Splits-> RecordReader-> Mapper-> Partitioner->随机&排序 - > Reducer->最终 输出
实施例,
- 你的输入文件 - server1.log,server2.log,server3.l OG
- InputFormat将基于块的大小(默认)
- 对应的Split将分配到在每个分割工作映射创建拆分的数量。
- 为了从Split中获得记录行,RecordReader将在Mapper和Split之间。
- 比Partitioner将开始。
- 分区器洗牌后&分阶段将开始。
- 减速机
- 最终输出。
回答你的第二个问题: 以下是Mapper的三个标准的生命周期方法。
@Override
protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
// Filter your data
}
}
@Override
protected void setup(Mapper<Object, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
System.out.println("calls only once at startup");
}
@Override
protected void cleanup(Mapper<Object, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
System.out.println("calls only once at end");
}
1)mapper被创建一次每1分裂,通常是128或256mb。 您可以使用此参数配置拆分大小:mapreduce.input.fileinputformat.split.minsize
和mapreduce.input.fileinputformat.split.maxsize
。如果输入文件小于分割大小,则全部进入一个地图任务。
2)您可以使用方法setup
和cleanup
来配置任务的资源。 setup
在任务开始时调用一次,cleanup
在最后调用一次。所以,你可以对数据库的连接在setup
方法(可能不只是连接,但加载在内存性能所有城市)和紧密连接(如果你决定不来加载数据,但只要连接)在cleanup
更多关于输入分流您可以按照下列因此[http://stackoverflow.com/questions/14291170/how-does-hadoop-process-records-split-across-block-boundaries] – subodh