hadoop-streaming.jar中的-input和-output是什么?我阅读了其中的帮助部分,但在编写自定义映射器和reducer时仍然有疑问

问题描述

我在HDFS上有一个文件夹,每个文件夹有6k个文件,每个文件约6MB。 HDFS不喜欢很多小文件,而且它们每天都会生成。我需要找到一种压缩它们的方法

我选择将它们从filename1.txt转换为filename1.zip,并进行明显压缩,然后将所有压缩文件转换一个.har文件。 (.har与.tar几乎相同,不涉及压缩,只是减少了文件数量

所以我可以使用hadoop dfs -ls har:///path/to/file.har处理这些文件,然后将压缩文件下载到某些本地计算机并在其中解压缩,因为我知道现在有办法以任何压缩方式执行hadoop archive

所以我决定用hadoop-streaming.jar编写自己的mapper和reducer来创​​建一个n个容器(其中n是要压缩的文件数量)的mapreduce作业,但是我不明白-input是什么和hadoop-streaming.jar中的-output代表。一旦我对从何处获取文件以及在何处进行压缩进行了硬编码。

我确定我可以编写更高效,更优雅的代码,但到目前为止,我真的不了解hadoop-streaming.jar在wordcount示例之外的工作方式,以及如何在其中使用-input和-output标志

有我的草图:

mapper.sh:

files_to_archive=$(su hdfs -c "hdfs dfs -ls -C /tmp/dev_gms/in | head -n 5")
echo $files_to_archive
for line in $files_to_archive;
do
  echo "$line" $(basename $line)
done < "/dev/stdin"

reducer.sh

#!/bin/bash

while read path name
do
  echo "$path" "$name"
  hdfs dfs -copyToLocal ${path} . && tar -czvf ${name}.tar.gz ${name} && hdfs dfs -copyFromLocal ${name}.tar.gz /tmp/dev_gms/archive
done < "/dev/stdin"

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)