Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop集群上的Hive/Map Reduce作业:如何(粗略地)计算所需的磁盘空间?_Hadoop_Mapreduce_Hive_Hdfs_Elastic Map Reduce - Fatal编程技术网

Hadoop集群上的Hive/Map Reduce作业:如何(粗略地)计算所需的磁盘空间?

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

以下用例:

我在.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),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,而是只使用节点的本地存储。有什么想法吗?