如何使用循环将多个输入目录传递给 hadoop 命令

How to pass multiple input directories to a hadoop command using a loop

到 运行 使用 hadoop 流的脚本 - 我使用的 bash 脚本看起来像这样 -

IP1="/data/hdp/f1/part-*"
IP2="/data/hdp/f2/part-*"
OP="/data/hdp/op"
hadoop jar $HADOOP_JAR_PATH \
-file $MAPPER_FILE -mapper "$PY $MAPPER_FILE" \
-input $IP1 -input $IP2 
-output $OP

我如何将其推广到我有 20 个输入目录的情况。一种方法是将其指定为 -input $IP1 -input $IP2 -input $IP3 ... -input $IP20

但我想知道我们是否可以使用 shell 变量和 loops/arrays 来完成它:

IP_LIST=${!IP*}
IP_CMD=''
for ip in $IP_LIST
do
    IP_CMD=$IP_CMD"-input $"$ip" "
done

IP_ARRAY=($IP_CMD)

hadoop jar $HADOOP_JAR_PATH \
-file $MAPPER_FILE -mapper "$PY $MAPPER_FILE" \
"${IP_ARRAY[@]}"
-output $OP

当我尝试此操作时,出现 Input path does not exist: hdfs://... 错误。

我按原样使用的完整命令...

IP1="/data/hdp/f1/part-*"
IP2="/data/hdp/f2/part-*"
OP="/data/hdp/op"
MAPPER_FILE="map_code.py"
REDUCER="reduce_code.py"

IP_LIST=${!IP*}
IP_CMD=''
for ip in $IP_LIST
do
    IP_CMD=$IP_CMD"-input $"$ip" "
done

hadoop fs -rm -r -skipTrash $OP

cmd="hadoop jar $HADOOP_JAR_PATH \
-D mapred.reduce.tasks=00 \
-Dmapreduce.output.fileoutputformat.compress=true \
-Dmapreduce.output.fileoutputformat.compress.codec=\
org.apache.hadoop.io.compress.GzipCodec \
-file $MAPPER_FILE\
-file $REDUCER  \
-mapper $PY $MAPPER_FILE\
-reducer $PY $REDUCER\
-output $OP -cacheFile $DC#ref\
$IP_CMD"
eval $cmd

您可以将所有命令作为字符串,并在完成后使用 eval 命令。

在你的例子中-
添加到 IP_CMD 命令的其余部分并使用 eval $IP_CMD