talend 7.1,mapr6.0分布,spark 2.2,
我有一个talend job(master),它在设置spark配置单元上下文之后调用子spark job来执行配置单元查询。要执行的查询从主spark作业传递到子spark作业。
查询可以有复杂的配置单元连接&有时甚至有特殊字符反勾!,tilda,@,可由用户使用。
如果子spark作业在spark-yarn客户机模式下运行,则任何查询都可以正常运行。但如果在集群模式下执行相同的查询,并且查询有\n或\t或反勾号(`),则即使在启动spark会话时,也会失败。大多数情况下,查询本身在从主查询传递到子查询的过程中被损坏。
我正在考虑将查询字符串转换为十六进制或unicode,以避免由于特殊字符而损坏,然后再转换回spark作业。如果有更好的解决方案,请提出建议。
1条答案
按热度按时间wlzqhblo1#
关于talendYarn簇模式作业使用mapr分布的几个要点:
群集模式spark作业将无法从../lib目录(甚至不是talend-specific routines.jar)获取任何jar。您需要将它与其他spark jar一起显式地传递给驱动程序。
任何具有空格、\n等的配置单元查询或上下文参数。。在群集模式下运行spark job的主节点和工作节点之间传递的字符串不完整[在客户端模式下工作正常]。
你不能在talend bd spark job中更新任何上下文变量accross jobs(比如使用一个tjava来更新上下文变量&期望它在另一个组件中使用它-不起作用!!)
考虑到上述情况,很少有解决办法:
appraoch-1:您可以用某些字符(如@@@)替换(读取删除)所有空格、\n等,稍后在spark作业中替换回来。注意:对于一些特殊字符,如`,此操作将失败。
方法2:所有查询,参数可以有空格或特殊字符或需要显式解析-把它放在一个文件中,把这个文件传递给hdfs&在spark job中读取这个文件以获得所需的所有参数。请注意,当您在spark中读取文件时,作业流可以被视为rdd(以及模式)(&schema),它可以被解析以获取所有变量。