0

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

#!/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 '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 文件的确切内容。

4

1 回答 1

2

这是 Hadoop 中的一个错误。

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

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

生成的环境变量 bash 将包含多行,这通常没问题。

然而,Hadoop Streaming 有一个写得很糟糕的Environment 类,它试图System.getenv()通过天真地解析env.

由于它不处理多行变量,因此它会破坏您的函数。

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

于 2013-11-01T18:04:54.350 回答