[英]ClassPath issue with Spark2 Streaming on Yarn
在纱线客户端模式下使用Kafka 0.10运行Spark Streaming作业时遇到一些类路径问题:
java.lang.ClassNotFoundException: org.apache.spark.streaming.kafka010.KafkaRDDPartition
我已经阅读了(很好解释)问题, 将罐子添加到Spark Job和Spark Kafka Streaming问题中 ,但是我仍然很困惑...
我的项目是由Maven管理的Java Spring Boot,其中包括用于Spark东西的scala部分。 使用Maven Shade插件创建一个uber jar,并且其中包含缺少类的spark-streaming-kafka-0.10_2.11依赖项。
在本地模式下执行spark应用程序按预期工作。 但是,我想从执行者的类路径中以纱线客户端模式执行它,缺少KafkaRDDPartition。
我试图将extraClassPath属性添加到我的SparkConf中,但是它没有任何改变(不要因为硬编码路径而对我不利,这只是一个测试)
val conf: SparkConf = new SparkConf()
conf.set("spark.streaming.concurrentJobs", "2")
conf.set("spark.executor.extraClassPath",sparkHome + "/kafka-0.10")
conf.setAppName(classOf[KafkaSubscriber].getSimpleName)
conf.setMaster(sparkMaster)
conf.setSparkHome(sparkHome)
在创建SparkStreamingContext之前将罐子添加到Spark Context中也没有任何改变
val folder: File = new File(sparkHome + "/kafka-0.10");
if (folder.exists && folder.isDirectory) {
for (f <- folder.listFiles.filter(_.isFile).toSeq) {
spark.sparkContext.addJar(f.getAbsolutePath);
}
}
我使用的Cloudera平台已在整个集群中部署并激活了Spark2包裹,并且默认情况下,将Spark2服务配置为使用Kafka 0.10。
另一个重要的事情,因为它是Spring Boot应用程序,所以我没有通过spark-submit执行我的spark应用程序,而是执行了
java -Dloader.path=file:///etc/hadoop/conf,myApp.jar -jar myApp.jar
我想念什么?
Spark代码是这样的
class KafkaSubscriber(sparkMaster: String, duration: Duration, topicSession: String, brokers: String) {
val sparkHome: String = "/opt/cloudera/parcels/SPARK2/lib/spark"
// Create Spark Conf
val conf: SparkConf = new SparkConf()
conf.set("spark.streaming.concurrentJobs", "2")
conf.set("spark.executor.extraClassPath",sparkHome + "/kafka-0.10")
conf.setAppName(classOf[KafkaSubscriber].getSimpleName)
conf.setMaster(sparkMaster)
conf.setSparkHome(sparkHome)
// Create Spark Session
// **********
val spark: SparkSession = SparkSession.builder()
.appName(classOf[KafkaSubscriber].getSimpleName)
.master(sparkMaster)
.config(conf)
.getOrCreate()
// Set the Kafka dependencies
val folder: File = new File(sparkHome + "/kafka-0.10");
if (folder.exists && folder.isDirectory) {
for (f <- folder.listFiles.filter(_.isFile).toSeq) {
spark.sparkContext.addJar(f.getAbsolutePath);
}
}
// Create Spark Streaming Context
// **********
val ssc: StreamingContext = StreamingContext.getActiveOrCreate(() => new StreamingContext(spark.sparkContext, duration))
def subscribe {
// Some code here ...
// Subscribe to Kafka
// **********
val topicSetSession: Array[String] = topicSession.split(",")
val kafkaParams = Map[String, Object](
"bootstrap.servers" -> brokers,
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"group.id" -> "KafkaSubscriber",
"auto.offset.reset" -> "latest",
"enable.auto.commit" -> (false: java.lang.Boolean))
// Get Session Stream
val rawSessionStream = KafkaUtils.createDirectStream[String, String](ssc, PreferConsistent, Subscribe[String, String](topicSetSession, kafkaParams))
// Some code here ...
}
/**
* Start the Spark ETL
*/
def startEtl {
// Start the Spark Streaming batch
ssc.start()
ssc.awaitTermination()
}
/**
* Close the spark session
*/
def close {
ssc.stop(true)
spark.close
}
和Java部分来调用Spark代码
@Component
@Scope("singleton")
public class KafkaStreaming implements InitializingBean {
@Autowired
private KafkaSubscriber kafkaSubscriber;
@Override
public void afterPropertiesSet() throws Exception {
// Get and store the HbbTV Config
kafkaSubscriber.subscribe();
// Start Spark
kafkaSubscriber.startEtl();
}
}
谢谢你的帮助!
好吧,我的问题是针对Kafka Integration的Cloudera Manager配置错误。 默认情况下,选择的是Kafka 0.9,包括将kafka 0.9 jar放入类路径而不是kafka 0.10。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.