Sqoop-2在使用sqoop shell进行自定义查询的大型导入到单个节点时失败

时间:2016-02-12 17:39:20

标签: hadoop jdbc hdfs sqoop

我正在对由计算成本高昂的自定义查询生成的大型记录集的迁移进行原型设计。此查询大约需要1-2小时才能在SQL Developer

中返回结果集

我正在尝试将此查询传递给一个简单的Sqoop作业,其中包含JDBCHDFS的链接

我在日志中遇到以下错误:

  

2016-02-12 10:15:50,690 ERROR mr.SqoopOutputFormatLoadExecutor [org.apache.sqoop.job.mr.SqoopOutputFormatLoadExecutor $ ConsumerThread.run(SqoopOutputFormatLoadExecutor.java:257)]从MR作业加载数据时出错。   org.apache.sqoop.common.SqoopException:GENERIC_HDFS_CONNECTOR_0005:加载程序运行期间发生错误       在org.apache.sqoop.connector.hdfs.HdfsLoader.load(HdfsLoader.java:110)       在org.apache.sqoop.connector.hdfs.HdfsLoader.load(HdfsLoader.java:41)       在org.apache.sqoop.job.mr.SqoopOutputFormatLoadExecutor $ ConsumerThread.run(SqoopOutputFormatLoadExecutor.java:250)       at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)       at java.util.concurrent.FutureTask.run(FutureTask.java:266)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)       在java.lang.Thread.run(Thread.java:745)   引起:org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException):/user/username/schema/recordset/.72dee005-3f75-4a95-bbc0-30c6b565d193上没有租约/f5aeeecc-097e-49ab-99cc-b5032ae18a84.txt(intode 16415):文件不存在。 [租。持有人:DFSClient_NONMAPREDUCE_-1820866823_31,pendingcreates:1]

当我尝试检查.txt中生成的hdfs个文件时,它们是空的。

有没有人遇到并解决了这个问题?另外,我注意到Sqoop shell的额外烦恼。例如,我无法检查作业状态,因为它总是返回UNKNOWN。

我正在使用sqoop-1.99.6-bin-hadoop200 Hadoop 2.7.2 (Homebrew install)。我正在使用Oracle 11查询远程Generic JDBC Connector数据库。

我已使用schema/table

中的create job参数执行了较小的导入作业

我很想按表迁移整个架构表,然后只使用Hive生成并存储我想要的记录集。这会是一个更好/更容易的解决方案吗?

1 个答案:

答案 0 :(得分:1)

  

org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException

     

此查询大约需要1-2小时才能在SQL中返回结果集   显影剂

我敢打赌,Sqoop 1.99会创建一个空的HDFS文件(即NameNode获取请求,创建文件但尚未为其他客户端实现该文件,为Sqoop授予独占写入租约,并分配责任将块#1写入随机DataNode)然后等待JDBC ResultSet生成一些数据......同时不进行任何keep-alive。

但是,唉, 60分钟后,NameNode只看到租约已过期而没有任何Sqoop客户端处于活着状态的迹象,所以它会关闭文件 - 或者更确切地说,就像它一样从未创建(没有发生过冲洗)。

你有可能通过Oracle方面的/*+ FIRST_ROWS */提示减少时间间隔吗?