作业无法从一个 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 文件读取并将子集写入另一个的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 上读取文件、反转部分文本并将反转的部分写入另一个文件?