我有这样一个脚本:
# !/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时,一切都很好。它会打印出我的函数中的几个echo语句。当我用“mapper.py”文件启动hadoop作业时,它工作正常。它甚至接受我的函数中的配置参数。当我将Map器声明为
-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文件的确切内容。
1条答案
按热度按时间ocebsuys1#
这是hadoop中的一个bug。
bash函数作为常规环境变量传递,以便跨进程导出:
bash生成的环境变量将包含多行,这通常是好的。
然而,hadoop流媒体有一个编写得很糟糕的环境类,它试图重新实现
System.getenv()
通过简单地分析env
.因为它不处理多行变量,所以会破坏函数。
我试图提交一个错误报告,但我没有一个用户为他们的错误追踪器,我不想订阅他们的邮件列表。如果你喜欢这个补丁,我建议你提交你自己的。