【问题标题】:Sqoop export duplicatesSqoop 导出重复项
【发布时间】:2018-12-08 19:34:48
【问题描述】:

当映射器的数量大于源 hdfs 位置的块数时,sqoop 导出会创建重复项吗?

我的源 hdfs 目录有 2400 万条记录,当我将 sqoop 导出到 Postgres 表时,它会以某种方式创建重复记录。我已将映射器的数量设置为 24。源位置有 12 个块。

知道为什么 sqoop 会创建重复项吗?

  • Sqoop 版本:1.4.5.2.2.9.2-1
  • Hadoop 版本:Hadoop 2.6.0.2.2.9.2-1

使用 Sqoop 命令-

sqoop export -Dmapred.job.queue.name=queuename \
--connect jdbc:postgresql://ServerName/database_name \
--username USER --password PWD \
--table Tablename \
--input-fields-terminated-by "\001" --input-null-string "\\\\N" --input-null-non-string "\\\\N" \
--num-mappers 24 -m 24 \
--export-dir $3/penet_baseline.txt -- --schema public;

【问题讨论】:

  • 导出数据后postgres表的记录数是多少?
  • 我将 100 万条记录添加到目标表中。大约2500万。每次运行都不同。
  • 只导出了100万个?
  • 并非所有记录都是重复的。来源有 2400 万,目标有 2500 万。所以有 100 万条记录被复制
  • 12 个块是什么意思 - 是您导出数据的目录中的 12 个部分文件吗?

标签: postgresql hive sqoop


【解决方案1】:

nosqoop不会两次导出记录,与mapper个数和block个数无关。


查看 sqoop 的pg_bulkload connector 以获得更快的 hdfs 和 postgres 之间的数据传输。

pg_bulkload 连接器是用于将数据导出到 PostgreSQL 的直接连接器。此连接器使用 pg_bulkload。用户受益于 pg_bulkload 的功能,例如绕过共享缓冲区和 WAL 的快速导出、灵活的错误记录处理以及带有过滤功能的 ETL 功能。 默认情况下,sqoop-export 将新行追加到表中;每个输入记录都被转换为一个向目标数据库表添加一行的 INSERT 语句。如果您的表具有约束(例如,其值必须唯一的主键列)并且已经包含数据,则必须注意避免插入违反这些约束的记录。如果 INSERT 语句失败,导出过程将失败。此模式主要用于将记录导出到一个新的空表以接收这些结果。

【讨论】:

  • 为了测试这个场景,我向目标表添加了一个 PK 约束。当工作进行到一半时,它会说 PK 违规。这就是为什么,我说 Sqoop 会加载重复项。
  • 如果您的 hdfs 文件中有重复数据。那么sqoop在此也无能为力。 Sqoop 将简单地触发 INSERT 语句
  • HDFS 文件中没有重复项。我从日志中取出失败的 ID,然后查询 HDFS 表。我只返回了该 ID 的一条记录
【解决方案2】:

bagavathi您提到在目标表中看到重复行,当您尝试添加 PK 约束时,由于 PK 冲突而失败,此外,源没有重复行。一种可能的情况是,您的 Target 表可能已经有记录,这些记录可能是因为之前的 sqoop 作业不完整。请检查目标表是否具有也在源中的键。

这种情况的一种解决方法是,使用参数“--update-mode allowinsert”。在您的查询中,添加这些参数 --update-key --update-mode allowinsert。这将确保如果 key 已经存在于 table 中,则记录将得到更新,否则如果 key 不存在,则 sqoop 将执行插入。

【讨论】:

    【解决方案3】:

    如果你使用了 sqoop 增量模式,那么 HDFS 上会有很多重复记录,在运行 export 到 postgres 之前,在一个表中收集基于 max(日期或时间戳列)的所有唯一记录,然后进行导出。 我认为它必须工作

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多