如何覆盖在CDH中运行spark的库

时间:2016-04-24 20:58:36

标签: apache-spark sbt apache-kafka cloudera

我有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客户端。有没有办法从代码中覆盖特定的库?

2 个答案:

答案 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=truespark.executor.userClassPathFirst=true,它将使用子类第一类加载器在CDH类路径之前加载你的jar。 / p>