无法在 Yarn 集群模式下将查询传递给 java spark 程序

Not able to pass Query to java spark program in Yarn cluster mode

Talend 7.1,MapR6.0 发行版,Spark 2.2,

我有一个 Talend 作业(master),它在设置 Spark-hive 上下文后调用 Child spark 作业来执行 hive-query。此要执行的查询从 Master 传递到 Child spark 作业。

查询可以包含复杂的配置单元连接,有时甚至用户可以使用特殊字符反引号、!、tilda、@。

如果子 Spark 作业在 Spark Yarn 客户端模式下是 运行,则任何查询 运行 都可以。但是,如果在集群模式下执行同样的操作,并且如果查询具有 \n 或 \t 或反引号 (`) - 它会失败,即使在启动 spark 会话时也是如此。大多数情况下,查询本身在从主节点传递到子节点的过程中被破坏了。

我正在考虑将查询字符串转换为十六进制或 Unicode 以避免因特殊字符而损坏,然后在 spark 作业中转换回来。如果有更好的解决方案,请提出建议。

关于 mapR 分布用于 Talend Yarn 集群模式作业的几点:

  1. 集群模式 spark 作业将无法从 ../lib 目录中获取任何 jar(甚至不是特定于 talend 的 routines.jar)。您需要将它与其他火花罐一起显式传递给驱动程序。
  2. 任何具有 space、\n 等的配置单元查询或上下文参数被破坏并且不完整的字符串从主节点传递到工作节点 运行 集群模式下的 spark 作业 [ this在客户端模式下工作正常 ].
  3. 您不能在 Talend BD spark 作业中跨作业更新任何上下文变量(例如使用一个 tJava 更新上下文变量并期望它在另一个组件中使用它 - 不起作用!!)

考虑到以上几点,解决方法很少:

Appraoch-1:您可以用某些字符(如@@@)替换(读取删除)所有 space、\n 等,稍后在 Spark 作业中替换回来。注意:对于少数特殊字符,如 `.

,这将失败

方法 2:所有查询、参数可以有 space 或特殊字符或需要显式解析 - 将其放入文件中,将此文件传递给 hdfs 并在 Spark 作业中读取文件以获取所有根据需要设置参数。 请注意,当您在 Spark 作业中读取文件时 - 流可以被视为 RDD(以及架构),可以对其进行解析以获取所有变量。