【问题标题】:Why does loading Cobol Copybook file fail with "ClassNotFoundException: java.time.temporal.TemporalAccessor"?为什么加载 Cobol Copybook 文件失败并显示“ClassNotFoundException:java.time.temporal.TemporalAccessor”?
【发布时间】:2019-01-02 12:56:08
【问题描述】:

我有以下 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)

它的源文件copybook文件在(cobrix-master\cobrix-master\examples\example_data)

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

按照我到目前为止所遵循的步骤并出错。

我需要 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 桌面文件夹 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 Reader 功能。 所以我做到了

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 程序

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    似乎缺少一些依赖项或 spark 提交,不包括您通过 --jars 传递的 jars。

    你可以在 spark lib 中移动这些 jars 后尝试吗

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 2014-10-12
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      相关资源
      最近更新 更多