一.引言
使用 sparkSession 读文件时出现 java.lang.IllegalArgumentException: Illegal pattern component: XXX 报错,解决后又出现 java.io.InvalidClassException: org.apache.commons.lang3.time.FastDateFormat; local class incompatible: stream classdesc serialVersionUID = 2, local class serialVersionUID = 1 报错,下面整理下解决方案。
二.Illegal pattern component: XXX
1.问题描述
val spark = SparkSession .builder .config(conf) .getOrCreate() val df = spark.read .option("header", "false") .option("delimiter", "\t") .csv(input)
使用 SparkSession 读取 gz 文件时出现下述报错:
编辑
2.问题解决
上述异常栈定位到 org.apache.commons.lang3.time.FastDataFormat,看着是时间格式化的问题,但是我的小伙伴运行上述代码没有问题,很奇怪,看了网上大神们的解决方案,主要有以下两种:
val df = spark.read .option("timestampFormat", "yyyy/MM/dd HH:mm:ss ZZ") .option("header", "false") .option("delimiter", "\t") .csv(input)
或者是:
val df = spark.read .option("timestampFormat", "MM/dd/yyyy") .option("header", "false") .option("delimiter", "\t") .csv(input)
二者类似,主要是定义了上面 XXX 对应的 TimeFormat,楼主尝试了一下,两种 TimeFormat 的 option 都可以解决问题。
三.org.apache.commons.lang3.time.FastDateFormat; local class incompatible
1.问题描述
sqlContext.createDataFrame(rowRdd, TABLE_SCHEME) .write.mode(SaveMode.Overwrite) .option("timestampFormat", "MM/dd/yyyy") .format("parquet") .save(output + "/split" + i + ".parquet")
代码整体逻辑为读取文件并保存为 parquet,parquet 相关内容可以参考: Spark - 一文搞懂 parquet。添加 timestampFormat 后读取和上述保存代码运行正常,spark 任务状态为 SUCCESS,但是观察 yarn 日志发现有很多 Failed 的节点,影响任务执行效率:
编辑
观察节点日志发现均为如下报错:
编辑
可以看到 Failed 节点上的报错又是 commons.lang3.time.FastDateFormat,和上面 java.lang.IllegalArgumentException: Illegal pattern component: XXX 异常栈指向的是同一个类即 org.apache.commons.lang3.time.FastDateFormat 类。
2.问题解决
报错显示了两种不同的 serialVersionUID = 2 和 serialVersionUID = 1,很有可能是依赖冲突导致,所以首先遍历当前代码环境下有多少 commons.lang3.time.FastDateFormat,这里使用 IDEA 的查询功能:
编辑
DailyTool 为我自己的项目,所以主要查下面的项目:
commons.lang3-3.3.3.jar /time/FastDateFormat.class:
编辑
jasper/util/FastDateFormat:
编辑
hive-exec:0.13.1 FastDateFormat.class:
编辑
只有 Hive common.lang3 对应的 serialVersionUID = 1L,所以锁定目标为该 jar,去除该 jar 运行任务即可。
3.其他解决方案
如果有童鞋没有安装 IDEA 可以使用 mvn tree 定位 common.lang3 的位置:
mvn -Dverbose dependency:tree > mvnTree
编辑
cat + grep 可以大致看下有多少 jar 包内包含,通过 jar 包内的代码一次寻找即可:
cat ~/Desktop/mvnTree| grep commons.lang3
编辑
mvn-tree 的更多使用也可以参考:Java - java.lang.NoSuchMethodError: xxx 错误详解 。
四.总结
java.lang.IllegalArgumentException: Illegal pattern component: XXX 以及其对应的 FastDateFormat 带来的报错大致解决了,但是还没有搞懂为什么其他童鞋不配置这个 option 也可以正常运行,后面再去整理下环境相关的问题,找到了继续更新。