Hadoop集群上的Hive/Map Reduce作业:如何(粗略地)计算所需的磁盘空间?
以下用例: 我在.gz压缩中对大小约为500GB的数据运行配置单元查询:Hadoop集群上的Hive/Map Reduce作业:如何(粗略地)计算所需的磁盘空间?,hadoop,mapreduce,hive,hdfs,elastic-map-reduce,Hadoop,Mapreduce,Hive,Hdfs,Elastic Map Reduce,以下用例: 我在.gz压缩中对大小约为500GB的数据运行配置单元查询: 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”); 按c2从t1组中选择计数(不同c1),c
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”);
按c2从t1组中选择计数(不同c1),c2代码>
此查询产生约2800个映射作业和约400个reduce作业
在设置Hadoop群集时,每个160GB实例存储有20个实例,
作业将停止在97%地图和21%减少进度,然后回落到94%地图和19%减少进度,然后再没有任何进展。我认为这是因为HDFS的磁盘空间处于使用极限。也许我可以在那天晚些时候提供一条例外消息
如何:有没有办法根据正在处理的数据的输入大小粗略地预先计算所需的HDFS磁盘空间?请记住,输入数据以.gz格式存储。
更新
有人知道为什么我的MapReduce作业只使用节点的本地存储,而不使用DFS吗
其中一个映射程序的异常:
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)
以下是以下几点注意事项:
每个文件的默认复制系数为3,您需要为中间随机文件留出大约25%的磁盘空间。因此,您需要存储在HDFS中的数据的原始大小的4倍。但是,文件很少以未压缩的方式存储,根据文件内容和压缩算法的不同,我们平均看到HDFS中存储的文本文件的压缩比高达10-20。因此,实际需要的原始磁盘空间仅为原始未压缩大小的30-50%
<>如果我可以添加一些东西,如果空间真的是一个限制,你应该考虑压缩中间输出(映射器和减速器之间)来减少中间混洗文件。例如,通过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”);
谢谢你。这似乎正是我想要的,我将运行一些测试来证明这些数字。空间并不是一个真正的限制,我只是想正确配置我的集群,而不是花钱购买我并不真正需要的磁盘空间。目前我正在为mapred.map.output使用snappy编解码器,以r/w速度应该会更快。@saschor snappy很棒,您使用它绝对正确!我已经更新了我的问题。我的MapReduce作业不使用DFS,而是只使用节点的本地存储。有什么想法吗?