【问题标题】:Spark Shell Add Multiple Drivers/Jars to Classpath using spark-defaults.confSpark Shell 使用 spark-defaults.conf 将多个驱动程序/罐子添加到类路径
【发布时间】:2020-01-11 17:44:53
【问题描述】:

我们正在使用 Spark-Shell REPL 模式来测试各种用例并连接到多个源/接收器

我们需要在 spark-defaults.conf 文件中添加自定义驱动程序/jars,我尝试添加多个用逗号分隔的 jars

喜欢

spark.driver.extraClassPath = /home/sandeep/mysql-connector-java-5.1.36.jar 
spark.executor.extraClassPath = /home/sandeep/mysql-connector-java-5.1.36.jar

但它不起作用,任何人都可以提供正确语法的详细信息

【问题讨论】:

标签: scala apache-spark properties classpath


【解决方案1】:

注意:已在 Linux Mint 和 Spark 3.0.1 中验证

如果您在 spark-defaults.conf 中设置属性,则仅当您使用 spark-submit 提交作业时,spark 才会采用这些设置。

注意:spark-shell 和 pyspark 需要验证。

文件:spark-defaults.conf

spark.driver.extraJavaOptions      -Dlog4j.configuration=file:log4j.properties -Dspark.yarn.app.container.log.dir=app-logs -Dlogfile.name=hello-spark
spark.jars.packages                 org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.1,org.apache.spark:spark-avro_2.12:3.0.1

在终端运行你的工作说 wordcount.py

spark-submit /path-to-file/wordcount.py

如果您想从 IDE 以开发模式运行您的作业,那么您应该使用 config() 方法。这里我们将设置 Kafka jar 包和 avro 包。此外,如果您想包含 log4j.properties,请使用 extraJavaOptions。

AppName 和 master 可以通过 2 种方式提供。

  1. 使用 .appName() 和 .master()
  2. 使用 .conf 文件

文件:hellospark.py

from logger import Log4j
from util import get_spark_app_config
from pyspark.sql import SparkSession

# first approach.
spark = SparkSession.builder \
    .appName('Hello Spark') \
    .master('local[3]') \
    .config("spark.streaming.stopGracefullyOnShutdown", "true") \
    .config("spark.jars.packages", 
                 "org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.1,
                  org.apache.spark:spark-avro_2.12:3.0.1") \
    .config("spark.driver.extraJavaOptions", 
                 "-Dlog4j.configuration=file:log4j.properties "
                 "-Dspark.yarn.app.container.log.dir=app-logs "
                 "-Dlogfile.name=hello-spark") \
    .getOrCreate()

# second approach.
conf = get_spark_app_config()
spark = SparkSession.builder \
    .config(conf=conf)
    .config("spark.jars.packages", 
                 "org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.1") \
    .getOrCreate()

logger = Log4j(spark)

文件:logger.py

from pyspark.sql import SparkSession


class Log4j(object):
    def __init__(self, spark: SparkSession):
        conf = spark.sparkContext.getConf()
        app_name = conf.get("spark.app.name")
        log4j = spark._jvm.org.apache.log4j
        self.logger = log4j.LogManager.getLogger(app_name)

    def warn(self, message):
        self.logger.warn(message)

    def info(self, message):
        self.logger.info(message)

    def error(self, message):
        self.logger.error(message)

    def debug(self, message):
        self.logger.debug(message)

文件:util.py

import configparser
from pyspark import SparkConf

def get_spark_app_config(enable_delta_lake=False):
    """
    It will read configuration from spark.conf file to create
    an instance of SparkConf(). Can be used to create
    SparkSession.builder.config(conf=conf).getOrCreate()
    :return: instance of SparkConf()
    """
    spark_conf = SparkConf()
    config = configparser.ConfigParser()
    config.read("spark.conf")

    for (key, value) in config.items("SPARK_APP_CONFIGS"):
        spark_conf.set(key, value))

    if enable_delta_lake:
        for (key, value) in config.items("DELTA_LAKE_CONFIGS"):
            spark_conf.set(key, value)
    return spark_conf

文件:spark.conf

[SPARK_APP_CONFIGS]
spark.app.name = Hello Spark
spark.master = local[3]
spark.sql.shuffle.partitions = 3

[DELTA_LAKE_CONFIGS]
spark.jars.packages = io.delta:delta-core_2.12:0.7.0
spark.sql.extensions = io.delta.sql.DeltaSparkSessionExtension
spark.sql.catalog.spark_catalog = org.apache.spark.sql.delta.catalog.DeltaCatalog

【讨论】:

    【解决方案2】:

    作为除了 Prateek 的回答之外的示例,我通过在客户端模式下启动 spark-shell 会话时将以下内容添加到要加载的 spark-defaults.conf 文件中取得了一些成功。

    spark.jars         jars_added/aws-java-sdk-1.7.4.jar,jars_added/hadoop-aws-2.7.3.jar,jars_added/sqljdbc42.jar,jars_added/jtds-1.3.1.jar
    

    将确切的行添加到spark-defaults.conf 文件将加载三个 jar 文件,只要它们存储在 jars_added 文件夹中,当 spark-shell 从特定目录运行时(对我来说这样做似乎可以减轻需要将 jar 文件也加载到指定位置的从属设备上)。我在我的 $SPARK_HOME 目录中创建了文件夹 'jars_added' 所以每当我运行 spark-shell 时,我必须从这个目录运行它(我还没有弄清楚如何更改 spark.jars 设置用作初始路径的位置,它启动spark-shell 时似乎默认为当前目录)。正如 Prateek 所暗示的,jar 文件需要用逗号分隔。

    我还必须将 SPARK_CONF_DIR 设置为 $SPARK_HOME/conf (export SPARK_CONF_DIR = "${SPARK_HOME}/conf"),以便 spark-shell 识别我的配置文件的位置(即spark-defaults.conf)。我正在使用 PuTTY SSH 到主服务器。

    为了澄清,一旦我将spark.jars jar1, jar2, jar3 添加到我的spark-defaults.conf 文件中,我输入以下内容以启动我的spark-shell 会话:

    cd $SPARK_HOME  //navigate to the spark home directory which contains the jars_added folder
    spark-shell
    

    在启动 spark-shell 然后从 jars_added 文件夹加载指定的 jar 文件

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2018-04-05
      • 2020-02-13
      • 2016-01-02
      • 2015-12-21
      相关资源
      最近更新 更多