Hive INSERT OVERWRITE查询不写入hdfs目录:无法获取DistCp构造函数

时间:2016-10-17 09:44:23

标签: hive hbase hadoop2

我在hive中创建了一个hbase视图,其中有10个miliion行,当我在查询下面运行时,会调用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字节。 (MAX:4000000)   2016-10-17 15:05:34,693 INFO [main]:common.FileUtils   (FileUtils.java:copy(552)) - 启动分布式副本(distcp)作业。   2016-10-17 15:05:34,695 ERROR [主要]: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)           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)           at 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。

这里我使用带有hadoop 2.7.2的hive 1.2.1,我的群集名称是mycluster。

注意:我已尝试设置hive.exec.copyfile.maxsize=4000000,但无效。

感谢您的建议..

2 个答案:

答案 0 :(得分:0)

1)检查目标路径/ mapred / INPUT

的权限

2)如果其他用户没有写入权限,则hadoop fs -chmod a+w /mapred/INPUT

答案 1 :(得分:0)

在hive-site.xml中设置以下属性解决了我的问题。

  <property>
<name>hive.exec.copyfile.maxsize</name>
<value>3355443200</value>
<description>Maximum file size (in Mb) that Hive uses to do single HDFS copies between directories.Distributed copies (distcp) will be used instead for bigger files so that copies can be done faster.</description>
</property>