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