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

fgw7neuy  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(243)

我有这样一个脚本:


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

ocebsuys

ocebsuys1#

这是hadoop中的一个bug。
bash函数作为常规环境变量传递,以便跨进程导出:

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

bash生成的环境变量将包含多行,这通常是好的。
然而,hadoop流媒体有一个编写得很糟糕的环境类,它试图重新实现 System.getenv() 通过简单地分析 env .
因为它不处理多行变量,所以会破坏函数。
我试图提交一个错误报告,但我没有一个用户为他们的错误追踪器,我不想订阅他们的邮件列表。如果你喜欢这个补丁,我建议你提交你自己的。

相关问题