spark消費kafka問題記錄(cdh5.16.2)

 

版本如下

kafka和spark都安裝完成後,執行spark2-shell竟然報錯

Error: A JNI error has occurred, please check your installation and try again

網上搜大概是jdk版本的問題,添加環境變量可以解決

export SPARK_DIST_CLASSPATH=$(hadoop classpath)

命令行臨時添加,試了試發現確實可以

 

7180改了spark配置,然後部署客戶端配置,發現除了spark,別的服務都沒問題

僅完成 0/3 個步驟。首個失敗:主機 hadoop57 (id=5) 上的客戶端配置 (id=46) 已使用 1 退出,而預期值爲 0。

然後看stdout和stderr

也就是說spark沒找到java,java明明配了環境變量

網上搜需要將jdk軟鏈接到/usr/java/default(所有spark gateway節點執行)

ln -s /home/cdh/java/jdk1.8.0_221 /usr/java/default

看來spark只在固定路徑去找jdk

再次部署客戶端,發現沒有問題

然後無需export SPARK_DIST_CLASSPATH=$(hadoop classpath)導入環境變量

發現spark2-shell也沒報錯

 

再說spark消費kafka的問題

我的依賴是這樣的

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka-0-10 -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
    <version>2.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming_2.11</artifactId>
    <version>2.3.0</version>
</dependency>

bulid是這樣的

<build>
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <plugins>
        <plugin>
            <groupId>org.scala-tools</groupId>
            <artifactId>maven-scala-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <scalaVersion>2.11.3</scalaVersion>
                <args>
                    <arg>-target:jvm-1.8</arg>
                </args>
            </configuration>
        </plugin>
     </plugins>
</build>

然後打包,包只有幾十k,提交集羣

spark2-submit --master local --class com.spark.xxx  xxx.jar

發現缺包,然後缺什麼把具體包放倒../java/jdk/jre/lib/ext/下最後發現缺

org/apache/spark/internal/Logging,這個問題是之前困擾我好久好久的問題

 

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/kafka010/KafkaUtils$

 

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/internal/Logging

 

當然這樣處理本身是沒什麼問題的,比如maven項目有的包不是通過依賴管理的,而是手動添加到libraies,打包的時候是不會打到依賴包裏的,手動放過去,也可以解決,比如數據庫的驅動包,fastjson等

決定修改maven依賴把所有依賴包打成一個依賴包

在plugins添加2個plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4.1</version>
    <configuration>
        <!-- get all project dependencies -->
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <!-- MainClass in mainfest make a executable jar -->
        <archive>
            <manifest>
                <!-- 這是我的主類-->
                <mainClass>com.spark.Kafka_Demo</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <!-- bind to the packaging phase -->
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>6</source>
        <target>6</target>
    </configuration>
</plugin>

然後再次打包,會打出來2個包

 

 

一個比較大的依賴包

然後再次提交

spark2-submit --master local --class com.spark.xxx --jars xxx-jar-with-dependencies.jar xxx.jar

又報錯

Exception in thread "streaming-start" java.lang.NoSuchMethodError: org.apache.kafka.clients.consumer.KafkaConsumer.subscribe(Ljava/util/Collection;)V

網上搜說添加環境變量

export SPARK_KAFKA_VERSION=0.10

臨時執行了下,發現確實可以,後來在7180把spark的配置改成0.10

部署客戶端配置完,再次提交沒問題了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章