当前位置: 首页 > 知识库问答 >
问题:

与Docker合作的Spark集群:BlockManagerId;本地类不兼容

葛言
2023-03-14

在使用Spark和Docker分发操作时,我遇到了类型不匹配的问题。我遵循的教程似乎很清楚。下面是我对Scala代码的尝试:

package test

import com.datastax.spark.connector.cql.CassandraConnector
import org.apache.spark.{SparkConf, SparkContext}
import readhub.sharedkernel.config.Settings

object Application extends App {
    import com.datastax.spark.connector._


    val conf = new SparkConf(true)
      .setAppName("Coordinator")
      .setMaster("spark://localhost:7077")
      .set("spark.cassandra.connection.host", "valid host")

    val sc = new SparkContext(conf)

    CassandraConnector(conf).withSessionDo { session =>
      session.execute("CREATE KEYSPACE test2 WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1 }")
      session.execute("CREATE TABLE test2.words (word text PRIMARY KEY, count int)")
      session.execute("INSERT INTO test2.words(word, count) VALUES('hey', 32)")

      sc.cassandraTable("test2", "words")
        .map(r => r.getString("word"))
        .foreach(process)

    }

  def process(word: String): Unit = {
    // Dummy processing
    println(word)
  }
} 

build.sbt是这样的:

import sbt.project

val sparkSql = "org.apache.spark" %% "spark-sql" % "2.3.0" % "provided"
val sparkCassandraConnector = "com.datastax.spark" %% "spark-cassandra-connector" % "2.3.0" % "provided"

lazy val commonSettings = Seq(
  version := "0.1",
  scalaVersion := "2.11.12",
  organization := "ch.heig-vd"
)

lazy val root = (project in file("."))
  .settings(
    commonSettings,
    name := "Root"
  )
  .aggregate(
    coordinator
  )

lazy val coordinator = project
  .settings(
    commonSettings,
    name := "Coordinator",
    libraryDependencies ++= Seq(
      sparkSql,
      sparkCassandraConnector
    )
  )

Dockerfile取自此图,并稍加修改,以使用Spark的2.3.0版:

FROM phusion/baseimage:0.9.22

ENV SPARK_VERSION 2.3.0
ENV SPARK_INSTALL /usr/local
ENV SPARK_HOME $SPARK_INSTALL/spark
ENV SPARK_ROLE master
ENV HADOOP_VERSION 2.7
ENV SPARK_MASTER_PORT 7077
ENV PYSPARK_PYTHON python3
ENV DOCKERIZE_VERSION v0.2.0

RUN apt-get update && \
    apt-get install -y openjdk-8-jdk autossh python3-pip && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

##### INSTALL DOCKERIZE
RUN curl -L -O https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && \
    tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && \
    rm -rf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

##### INSTALL APACHE SPARK WITH HDFS
RUN curl -s http://mirror.synyx.de/apache/spark/spark-$SPARK_VERSION/spark-$SPARK_VERSION-bin-hadoop$HADOOP_VERSION.tgz | tar -xz -C $SPARK_INSTALL && \
    cd $SPARK_INSTALL && ln -s spark-$SPARK_VERSION-bin-hadoop$HADOOP_VERSION spark

WORKDIR $SPARK_HOME

##### ADD Scripts
RUN mkdir /etc/service/spark
ADD runit/spark.sh /etc/service/spark/run
RUN chmod +x /etc/service/**/*

EXPOSE 4040 6066 7077 7078 8080 8081 8888

VOLUME ["$SPARK_HOME/logs"]

CMD ["/sbin/my_init"]

码头工人作曲。yml也很简单:

version: "3"

services:
  master:
    build: birgerk-apache-spark

    ports:
      - "7077:7077"
      - "8080:8080"

  slave:
    build: birgerk-apache-spark
    environment:
      - SPARK_ROLE=slave
      - SPARK_MASTER=master
    depends_on:
      - master

我将git repo克隆到文件夹Birgerk-apache-Spark中,只将Spark的版本更改为2.3.0。

最后,我用胶水粘合所有东西:

sbt coordinator/assembly

来制造脂肪罐

spark-submit --class test.Application --packages com.datastax.spark:spark-cassandra-connector_2.11:2.3.0 --master spark://localhost:7077 ReadHub\ Coordinator-assembly-0.1.jar

将jar提交到集群中。当我发出spark submit时出现错误:

错误TransportRequestHandler:199-在RPC id 7068633004064450609 java上调用RpcHandler#receive()时出错。木卫一。InvalidClassException:org。阿帕奇。火花存储BlockManagerId;本地类不兼容:java上的stream classdesc serialVersionUID=6155820641931972169,本地类serialVersionUID=-3720498261147521051。io。对象流类。java上的initNonProxy(ObjectStreamClass.java:687)。伊奥。ObjectInputStream。java上的readNonProxyDesc(ObjectInputStream.java:1876)。伊奥。ObjectInputStream。java上的readClassDesc(ObjectInputStream.java:1745)。伊奥。ObjectInputStream。java上的readOrdinaryObject(ObjectInputStream.java:2033)。伊奥。ObjectInputStream。java上的readObject0(ObjectInputStream.java:1567)。伊奥。ObjectInputStream。java上的defaultReadFields(ObjectInputStream.java:2278)。伊奥。ObjectInputStream。readSerialData(ObjectInputStream.java:2202)[…]

从我的角度来看,Dockerfile可以正确地下载相应版本的Spark,该版本可以在我的build.sbt.中作为依赖项找到

我肯定我错过了一些基本的东西。谁能给我指出正确的方向吗?

非常感谢!

共有1个答案

竺国兴
2023-03-14

spark 2.3.3和spark 2.3.0之间的版本不匹配。

小心不要提交作业与SPARK_HOME定义在您的主机上这可能会导致这种问题

 类似资料:
  • 我试图使用Cassandra Spark连接器将rdd与Cassandra表连接起来: 它在独立模式下工作,但当我在集群模式下执行时,我会得到以下错误: 会发生什么事?

  • 问题内容: 我创建客户端和服务器,然后在添加客户端类的序列化的目的,然后简单地刚走到客户在我的硬盘驱动器的文件夹,并将其粘贴到服务器correponding位置,都和分别。 它在我自己的笔记本电脑上运行良好,但是当我想在其他系统上继续工作时,当我打开项目文件夹并且客户端尝试连接到服务器后,出现以下错误: 到底是怎么回事?是因为我使用旧版本的IDE运行程序吗? 问题答案: 如果一个类未在代码中显式定

  • 我试图在本地mac中运行以下代码,其中运行有主从集群的spark集群 但是,在主控制台和

  • 正如标题所预期的,我在向docker上运行的spark集群提交spark作业时遇到了一些问题。 我在scala中写了一个非常简单的火花作业,订阅一个kafka服务器,安排一些数据,并将这些数据存储在一个elastichsearch数据库中。 如果我在我的开发环境(Windows/IntelliJ)中从Ide运行spark作业,那么一切都会完美工作。 然后(我一点也不喜欢java),我按照以下说明添

  • > 我在Linux机器上安装了Spark。版本为spark-1.6.2-bin-hadoop2.6.tgz. 然后使用。/sbin/start-all.sh启动Spark 我尝试在Eclipse中运行javaWordCount.java示例。但总是失败。有人能帮我吗? 例外情况如下:

  • 问题内容: 以下代码适用于Spark 1.5.2,但不适用于Spark 2.0.0。我正在使用Java 1.8。 我收到以下错误 我无法确定Spark API是否已更改或其他原因。请帮忙。谢谢。 问题答案: 在2.0中,返回而不是。试试这个: