首页 > Java > java教程 > 正文

从 Java 应用向 Bash 脚本传递 Spark 提交参数的正确方法

花韻仙語
发布: 2025-10-02 19:47:01
原创
531人浏览过

从 java 应用向 bash 脚本传递 spark 提交参数的正确方法

本文旨在解决从 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 &
登录后复制

注意:

  • EOF 标记必须单独成行,且前后不能有任何空格或制表符。
  • 在定义配置字符串时,使用反斜杠 \ 进行换行,以提高可读性。
  • 确保 --name 参数中的方括号使用单引号括起来,以防止 Bash 解释为通配符。
  • 在调用 spark-submit 时,务必使用双引号将 $CONF 变量括起来,即 "$CONF",以防止单词分割。

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. 使用配置文件

AppMall应用商店
AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56
查看详情 AppMall应用商店

将 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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号