为什么加载Cobol Copybook文件失败并显示“ ClassNotFoundException:java.time.temporal.TemporalAccessor”?

时间:2019-01-02 12:56:09

标签: apache-spark apache-spark-sql cobol copybook

我有以下Spark程序,我正在尝试运行该程序,目的是将copybok文件转换为Parquet文件。(Cobrix https://github.com/AbsaOSS/cobrix的程序链接)中,我只是在尝试运行一个名为CobolCopybookExample1的文件.scala(this is inside cobrix-master\cobrix-master\spark-cobol\src\main\scala\za\co\absa\cobrix\spark\cobol\examples)

其源文件抄写本文件位于(cobrix-master \ cobrix-master \ examples \ example_data)

我们知道,Spark不提供内置库用于Copybook数据转换。因此,有一个名为Cobrix的开源库,该库已通过Apache Spark Foundation认证,这就是我在程序中使用的库。

按照我到目前为止已执行的步骤,出现了错误。

我需要4个必备的jar文件

spark-cobol-0.3.0.jar
cobol-parser-0.3.0.jar
scodec-core_2.11-1.10.3.jar
scodec-bits_2.11-1.1.4.jar

1)。我下载了这些jar,并将其保存在我的VM Desktop Folder Cobol中

2)。我从jar位置使用以下命令启动了spark-shell。它成功启动了。

spark-shell --master yarn --deploy-mode client --driver-cores 4 --driver-memory 4G --jars spark-cobol-0.3.0.jar,cobol-parser-0.3.0.jar,scodec-core_2.11-1.10.3.jar,scodec-bits_2.11-1.1.4.jar

3)现在,我需要导入2个库,然后才能启动我的spark阅读器功能。 所以我做了

import org.apache.spark.sql.{SaveMode, SparkSession}
import za.co.absa.cobrix.spark.cobol.utils.SparkUtils

4)现在,我必须启动我的spark DF并收到我在此电子邮件中提到的错误。在我看来,这是一个环境错误,但我想就此提出您的建议。我正在努力解决这些问题。

val df = spark.read
.format("za.co.absa.cobrix.spark.cobol.source")
.option("copybook", "file:///home/bigdata/Desktop/Cobol/example_data/raw_file.cob")
.load("file:///home/bigdata/Desktop/Cobol/example_data/raw_data")

之后,我收到此错误

java.lang.NoClassDefFoundError: java/time/temporal/TemporalAccessor
  at za.co.absa.cobrix.spark.cobol.reader.fixedlen.FixedLenNestedReader.loadCopyBook(FixedLenNestedReader.scala:76)
  at za.co.absa.cobrix.spark.cobol.reader.fixedlen.FixedLenNestedReader.<init>(FixedLenNestedReader.scala:42)
  at za.co.absa.cobrix.spark.cobol.source.DefaultSource.createFixedLengthReader(DefaultSource.scala:83)
  at za.co.absa.cobrix.spark.cobol.source.DefaultSource.buildEitherReader(DefaultSource.scala:70)
  at za.co.absa.cobrix.spark.cobol.source.DefaultSource.createRelation(DefaultSource.scala:54)
  at za.co.absa.cobrix.spark.cobol.source.DefaultSource.createRelation(DefaultSource.scala:45)
  at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:330)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:135)
  ... 50 elided
Caused by: java.lang.ClassNotFoundException: java.time.temporal.TemporalAccessor
  at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
  ... 59 more

我还将附加我的Scala程序

2 个答案:

答案 0 :(得分:1)

您是否可以尝试使用SBT或Maven重建Scala项目,here是一篇有趣的文章。您需要一个Fat JAR(借助此工具,您将不需要--jars中的spark submit)。该错误似乎是因为其中一个JARS具有另一个JAR的依赖关系。例如,检查Cobol Parser是否需要一些编译依赖项才能正常工作。

enter image description here

答案 1 :(得分:0)

似乎缺少某些依赖项或未提交火花,不包括您通过--jars传递的jar。

在将这些罐子移到spark lib中后,您可以尝试