【问题标题】:Hive INSERT OVERWRITE query not writing to hdfs directory:Cannot get DistCp constructorHive INSERT OVERWRITE 查询未写入 hdfs 目录:无法获取 DistCp 构造函数
【发布时间】: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 中是不可能的还是设置有任何问题。

标签: hive hbase hadoop2


【解决方案1】:

1) 检查目标路径 /mapred/INPUT 的权限

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

【讨论】:

    【解决方案2】:

    在 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 2019-04-03
      • 2017-11-02
      相关资源
      最近更新 更多