shell向hadoop流传递目录:需要一些帮助

ulydmbyx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(248)

上下文是我试图在amazon emr(web ui)上使用bash脚本运行流作业,我的运行方式如下:

-input s3://emrdata/test_data/input -output s3://emrdata/test_data/output -mapper
s3://emrdata/test_data/scripts/mapperScript.sh -reducer NONE

输入目录中有子目录,这些子目录有gzip数据文件。
相关部分 mapperScript.sh 失败的原因是:

for filename in "$input"/*; do

dir_name=`dirname $filename`
fname=`basename $filename`

echo "$fname">/dev/stderr

modelname=${fname}.model

modelfile=$model_location/$modelname

echo "$modelfile">/dev/stderr

inputfile=$dirname/$fname

echo "$inputfile">/dev/stderr

outputfile=$output/$fname

echo "$outputfile">/dev/stderr

# Will do some processing on the files in the sub-directories here

done # this is the loop for getting input from all sub-directories

基本上,我需要在流模式下读取子目录,当我运行这个时,hadoop抱怨说:

2013-03-01 10:41:26,226 ERROR
org.apache.hadoop.security.UserGroupInformation (main):               
PriviledgedActionException as:hadoop cause:java.io.IOException: Not a
file:      s3://emrdata/test_data/input/data1 2013-03-01 10:41:26,226
ERROR org.apache.hadoop.streaming.StreamJob (main):  Error Launching
job : Not a file: s3://emrdata/test_data/input/data1

我知道这里也有人问过类似的问题
那里的建议是写自己的输入格式。我在想,在编写脚本/提供emr输入的方式中是否遗漏了其他内容,或者用java编写自己的inputformat是我唯一的选择。
我也试过用“input/*”给emr输入信息,但没有成功。

piah890a

piah890a1#

虽然可能有一些临时的解决方法,但是hadoop本身并不支持这一点,因为您可能会看到这里有一个开放的标签。所以呢 inputpatth/*/* 可能适用于2级子实体,但可能无法进一步嵌套。
现在你能做的最好的事情就是获取没有任何子目录的文件/文件夹列表,并在创建一个输入路径的csv列表之后递归地添加它们。你可以使用像s3cmd这样的工具。

相关问题