【发布时间】:2016-10-17 09:44:22
【问题描述】:
我在 hive 中创建了一个包含 10 miliion 行的 hbase 视图,当我在查询下方运行时,distcp 被调用并抛出错误。
INSERT OVERWRITE DIRECTORY '/mapred/INPUT' select hive_cdper1.cid,hive_cdper1.emptyp,hive_cdper1.ethtyp,hive_cdper1.gdtyp,hive_cdseg.mrtl from hive_cdper1 join hive_cdseg on hive_cdper1.cnm=hive_cdseg.cnm;
输出:地图 100% 减少 100%
2016-10-17 15:05:34,688 INFO [main]: exec.Task (SessionState.java:printInfo(951)) - 将数据移动到:/mapred/INPUT 从 hdfs://mycluster/mapred/INPUT/.hive-staging_hive_2016-10-17_14-57-48_620_6609613978089243090-1/-ext-10000 2016-10-17 15:05:34,693 INFO [main]: common.FileUtils (FileUtils.java:copy(551)) - 源是 483335659 字节。 (最大:4000000) 2016-10-17 15:05:34,693 信息 [主要]:common.FileUtils (FileUtils.java:copy(552)) - 启动分布式复制 (distcp) 作业。 2016-10-17 15:05:34,695 错误 [main]: exec.Task (SessionState.java:printError(960)) - 失败并出现异常无法 移动源 hdfs://mycluster/mapred/INPUT/.hive-staging_hive_2016-10-17_14-57-48_620_6609613978089243090-1/-ext-10000 到目的地/mapred/INPUT org.apache.hadoop.hive.ql.metadata.HiveException:无法移动 来源 hdfs://mycluster/mapred/INPUT/.hive-staging_hive_2016-10-17_14-57-48_620_6609613978089243090-1/-ext-10000 到目的地/mapred/INPUT 在 org.apache.hadoop.hive.ql.metadata.Hive.moveFile(Hive.java:2644) 在 org.apache.hadoop.hive.ql.exec.MoveTask.moveFile(MoveTask.java:105) 在 org.apache.hadoop.hive.ql.exec.MoveTask.execute(MoveTask.java:222) 在 org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:160) 在 org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:88) 在 org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1653) 在 org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1412) 在 org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1195) 在 org.apache.hadoop.hive.ql.Driver.run(Driver.java:1059) 在 org.apache.hadoop.hive.ql.Driver.run(Driver.java:1049) 在 org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:213) 在 org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:165) 在 org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:376) 在 org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:736) 在 org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:681) 在 org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.hadoop.util.RunJar.run(RunJar.java:221) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:136) 引起:java.io.IOException:无法获取 DistCp 构造函数: org.apache.hadoop.tools.DistCp.() 在 org.apache.hadoop.hive.shims.Hadoop23Shims.runDistCp(Hadoop23Shims.java:1160) 在 org.apache.hadoop.hive.common.FileUtils.copy(FileUtils.java:553) 在 org.apache.hadoop.hive.ql.metadata.Hive.moveFile(Hive.java:2622) ... 21 更多
我想知道的是:我正在写入同一个集群,那么为什么它调用 distcp 而不是普通的 cp。
这里我使用 hive 1.2.1 和 hadoop 2.7.2,我的集群名称是 mycluster。
注意:我尝试设置hive.exec.copyfile.maxsize=4000000,但没有成功。
感谢您的建议..
【问题讨论】:
-
你能用“INSERT OVERWRITE LOCAL DIRECTORY”目录选项尝试相同的查询吗?我还有其他命令可以从 hive 表中以 csv 格式提取数据。
-
是的,在本地工作正常,但在 hdfs 中不行。在 hdfs 中是不可能的还是设置有任何问题。