我正在将编写为以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)添加到驱动程序中?
答案 0 :(得分:0)
如上所述,我无法解决这个问题。我最终使用的解决方案是在配置中对json进行base64编码,然后在代码中对其进行解码。因此,配置被视为一个字符串,并且在途中没有被YARN损坏。
答案 1 :(得分:0)
这可能对我有帮助:
'{\"foo\":12345,\"bar\":67890}'