Spark Shell使用spark-defaults.conf将多个驱动程序/容器添加到Classpath

时间:2019-09-10 01:04:59

标签: scala apache-spark properties classpath

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

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

喜欢

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

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

2 个答案:

答案 0 :(得分: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 可以通过两种方式提供。

  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

答案 1 :(得分:0)

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

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文件(对我来说这样做似乎也减少了将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文件