版本如下
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
部署客戶端配置完,再次提交沒問題了