Hadoop块大小问题

时间:2010-08-04 18:38:23

标签: filesystems hadoop

我的任务是为公司处理价值数TB的SCM数据。我设置了一个hadoop集群,并有一个脚本从我们的SCM服务器中提取数据。

由于我通过流媒体界面批量处理数据,因此我遇到了一个问题,即O'Reilly的Hadoop书中没有解决的块大小:跨越两个块的数据会发生什么? wordcount示例如何解决这个问题?为了解决这个问题到目前为止,我们已经使用了小于64mb的输入文件。

在考虑reducer脚本时,问题又出现了;如何存储来自地图的聚合数据?在减少时会出现问题吗?

3 个答案:

答案 0 :(得分:1)

这应该不是一个问题,只要每个块可以干净地分割分割数据的一部分(如换行符)。如果您的数据不是逐行数据集,那么这可能是一个问题。您也可以增加群集上块的大小(dfs.block.size)。

您还可以在流媒体中自定义输入进入映射器的方式

http://hadoop.apache.org/common/docs/current/streaming.html#Customizing+the+Way+to+Split+Lines+into+Key%2FValue+Pairs

来自地图步骤的数据根据​​地图键的分区类进行排序。

http://hadoop.apache.org/common/docs/r0.15.2/streaming.html#A+Useful+Partitioner+Class+%28secondary+sort%2C+the+-partitioner+org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner+option%29

然后将数据混合在一起以使所有映射键聚在一起然后传输到reducer。有时在减速器步骤发生之前,如果您愿意,可以使用组合器。

您最有可能创建自己的自定义-inputreader(以下是如何流式传输XML文档的示例http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/streaming/StreamXmlRecordReader.html

答案 1 :(得分:0)

如果您有多TB输入,则应考虑将块大小设置为甚至超过128MB。

如果文件大于一个块,则可以将其拆分,因此每个文件块将转到不同的映射器,或者整个文件可以转到一个映射器(例如,如果此文件是gzip压缩)。但我想你可以使用一些配置选项设置它。

拆分会自动处理,您不必担心。地图输出存储在hdfs的tmp目录中。

答案 2 :(得分:0)

关于“跨越两个数据块的数据”的问题是RecordReader处理的问题。 RecordReader的目的是3倍:

  1. 确保处理每个k,v对
  2. 确保每个k,v对仅处理一次
  3. 处理跨块分割的k,v对
  4. 在(3)中实际发生的是RecordReader返回NameNode,获取下一个块所在的DataNode的句柄,然后通过RPC伸出来拉入该完整块并读取其余部分首先记录到记录分隔符。