我有CDH 5.7.0,带有spark 1.6.0和kafka 0.9.0,我需要运行一个Spark流式传输作业,它消耗来自另一个拥有0.8.2.2版本的集群中的kafka代理的消息。我创建了一个像:
的流val stream = KafkaUtils.createStream(ssc, Utils.settings.zookeeperQuorum, Utils.settings.kafkaGroup, Utils.settings.topicMapWifi)
在build.sbt中我添加:
libraryDependencies += "org.apache.spark" %% "spark-streaming-kafka" % "1.2.0"
使用该库,我将使用适合版本为0.8.2.x的代理的客户端。但问题是Spark正在从CDH claspath中加载大量的东西:
/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/spark/bin/spark-class
并且正在添加一个比我需要的更新版本的kafka客户端。有没有办法从代码中覆盖特定的库?
答案 0 :(得分:0)
您可以编辑位于Spark配置目录下的spark-env.sh(Cloudera上的/ etc / spark / conf)并更改
export SPARK_HOME=/opt/cloudera/parcels/CDH-5.5.1-1.cdh5.5.1.p0.11/lib/spark
指向您的Spark实例。 或者,您可以部署您的Spark版本并使用Cloudera的Hadoop配置(将spark-env.sh中的HADOOP_CONF_DIR设置为/ etc / hadoop / conf)。在这种情况下,如果您的应用程序在配置中设置
,您将能够看到应用程序历史记录spark.eventLog.dir=hdfs:/user/spark/applicationHistory
答案 1 :(得分:0)
使用--jar选项分发你的kafka 0.8.2.2 jar并在spark.conf中指定spark.driver.userClassPathFirst=true
和spark.executor.userClassPathFirst=true
,它将使用子类第一类加载器在CDH类路径之前加载你的jar。 / p>