当Map器的数量大于源hdfs位置中的块数量时,sqoop export会创建重复吗?
我的源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;
3条答案
按热度按时间ijxebb2r1#
bagavathi您提到在目标表中看到重复的行,当您尝试添加pk约束时,由于pk冲突而失败,而且源没有重复的行。一种可能的情况是,您的目标表可能已经有记录,这可能是因为以前的一个不完整的sqoop作业。请检查目标表是否有也在源中的键。
这个场景的一个解决方法是,使用参数“--updatemodeallowinsert”。在查询中,添加以下参数,-update key--update mode allowinsert。这将确保如果表中已经存在键,则记录将得到更新,否则如果不存在键,则sqoop将执行插入操作。
rm5edbpk2#
如果您使用了sqoop增量模式,那么hdfs上会有许多重复的记录,在运行export to postgres之前,根据一个表中的max(date或timestamp列)收集所有唯一的记录,然后执行export。我认为它必须起作用
mnemlml83#
no sqoop不会导出两次记录,它与Map器的数量和块的数量无关。
请看sqoop的pgèu bulkload连接器,它可以在hdfs和postgres之间实现更快的数据传输。
pgu bulkload connector是一个用于将数据导出到postgresql的直接连接器。此连接器使用pgèU散装负载。用户受益于pgu bulkload的功能,例如绕过共享缓冲区和wal的快速导出、灵活的错误记录处理以及带有过滤器功能的etl特性。默认情况下,sqoop export将新行追加到表中;每个输入记录都转换为insert语句,该语句向目标数据库表中添加一行。如果表具有约束(例如,其值必须唯一的主键列)并且已经包含数据,则必须注意避免插入违反这些约束的记录。如果insert语句失败,导出过程将失败。此模式主要用于将记录导出到新的空表以接收这些结果。