我正在尝试在bash中创建一个基本的MapReduce函数(我很新)。我目前有两个脚本,job_master.sh和map_function.sh。我正在尝试从作业主机运行map函数以从数据文件中剪切,如果它不存在则将其发送到key,但如果它确实将其发送到该名称的文件。当我以文件作为参数运行job_master脚本或map_function脚本时,没有任何事情发生。在我将if语句添加到map_function之前,它正在工作。
如果有人能够发现他们没有运行的原因,我在下面列出了这两个代码。我尝试包含echo语句进行测试,它没有进入job_master脚本中的循环,或者在map_function脚本中执行任何操作。
MAP_FUNCTION
#!/bin/bash
while IFS="," read -r date prod remainder; do
if [ ! -e "$prod" ];
then
echo $prod >> keys
else
echo $prod >> $prod
fi
done
JOB_MASTER
#!/bin/bash
files=$(ls | egrep 'sales_a*')
for elem in $files ; do
./map_function.sh $elem
done
答案 0 :(得分:0)
地图功能脚本正在等待输入。看看这个:
while IFS="," read -r date prod remainder; do
# ...
done
read
将在哪里获得输入?它在stdin
等待,但你没有传递任何东西。
另一方面,我看到你正在调用map函数脚本:
./map_function.sh $elem
也就是说,您正在传递命令行参数。但是map函数脚本不使用该参数。您似乎想要将$elem
的内容重定向到脚本的stdin
。
写得像这样:
for elem in sales_a*; do
./map_function.sh < "$elem"
done
这也解决了您在脚本中遇到的其他一些问题。 files=$(ls | grep 'sales_a*')
看起来很麻烦,这是一种不适当的方式来迭代文件。