我们正在使用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
但是它不起作用,任何人都可以提供正确语法的详细信息
答案 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 可以通过两种方式提供。
文件: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文件