我的任务是为公司处理价值数TB的SCM数据。我设置了一个hadoop集群,并有一个脚本从我们的SCM服务器中提取数据。
由于我通过流媒体界面批量处理数据,因此我遇到了一个问题,即O'Reilly的Hadoop书中没有解决的块大小:跨越两个块的数据会发生什么? wordcount示例如何解决这个问题?为了解决这个问题到目前为止,我们已经使用了小于64mb的输入文件。
在考虑reducer脚本时,问题又出现了;如何存储来自地图的聚合数据?在减少时会出现问题吗?
答案 0 :(得分:1)
这应该不是一个问题,只要每个块可以干净地分割分割数据的一部分(如换行符)。如果您的数据不是逐行数据集,那么这可能是一个问题。您也可以增加群集上块的大小(dfs.block.size)。
您还可以在流媒体中自定义输入进入映射器的方式
来自地图步骤的数据根据地图键的分区类进行排序。
然后将数据混合在一起以使所有映射键聚在一起然后传输到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倍:
在(3)中实际发生的是RecordReader返回NameNode,获取下一个块所在的DataNode的句柄,然后通过RPC伸出来拉入该完整块并读取其余部分首先记录到记录分隔符。