【问题标题】:Sqoop incremental SemanticException No files matching hdfs://host/user/xyz/_sqoop/ error?Sqoop 增量 SemanticException 没有文件匹配 hdfs://host/user/xyz/_sqoop/ 错误?
【发布时间】:2018-04-27 17:43:47
【问题描述】:

我正在尝试创建一个已保存的 sqoop 作业(增量)并使用 sqoop 元存储作为存储库。 (出于安全原因,“xyz”是运行作业的 unix 用户,sample_table 用作参考)

sqoop job -Dhadoop.security.credential.provider.path=jceks://path/to/pwd \
--meta-connect "jdbc:hsqldb:file:/tmp/sqoop-meta.db;shutdown=true" \
--create sample_job --import -Dmapred.job.queue.name=realtime \
--connect jdbc:mysql://hostname/db?zeroDateTimeBehavior=convertToNull \
--driver com.mysql.jdbc.Driver \
--table SAMPLE_TABLE -m 1 \
--username tony \
--password-alias pwd \
--incremental lastmodified \
--check-column ts \
--last-value 2018-04-24 \
--target-dir /some/tmp/location/ \
--map-column-hive XYZ=tinyint \
--null-string '' \
--null-non-string ''

使用本地 sqoop 元存储,在执行存储的作业时也会使用它。

sqoop job --meta-connect "jdbc:hsqldb:file:/tmp/sqoop-meta.db;shutdown=true" -exec sample_job

Sqoop 运行良好,我可以看到数据被拉到 hdfs 位置。但是,最后得到这个错误。似乎无法在任何地方找到解决方法。尝试授予 _sqoop 目录的完全权限,但问题仍然相同。

    Logging initialized using configuration in jar:file:/usr/hdp/2.6.4.0-91/hive/lib/hive-common-1.2.1000.2.6.4.0-91.jar!/hive-log4j.properties
    OK
    Time taken: 3.028 seconds
    FAILED: SemanticException Line 2:17 Invalid path ''hdfs://hostname/user/xyz/_sqoop/ad240610c282442cb65b61b14f582935_sample_table'': No files matching path hdfs://vBAPUAT01nn/user/xyz/_sqoop/ad240610c282442cb65b61b14f582935_sample_table

但上述文件不在 _sqoop 位置。相反,每次我运行 sqoop 操作时,都会看到创建的新的不同名称的文件。 /sqoop/

$ hadoop fs -ls /user/pcjaapp/_sqoop/
drwxrwxrwx   - xyz hdfs          0 2018-04-26 16:31 /user/xyz/_sqoop/1ab0f2de2ace4984b7b978af5f8f8336_sample_table
drwxr-xr-x   - xyz hdfs          0 2018-04-27 10:50 /user/xyz/_sqoop/3aedb9fc0857433f8388ae2c70019d93_sample_table
drwxrwxrwx   - xyz hdfs          0 2018-04-26 16:54 /user/xyz/_sqoop/6dfb90bcf7854f5e82efebbcd317cabe_sample_table
drwxrwxrwx   - xyz hdfs          0 2018-04-26 15:29 /user/xyz/_sqoop/a59b80e855734c35b785bdc35dcbd5a6_sample_table
drwxrwxrwx   - xyz hdfs          0 2018-04-26 14:30 /user/xyz/_sqoop/b77d4b88140e469daa5aa0962b56b562_sample_table

有人能解释一下这里到底发生了什么吗?在这个领域相当新,因为这是第一次尝试使用 Metastore 启动 sqoop 增量作业。

【问题讨论】:

  • 经过进一步检查,我发现创建的文件夹实际上包含 sqooped 数据。例如上次运行我在源代码中手动编辑了一行,并在 /_sqoop/_table_name hdfs 目录中找到了该行。不知何故,sqoop 正在提取该数据并将其合并到目标目录。但是为什么会抛出错误?
  • _sqoop 是为存储临时数据而创建的临时目录。看起来您没有在 hdfs 主目录上提供足够的权限。您可以尝试为您的hdfs 主目录上的create, read, wirte, delete 文件提供所需的权限吗?
  • 你可以试试chmod -R 755 /user/xyz
  • @SandeepSingh 嗨。抱歉,因为我离开了我的工作站,所以无法尽快进行测试。我检查了。 /user/xyz 已经设置了 755 权限。还有其他见解吗?
  • 更新:尝试在不使用 Metastore 的情况下运行 sqoop 操作。只是带有增量最后更新子句的 sqoop 导入命令,merge-key。问题依然存在。最后得到同样的错误。

标签: hadoop hive hdfs sqoop hive-metastore


【解决方案1】:

我挖掘了官方文档和hortonworks资源,终于能够通过从sqoop命令中删除以下参数来解决问题:

--hive-import \
--map-column-hive XYZ=tinyint \

我意识到在这种情况下可以通过将 tinyint 转换为字符串来忽略它。如果使用上面的命令,sqoop 也需要“--hive-import”子句,这就是它失败的地方,因为它每次sqooped 时都需要一个基础表。当上述子句被移除 + map-column-hive 参数时,sqoop 成功完成并能够使用 last-value 更新 Metastore。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多