从Java进程中“导出”shell函数时出错

时间:2013-11-01 17:15:57

标签: bash shell hadoop

我有一个看起来像这样的脚本:

#!/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内容。

1 个答案:

答案 0 :(得分:2)

这是Hadoop中的一个错误。

Bash函数作为常规环境变量传递,以便导出跨进程工作:

foo='() { echo "hello world"; }' bash -c 'foo'

生成的环境变量bash将包含多行,通常很好。

但是,Hadoop Streaming编写错误的Environment class试图通过天真地解析System.getenv()的输出来重新实现env

由于它不处理多行变量,它会破坏你的功能。

我尝试提交错误报告,但我没有用户的bug跟踪器,我不想订阅他们的邮件列表。如果你想要这个修复,我建议你自己提交。