无法在Docker上的Spark集群上提交Spark作业

时间:2019-02-27 10:59:05

标签: java scala docker apache-spark hadoop

就像标题所预期的那样,我在将Spark作业提交到在Docker上运行的Spark集群时遇到一些问题。

我在scala中编写了一个非常简单的spark作业,订阅kafka服务器来安排一些数据并将其存储在elastichsearch数据库中。 kafka和elasticsearch已在docker中运行。

如果我在开发环境(Windows / IntelliJ)中运行Ide的spark作业,一切都将完美运行。

然后(而且我根本不是Java人士),我按照以下说明添加了一个火花集群:https://github.com/big-data-europe/docker-spark

在查询仪表板时,集群看起来很健康。我创建了一个由主人和工人组成的集群。

现在,这是我用scala编写的工作:

import java.io.Serializable

import org.apache.commons.codec.StringDecoder
import org.apache.hadoop.fs.LocalFileSystem
import org.apache.hadoop.hdfs.DistributedFileSystem
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark
import org.apache.spark.SparkConf
import org.elasticsearch.spark._
import org.apache.spark.sql.SQLContext
import org.apache.spark.streaming.dstream.InputDStream
import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils}
import org.apache.spark.streaming.{Seconds, StreamingContext}

import scala.util.parsing.json.JSON

object KafkaConsumer {
  def main(args: Array[String]): Unit = {

    val sc = new SparkConf()
      .setMaster("local[*]")
      .setAppName("Elastic Search Indexer App")

    sc.set("es.index.auto.create", "true")

    val elasticResource = "iot/demo"
    val ssc = new StreamingContext(sc, Seconds(10))

    //ssc.checkpoint("./checkpoint")

    val kafkaParams = Map(
      "bootstrap.servers" -> "kafka:9092",
      "key.deserializer" -> classOf[StringDeserializer],
      "value.deserializer" -> classOf[StringDeserializer],
      "auto.offset.reset" -> "earliest",
      "group.id" -> "group0"
    )

    val topics = List("test")
    val stream = KafkaUtils.createDirectStream(
      ssc,
      PreferConsistent,
      ConsumerStrategies.Subscribe[String, String](topics.distinct, kafkaParams)
    )

    case class message(key: String, timestamp: Long, payload: Object)
    val rdds = stream.map(record => message(record.key, record.timestamp, record.value))

    val es_config: scala.collection.mutable.Map[String, String] =
      scala.collection.mutable.Map(
        "pushdown" -> "true",
        "es.nodes" -> "http://docker-host",
        "es.nodes.wan.only" -> "true",
        "es.resource" -> elasticResource,
        "es.ingest.pipeline" -> "iot-test-pipeline"
      )


    rdds.foreachRDD { rdd =>
      rdd.saveToEs(es_config)
      rdd.collect().foreach(println)
    }

    ssc.start()
    ssc.awaitTermination()
  }
}

要将其提交给集群,我做了:

  • 使用“ sbt-assembly”插件,我创建了一个具有所有依赖项的胖jar文件。
  • 在build.sbt中定义一个组装策略,以避免合并时出现重复数据删除错误。

然后提交:

  

./ spark-submit.cmd --class KafkaConsumer --master   spark:// docker-host:7077   /c/Users/shams/Documents/Appunti/iot-demo-app/spark-streaming/target/scala-2.11/   spark-streaming-assembly-1.0.jar

但是我有这个错误:

  

19/02/27 11:18:12 WARN NativeCodeLoader:无法加载本地hadoop   您平台的库...使用内建的Java类,其中   线程“主”中的适用异常java.io.IOException:否   方案的文件系统:C           在org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2660)           在org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)           在org.apache.hadoop.fs.FileSystem.access $ 200(FileSystem.java:94)           在org.apache.hadoop.fs.FileSystem $ Cache.getInternal(FileSystem.java:2703)           在org.apache.hadoop.fs.FileSystem $ Cache.get(FileSystem.java:2685)           在org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)           在org.apache.spark.util.Utils $ .getHadoopFileSystem(Utils.scala:1897)           在org.apache.spark.util.Utils $ .doFetchFile(Utils.scala:694)           在org.apache.spark.deploy.DependencyUtils $ .downloadFile(DependencyUtils.scala:135)           在org.apache.spark.deploy.SparkSubmit $$ anonfun $ doPrepareSubmitEnvironment $ 7.apply(SparkSubmit.scala:416)           在org.apache.spark.deploy.SparkSubmit $$ anonfun $ doPrepareSubmitEnvironment $ 7.apply(SparkSubmit.scala:416)           在scala.Option.map(Option.scala:146)           在org.apache.spark.deploy.SparkSubmit $ .doPrepareSubmitEnvironment(SparkSubmit.scala:415)           在org.apache.spark.deploy.SparkSubmit $ .prepareSubmitEnvironment(SparkSubmit.scala:250)           在org.apache.spark.deploy.SparkSubmit $ .submit(SparkSubmit.scala:171)           在org.apache.spark.deploy.SparkSubmit $ .main(SparkSubmit.scala:137)           在org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

经过一天的尝试,我仍未解决,而且我无法理解我的工作中想要访问某个卷的位置,就像错误所表明的那样

可以与警告消息相关吗? 然后,应该如何编辑脚本以避免该问题?

谢谢。

更新:

问题似乎与我的代码无关,因为我试图以相同的方式提交一个简单的hello world应用程序编译,但是我遇到了同样的问题。

1 个答案:

答案 0 :(得分:0)

经过多次尝试和研究,我得出的结论是,问题可能是我正在使用PC上的Windows版本的spark-submit提交作业。

我无法完全理解,但是现在,将文件直接移动到主节点和工作节点上,就可以从那里提交了文件。

容器上的第一份副本:

docker cp spark-streaming-assembly-1.0.jar 21b43cb2e698:/spark/bin

然后我执行(在/ spark / bin文件夹中)

./spark-submit --class KafkaConsumer --deploy-mode cluster --master spark://spark-master:7077 spark-streaming-assembly-1.0.jar

这是我目前发现的解决方法。