2010-08-04 72 views
0

我一直负责为我的公司处理多TB价值的SCM数据。我建立了一个hadoop集群,并有一个脚本来从我们的SCM服务器获取数据。Hadoop块大小问题

由于我通过流式接口通过批处理数据,遇到了O'Reilly的Hadoop书籍似乎无法解决的块大小问题:跨两个块的数据会发生什么情况? wordcount示例如何解决这个问题?为了解决这个问题,我们采取了让每个输入文件小于64mb的方法。

思考Reducer脚本时再次出现问题;如何存储地图的汇总数据?这个问题在减少时会出现吗?

+0

什么是SCM在你的情况? – wlk 2010-08-04 18:59:43

+0

我们使用Perforce。 – bhargav 2010-08-04 19:25:25

回答

1

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

您也可以自定义自己的流媒体的投入是如何进入你的映射器

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

数据从地图步骤中,基于对地图的关键一partioner类被整理到一起。

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

然后数据被洗牌在一起,使所有的映射键扎堆,然后转移到减速。有时候在减速步骤发生之前,如果你喜欢,可以使用组合器。

最有可能的,你可以创建自己的自定义-inputreader(我这里是怎么流的XML文档http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/streaming/StreamXmlRecordReader.html

+0

这是完美的。我的大部分问题都是通过将文件分割大小限制为64MB(块的大小)来解决的,因此将每个文件(适合一个块)映射到单个映射进程。在2节点集群上,我们在3分钟内处理了大约2GB的数据 - 可笑的是速度快:) – bhargav 2010-08-08 20:08:51

+0

我不认为应该存在“分割”记录问题:就像使用常规文件系统一样,块大小是物理结构这在逻辑层面上并不一定有深远的影响。所以,虽然可以将文件大小设置为块大小(理想情况下较小),但为了避免负面的性能问题,不必为了正确而进行分割。 – StaxMan 2011-01-20 00:33:29

0

如果你有多TB的输入,你应该考虑设置块大小,甚至超过128MB。

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

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

0

您对“数据跨越两个街区”是什么RecordReader处理问题。一个RecordReader的目的是3倍:

  1. 确保每个k,V对被处理
  2. 确保每个k,V对仅处理一次
  3. 手柄K,V对它们跨越块
  4. 分裂

实际发生在(3)中的是RecordReader返回到NameNode,获取下一个块所在的DataNode的句柄,然后通过RPC伸出来拉入该完整块并读取剩余的第一条记录的一部分直至记录分隔符。