具有JSON值的Spark的环境变量(spark.yarn.appMasterEnv)

时间:2018-02-13 18:57:56

标签: apache-spark yarn

我正在将编写为以Spark独立模式运行的应用程序转换为在yarn上运行。在独立模式下,我们通过在spark-env.sh中设置环境变量将一些配置传递给应用程序。

这在yarn中不起作用,而是在spark-submit或spark-daemon.conf中设置参数spark.yarn.appMasterEnv。[ENV_VARIABLE]以获取驱动程序的变量。由于变量的内容,我们希望它们在spark-daemon.conf中设置。

我能够设置值,但如果它们是json数据,则会从值中删除任何引号,从而生成无效的JSON。例如:

spark.yarn.appMasterEnv.MY_JSON_LIST "[{\"myprop\":\"propval\"},{\"myprop\":\"prop2\"}]"                                                                                                    
spark.yarn.appMasterEnv.MY_JSON_OBJ "{\"a\":\"b\"}"                                                                                                                                         
spark.yarn.appMasterEnv.MY_JSON_LIST2 '[{"myprop":"propval"},{"myprop":"prop2"}]'                                                                                                           
spark.yarn.appMasterEnv.MY_JSON_OBJ2 '{"a":"b"}'                                                                                                                                            
spark.yarn.appMasterEnv.MY_JSON_LIST3 "[{\\"myprop\\":\\"propval\\"},{\\"myprop\":\\"prop2\\"}]"                                                                                            
spark.yarn.appMasterEnv.MY_JSON_OBJ3 "{\\"a\\":\\"b\\"}"

在驱动程序中退出环境时产生以下值:

MY_JSON_LIST: [{myprop:propval},{myprop:prop2}] 
MY_JSON_OBJ: {a:b} 
MY_JSON_LIST2: [{myprop:propval},{myprop:prop2}] 
MY_JSON_OBJ2: {a:b} 
MY_JSON_LIST3: [{myprop:propval},{myprop:prop2}] 
MY_JSON_OBJ3: {a:b} 

这些都不是有效的JSON。

所以问题是:如何通过服务器上设置的环境变量将任意文本(特别是正确形成的JSON)添加到驱动程序中?

2 个答案:

答案 0 :(得分:0)

如上所述,我无法解决这个问题。我最终使用的解决方案是在配置中对json进行base64编码,然后在代码中对其进行解码。因此,配置被视为一个字符串,并且在途中没有被YARN损坏。

答案 1 :(得分:0)

这可能对我有帮助:

'{\"foo\":12345,\"bar\":67890}'