Google Dataproc执行Pig作业如何使用params/properties传值
问题根因
参数访问失败是因为混淆了--properties、--params的作用范围,同时没处理好Pigsh命令的变量传递逻辑:
--properties传入的是Pig服务端的运行配置参数,属于JVM层面的配置项,默认不会注入到sh拉起的bash子进程环境中,随便写自定义key比如foo=bar不会被shell识别--params传入的是Pig脚本的占位符替换参数,仅在Pig解析脚本阶段做文本替换,不会自动同步为shell变量;另外原命令里的$foo没有转义,会被本地执行gcloud命令的终端提前解析为空值,根本传不到集群侧。
正确用法
分两种传参场景对应处理:
1. 给Pig脚本/内嵌shell命令传普通参数(用--params)
--params的参数遵循Pig占位符规则:脚本内用$参数名标记占位位置,Pig提交时会先把占位符替换成实际传入的值,再执行脚本。如果要把值传给sh调用的shell命令,必须转义$符号避免本地shell提前解析。
示例命令:
gcloud dataproc jobs submit pig --cluster=<cluster_name> --region=<region> \ -e "sh echo hello; sh echo \$bar" \ --params bar=baz
执行时Pig会先把$bar替换为baz,最终shell执行的命令是sh echo baz,可以正常输出值。如果是调用独立bash脚本,写法为sh your_script.sh \$bar,脚本内通过$1就能拿到传入的baz值。
2. 给shell进程注入自定义环境变量(用--properties指定专用配置项)
如果需要让shell进程直接通过环境变量读值,不能在--properties里随便写自定义key,要使用Pig官方提供的shell环境传递配置项pig.env.sh.environment,配置格式为变量名=变量值,多变量用逗号分隔。
示例命令:
gcloud dataproc jobs submit pig --cluster=<cluster_name> --region=<region> \ -e "sh echo hello; sh echo \$FOO" \ --properties pig.env.sh.environment=FOO=bar
配置后Pig拉起bash进程时会主动注入FOO环境变量,不管是内嵌shell命令还是外部脚本,都可以直接通过$FOO读取到bar值。
避坑提醒
- 本地终端执行gcloud提交命令时,所有Pig侧的$变量都要加反斜杠转义,否则会被本地shell提前解析为空,导致集群侧拿到的脚本里变量位置是空值
- 不要直接在
--properties里传无命名空间的自定义key,这类参数只会被Pig当成自身运行配置存储,不会传递给shell进程 - 如果同时传多个params参数,重复写
--params a=1 --params b=2即可,多个properties配置同理。
内容的提问来源于stack exchange,提问作者Gunturi Venkata NarayanaMurthy
相关产品推荐
相关产品推荐

