Apache spark Cloudera Hadoop 2.6.0-cdh5.14.2和结构化流媒体

Apache spark Cloudera Hadoop 2.6.0-cdh5.14.2和结构化流媒体,apache-spark,cloudera,spark-structured-streaming,Apache Spark,Cloudera,Spark Structured Streaming,是否有人能够在Hadoop 2.6.0-cdh5.14.2上使用外部库(主要是spark sql-*)启动结构化流媒体 更新 最重要的是:我上一篇博文中的信息缺失:Spark的版本是2.3.0 根据我远方的朋友的建议,我这样做了: 我从python迁移到Scala(Scala得到了更好的支持,它是本机Spark语言) 我使用卡夫卡以外的其他来源运行结构化流媒体 我使用了一个简单的csv作为源: $ export SPARK_KAFKA_VERSION=0.10 $ spark2-shell

是否有人能够在Hadoop 2.6.0-cdh5.14.2上使用外部库(主要是spark sql-*)启动结构化流媒体

更新

最重要的是:我上一篇博文中的信息缺失:Spark的版本是2.3.0

根据我远方的朋友的建议,我这样做了:

  • 我从python迁移到Scala(Scala得到了更好的支持,它是本机Spark语言)
  • 我使用卡夫卡以外的其他来源运行结构化流媒体
  • 我使用了一个简单的csv作为源:

    $ export SPARK_KAFKA_VERSION=0.10
    $ spark2-shell 
    
    scala> import org.apache.spark.sql.Encoders
    scala> case class Amazon(EventId:String, DOCOMOEntitlementId:String, AmazonSubscriptionId:String, AmazonPlanId:String, DOCOMOUserId:String, MerchantAccountKey:String, ResellerKey:String, Status:String, CreatedDate:String, EndDate:String, ActivatedDate:String, FailedDate:String, ExpiryDate:String, LastUpdated:String, dateTimeStart:String, dateTimeEnd:String, referrerSource:String, reasonCode:String)
    scala> val schema = Encoders.product[Amazon].schema
    scala> val data = spark.readStream.schema(schema).csv("/user/ale/csv.csv").as[Amazon]
    
    scala> data.isStreaming 
    res0: Boolean = true
    
    scala> val ss = data.writeStream.outputMode("append").format("console")
    scala> ss.start()
    
    这段代码神奇地工作了

    Cloudera声称他们不支持结构化流媒体,根据这一点,我刚刚更改源代码的以下代码失败了:

    val data =spark.readStream.format("kafka")... 
    
    提出这一例外:

    java.lang.ClassNotFoundException: Failed to find data source: kafka. Please find packages at http://spark.apache.org/third-party-projects.html
      at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:635)
      at org.apache.spark.sql.streaming.DataStreamReader.load(DataStreamReader.scala:159)
      ... 49 elided
    Caused by: java.lang.ClassNotFoundException: kafka.DefaultSource
      at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:62)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
      at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23$$anonfun$apply$15.apply(DataSource.scala:618)
      at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23$$anonfun$apply$15.apply(DataSource.scala:618)
      at scala.util.Try$.apply(Try.scala:192)
      at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23.apply(DataSource.scala:618)
      at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23.apply(DataSource.scala:618)
      at scala.util.Try.orElse(Try.scala:84)
      at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:618)
      ... 50 more
    
    我只使用提供的Cloudera库(没有外部JAR)。请注意

         $ export SPARK_KAFKA_VERSION=0.10
    
    这用于强制使用0.10版本(spark streaming kafka-…),因为集群上也存在0.8版本。但是没有卡夫卡罐子

    现在的问题是,我缺少正确的库(jar)。Spark 2.3.0看起来很健康,尽管Cloudera网站上有所有警告

    所以。。。是否有一个“非正式官方Cloudera Jar”来解决这个问题?有人找到一个好的Jar来部署解决这个问题的代码吗?来自cloudera的Jar选项更好:内部策略拒绝将第三方Jar与代码捆绑在一起


    另一个选项是使用directStreaming重新实现所有结构化流媒体。这是我喜欢避免的工作。

    我想这就是我问题的答案:

  • Cloudera的图书馆确实存在,而且确实存在
  • 如果卡夫卡受到监视,它就不会起作用。禁用它
  • 遗憾的是,代码需要为每个查询创建新的group.id

     18/11/15 10:51:25 WARN kafka010.KafkaOffsetReader: Error in attempt 1 getting Kafka offsets: org.apache.kafka.common.errors.GroupAuthorizationException: Not authorized to access group: spark-kafka-source-707ab780-c71c-408b-80dd-be1960a03dd6-360506181-driver-0
     18/11/15 10:51:27 WARN kafka010.KafkaOffsetReader: Error in attempt 2 getting Kafka offsets: org.apache.kafka.common.errors.GroupAuthorizationException: Not authorized to access group: spark-kafka-source-707ab780-c71c-408b-80dd-be1960a03dd6-360506181-driver-1
     18/11/15 10:51:28 WARN kafka010.KafkaOffsetReader: Error in attempt 3 getting Kafka offsets: org.apache.kafka.common.errors.GroupAuthorizationException: Not authorized to access group: spark-kafka-source-707ab780-c71c-408b-80dd-be1960a03dd6-360506181-driver-2
     18/11/15 10:51:29 ERROR streaming.MicroBatchExecution: Query [id = 099e897f-2a44-4a50-bc57-46f898e05174, runId = b010d8d8-7b73-4f71-8ca5-f3eda47149c6] terminated
    
    哨兵不允许这些人访问数据。由于它是在KafkaSourceProvider.scala中编码的,因此没有避免它的选项


    希望这能节省其他人的时间。

    如果你有集群的管理员权限,没有什么能阻止你安装最新版本的Spark来运行结构化流媒体(事实上,你甚至不需要“安装”Spark,只需将其设置为提交任务)我用更有用的信息更新了问题,spark已经有了正确的版本,最后的问题是jars/cloudera策略。