作业无法从一个 ORC 文件读取并将子集写入另一个

Posted

技术标签:

【中文标题】作业无法从一个 ORC 文件读取并将子集写入另一个【英文标题】:Job fails to read from one ORC file and write a subset to another 【发布时间】:2015-08-25 06:38:30 【问题描述】:

在 HDP 2.3 for Windows 中的 Apache Pig 交互式 shell 中工作,我在 /path/to/file 中有一个现有的 ORC 文件。如果我加载然后保存使用:

a = LOAD '/path/to/file' USING OrcStorage('');
STORE a INTO '/path/to/second_file' USING OrcStorage('');

然后一切正常。但是,如果我尝试:

a = LOAD '/path/to/file' USING OrcStorage('');
b = LIMIT a 10;
STORE b INTO '/path/to/third_file' USING OrcStorage('');

然后我在第二个作业的日志中得到以下错误回溯(在它计划的两个中):

2015-08-25 16:03:42,161 FATAL [main] org.apache.hadoop.mapreduce.v2.app.MRAppMaster: Error starting MRAppMaster
java.lang.NoClassDefFoundError: org/apache/hadoop/hive/ql/io/orc/OrcNewOutputFormat
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.pig.impl.PigContext.resolveClassName(PigContext.java:657)
    at org.apache.pig.impl.PigContext.instantiateFuncFromSpec(PigContext.java:726)
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POStore.getStoreFunc(POStore.java:251)
    at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigOutputCommitter.getCommitters(PigOutputCommitter.java:88)
    at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigOutputCommitter.<init>(PigOutputCommitter.java:71)
    at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigOutputFormat.getOutputCommitter(PigOutputFormat.java:289)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$1.call(MRAppMaster.java:476)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$1.call(MRAppMaster.java:458)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.callWithJobClassLoader(MRAppMaster.java:1560)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.createOutputCommitter(MRAppMaster.java:458)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.serviceInit(MRAppMaster.java:377)
    at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$4.run(MRAppMaster.java:1518)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.initAndStartAppMaster(MRAppMaster.java:1515)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.main(MRAppMaster.java:1448)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.ql.io.orc.OrcNewOutputFormat
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

我怀疑这两个作业的类路径不同,导致 ClassNotFound。有可能是这种情况吗?如果是这样,我该如何解决? (奖励问题:为什么会这样?)

【问题讨论】:

【参考方案1】:

检查 OrcStorage 的依赖库是否放置在所有节点中。

第一个选项只生成单个作业 第二个选项将生成多个作业,这些作业可能在不同的机器上运行 它的类路径中没有依赖库。

【讨论】:

目前我只使用一个节点 - 第二个作业是否有可能被不同地调用? (即,在类路径中没有那个 JAR?) 我发现的另一个奇怪的事情是STORE b '/path/to/third_file' USING OrcStorage(''); 而不是STORE b INTO '/path/to/third_file' USING OrcStorage(''); 哦,对了,这是我在取出我在这个例子中使用的实际路径时犯了一个错误。现已修复。

以上是关于作业无法从一个 ORC 文件读取并将子集写入另一个的主要内容,如果未能解决你的问题,请参考以下文章

从 zip 文件中读取文件并将其写入另一个文件时面临的问题

如何在 C++ 上读取文件、反转部分文本并将反转的部分写入另一个文件?

如何在写入hive orc表时合并spark中的小文件

如何将 BIM 360 文件的内容作为文件流读取并将其写入另一个流

无法为大型数据集运行 Spark 作业

写入 WAV 文件 C++