我有一个看起来像这样的脚本:
#!/bin/bash
function func1() {
echo "HELLO!"
}
export -f func1
function func2() {
echo "HI!!"
func1
}
export -f func2
我在本地启动了一个hadoop tasktracker,我的/usr/lib/hadoop/conf/hadoop-env.sh看起来像这样:
# .. few configuration params
# source my_shell_file.sh
# my_function
当我启动tasktracker时,一切都很好。它打印出我在my_function中的几个echo语句。当我使用'mapper.py'文件启动hadoop作业时,它正常工作。它甚至需要my_function中的配置参数。当我将我的mapper声明为
时会出现问题-mapper 'bash -c "func1 ; python mapper.py"'
然后抛出此错误:
/bin/bash: func2: line 1: syntax error: unexpected end of file
/bin/bash: error importing function definition for `func2'
/bin/bash: func1: line 1: syntax error: unexpected end of file
/bin/bash: error importing function definition for `func1'
我不确定这里发生了什么。我试过'sh -c'而不是'bash -c',我也遇到了同样的问题。
编辑:当我在控制台上“获取”它时,shell脚本工作正常。它识别控制台上shell文件中定义的函数。
EDIT2:添加了shell文件的EXACT内容。
答案 0 :(得分:2)
这是Hadoop中的一个错误。
Bash函数作为常规环境变量传递,以便导出跨进程工作:
foo='() { echo "hello world"; }' bash -c 'foo'
生成的环境变量bash将包含多行,通常很好。
但是,Hadoop Streaming编写错误的Environment class试图通过天真地解析System.getenv()
的输出来重新实现env
。
由于它不处理多行变量,它会破坏你的功能。
我尝试提交错误报告,但我没有用户的bug跟踪器,我不想订阅他们的邮件列表。如果你想要这个修复,我建议你自己提交。