SparkStreaming踩坑之各种异常的处理方法

1.运行时异常:找不到类,例如org.antlr.v4.runtime.xxx

【原因】

antlr是Spark依赖的开源语法解析器,其jar默认情况下并未加入classpath,因此运行时刻会找不到对应的类;

另外还有janino,开源java编译器。

【对策】

方法1:将antlr等组件的jar加入系统classpath

方法2:POM文件引入对应jar依赖,随微服务一起打包发布

POM文件sample:

    org.antlr

    antlr4-runtime

    4.5.3

    org.codehaus.janino

    janino

    3.0.8

2.运行时异常:task not serializable

【原因】

算子(如foreachRDD)内的代码块,spark会将其中访问到的对象序列化后发送给各计算节点,如果对象无法序列化,则抛出异常

【对策】

1)算子内访问的所有对象实现Serializable接口,确保能正常序列化(包括对象的所有成员,@transient标注的除外)

2)如果某个对象中一些成员不支持序列化,又希望在算子中访问其中的数据,可将一些必要的信息序列化为JSON字符串后传入算子,在算子内部进行反序列化

3.编译错误:Java的.class操作在Scala中抛出语法错误

【原因】

.class操作不符合Scala语法

【对策】

采用Scala的classOf[xxx]操作获取类的class。例如classOf[MyJavaBean]

4.编译错误:fastjson的JSON.toJSONString一参方法抛出语法错误

【原因】

JSON.toJSONString的二参方法第二参数为可变参数。

Java编译器在处理一参调用时,默认定位一参方法,忽略二参方法;Scala编译器在处理一参调用时,认为一参方法和二参带可变参数的方法两者都匹配,直接抛出异常,拒绝编译。

【对策】

Scala中调用JSON.toJSONString时,显式指定二参方法,其中第二参数可传入fastjson的任意默认值。例如:

JSON.toJSONString(obj, SerializerFeature.QuoteFieldNames)

5.运行时异常:codehaus反序列化Collection失败

【原因】

codehaus是Spark依赖的JSON序列化、反序列化组件,它不支持Java的Collection类型

【对策】

Collection改为codehaus支持的java.util.List类型

6.打包编译时异常:xxx.java:[21,55] 程序包xxx.yyy.scala不存在

【原因】

maven默认的编译插件maven-compiler-plugin不会构建scala代码。如果java代码中引用到scala代码,就会抛出此异常。

【对策】

打包命令改为以下命令,确保在maven-compiler-plugin执行之前,先构建scala代码,生成对应的class文件。

mvn clean scala:compile package

你可能感兴趣的:(大数据)