版本如下
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
部署客户端配置完,再次提交没问题了