
本文旨在解决从 Java 应用程序向 Bash 脚本传递包含 Spark 提交配置的长字符串参数时可能遇到的问题。我们将深入探讨如何正确构造和传递参数,以避免常见的类加载错误,并确保 Spark 任务能够顺利执行。通过清晰的代码示例和详细的解释,你将学会如何有效地管理 Spark 配置,并在 Java 和 Bash 脚本之间安全地传递它们。
在将 Spark 任务的配置从 Java 应用程序传递到 Bash 脚本时,直接将包含所有配置的字符串作为参数传递可能会导致问题,尤其是当配置字符串很长且包含特殊字符时。常见的错误是 Error: Failed to load class,这通常表明 Spark 无法正确解析传递的配置。
解决此问题的关键在于确保 Bash 脚本正确接收和解释配置字符串。以下是一些推荐的方法和注意事项:
1. 使用 EOF (Here Document) 定义配置字符串
立即学习“Java免费学习笔记(深入)”;
在 Bash 脚本中使用 EOF(End-of-File)标记定义配置字符串,可以避免转义和引号问题。
CONF=$(cat << EOF --class com.at.es_parent_child.SegmentIcebergEsV2 \ --master yarn \ --deploy-mode client \ --queue llap \ --num-executors 3 \ --driver-memory 1024m \ --executor-memory 1024m \ --executor-cores 4 \ --name '[564889711]es_parent_child.[0].1668574353481' \ --conf spark.executor.extraClassPath=/etc/hbase/conf \ --conf spark.driver.extraClassPath=/etc/hbase/conf \ --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ --conf spark.max.executor.failures=100 \ --conf spark.rdd.compress=true \ --conf spark.sql.debug.maxToStringFields=2000 \ --conf spark.sql.hive.convertMetastoreParquet=false \ --conf spark.default.parallelism=50 \ --conf spark.debug.maxToStringFields=2000 \ --conf hbase.defaults.for.version.skip=true \ --conf spark.yarn.executor.memoryOverhead=1024 \ --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \ --conf spark.sql.catalog.spark_catalog.type=hive \ --conf spark.sql.catalog.iceberg=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.iceberg.type=hive \ --conf spark.sql.adaptive.coalescePartitions.enabled=true \ --files /etc/hbase/conf/hbase-site.xml,/usr/hdp/current/hive-client/conf/hive-site.xml EOF ) sudo -u cdpcore /bin/sh /build/iceberg/spark-3.0.1-bin-hadoop2.7/bin/spark-submit "$CONF" --jars $(echo $JAR_LIB/*.jar | tr ' ' ',') $JAR_MAIN "$2" $3 $4 $5 &
注意:
2. 在 Java 中构建命令数组时,避免将所有配置放在一个字符串中
最佳实践是将每个配置选项作为数组中的一个单独元素传递。 这样可以避免复杂的字符串转义和引号问题。
String[] cmd = {
"/bin/sh",
System.getProperty("user.dir") + "/spark_job.sh",
"--class", "com.at.es_parent_child.SegmentIcebergEsV2",
"--master", "yarn",
"--deploy-mode", "client",
"--queue", "llap",
"--num-executors", "3",
"--driver-memory", "1024m",
"--executor-memory", "1024m",
"--executor-cores", "4",
"--name", "[564889711]es_parent_child.[0].1668574353481",
"--conf", "spark.executor.extraClassPath=/etc/hbase/conf",
"--conf", "spark.driver.extraClassPath=/etc/hbase/conf",
"--conf", "spark.serializer=org.apache.spark.serializer.KryoSerializer",
"--conf", "spark.max.executor.failures=100",
"--conf", "spark.rdd.compress=true",
"--conf", "spark.sql.debug.maxToStringFields=2000",
"--conf", "spark.sql.hive.convertMetastoreParquet=false",
"--conf", "spark.default.parallelism=50",
"--conf", "spark.debug.maxToStringFields=2000",
"--conf", "hbase.defaults.for.version.skip=true",
"--conf", "spark.yarn.executor.memoryOverhead=1024",
"--conf", "spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog",
"--conf", "spark.sql.catalog.spark_catalog.type=hive",
"--conf", "spark.sql.catalog.iceberg=org.apache.iceberg.spark.SparkCatalog",
"--conf", "spark.sql.catalog.iceberg.type=hive",
"--conf", "spark.sql.adaptive.coalescePartitions.enabled=true",
"--files", "/etc/hbase/conf/hbase-site.xml,/usr/hdp/current/hive-client/conf/hive-site.xml",
zKUrl,
"" + task.getPortalId(),
task.getJobId(),
"" + task.getIndexCode()
};3. 使用配置文件
将 Spark 配置存储在单独的配置文件中,并在 Java 应用程序和 Bash 脚本中引用该文件。这可以简化参数传递,并使配置更易于管理。
Bash 脚本:
CONF_FILE="/path/to/spark-defaults.conf" sudo -u cdpcore /bin/sh /build/iceberg/spark-3.0.1-bin-hadoop2.7/bin/spark-submit --properties-file "$CONF_FILE" --jars $(echo $JAR_LIB/*.jar | tr ' ' ',') $JAR_MAIN "$2" $3 $4 $5 &
Java 应用程序:
无需传递配置,只需确保 Bash 脚本中的 CONF_FILE 变量指向正确的配置文件。
4. 检查类路径
Error: Failed to load class 错误也可能是由于类路径问题引起的。 确保所有必需的 JAR 文件都包含在 Spark 驱动程序和执行器的类路径中。
总结
通过使用 EOF 定义配置字符串、将配置选项作为单独的数组元素传递,或使用配置文件,可以有效地解决从 Java 应用程序向 Bash 脚本传递 Spark 提交参数时遇到的问题。选择哪种方法取决于你的具体需求和偏好。 无论选择哪种方法,请务必仔细检查配置字符串的语法,并确保所有必需的 JAR 文件都包含在类路径中。
以上就是从 Java 应用向 Bash 脚本传递 Spark 提交参数的正确方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号