hadoop集群上的hive/mapreduce作业:如何(粗略地)计算所需的磁盘空间?

ecfsfe2w  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(322)

以下用例:
我在.gz压缩中对大小约为500gb的数据运行配置单元查询: select count(distinct c1), c2 from t1 group by c2; 此查询将产生约2800个map作业和约400个reduce作业。
当设置一个hadoop集群,每个160gb示例存储20个示例时,作业将在97%map和21%reduce progress时停止,然后回落到94%map和19%reduce progress,然后再也没有任何进展。我认为这是因为hdfs的磁盘空间已经达到了使用极限。也许我可以在那天晚些时候提供一个例外消息。
如何:有没有一种方法可以根据正在处理的数据的输入大小粗略地预先计算所需的hdfs磁盘空间?请记住,输入数据以.gz格式存储。
更新
有人知道为什么我的mapreduce作业只使用节点的本地存储,而不使用dfs吗?
dfs使用概述http://img27.imageshack.us/img27/5805/dfsusageoverview.png
dfs使用详细信息http://img542.imageshack.us/img542/5026/dfsusagedetail.png
来自某个Map程序的异常:

at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:550)
        at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:143)
        ... 8 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: java.io.IOException: Spill failed
        at org.apache.hadoop.hive.ql.exec.ReduceSinkOperator.processOp(ReduceSinkOperator.java:304)
        at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
        at org.apache.hadoop.hive.ql.exec.GroupByOperator.forward(GroupByOperator.java:959)
        at org.apache.hadoop.hive.ql.exec.GroupByOperator.flush(GroupByOperator.java:926)
        at org.apache.hadoop.hive.ql.exec.GroupByOperator.processHashAggr(GroupByOperator.java:779)
        at org.apache.hadoop.hive.ql.exec.GroupByOperator.processOp(GroupByOperator.java:722)
        at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
        at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:84)
        at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
        at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:83)
        at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
        at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:533)
        ... 9 more
Caused by: java.io.IOException: Spill failed
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1045)
        at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:599)
        at org.apache.hadoop.hive.ql.exec.ReduceSinkOperator.processOp(ReduceSinkOperator.java:289)
        ... 24 more

Caused by: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for output/s
pill15.out
        at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:381)
        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:146)
        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:127)
        at org.apache.hadoop.mapred.MapOutputFile.getSpillFileForWrite(MapOutputFile.java:121)
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1408)
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$1800(MapTask.java:869)
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$SpillThread.run(MapTask.java:1360)
anhgbhbe

anhgbhbe1#

以下是cloudera博客中的一些注解:
每个文件都有一个默认的复制因子3,您需要为中间无序文件保留大约25%的磁盘空间。因此,您需要存储在hdfs中的数据的原始大小的4倍。但是,文件很少以未压缩的方式存储,根据文件内容和压缩算法的不同,我们发现hdfs中存储的文本文件的压缩比平均高达10-20。因此实际需要的原始磁盘空间仅为原始未压缩大小的30-50%。
如果我可以添加一些东西,如果空间确实是一个限制,您应该考虑压缩中间输出(在mapper和reducer之间)以减少中间无序文件。您可以通过以下方式进行此操作,例如使用gzip压缩:

conf.set(“mapred.compress.map.output”, “true”)
conf.set(“mapred.output.compression.type”, “BLOCK”);
conf.set(“mapred.map.output.compression.codec”, “org.apache.hadoop.io.compress.GzipCodec”);

相关问题