Sqoop 导出作业的 sqoop.export.records.per.statement 是不是有限制?
Posted
技术标签:
【中文标题】Sqoop 导出作业的 sqoop.export.records.per.statement 是不是有限制?【英文标题】:Is there a limit of sqoop.export.records.per.statement for Sqoop Export job?Sqoop 导出作业的 sqoop.export.records.per.statement 是否有限制? 【发布时间】:2015-10-26 21:24:40 【问题描述】:有谁知道 Sqoop 批量导出作业的 sqoop.export.records.per.statement 的值是否有限制?
我有非常大的数据量,例如要导出的 200,000,000 行数据,从 Impala 到 Vertica。如果每条语句的记录设置得太低,我会得到[Vertica][VJDBC](5065) ERROR: Too many ROS containers exist for the following projections
,如果每条语句的记录设置得太高,我会得到java.lang.OutOfMemoryError: GC overhead limit exceeded
。
有人知道如何解决这个问题吗?谢谢!
【问题讨论】:
【参考方案1】:我认为限制是内存。如果你增加堆,它会让你设置更高的数字。尝试添加-D mapred.child.java.opts=-Xmx1024M
或比您当前设置更大的数字?
您可以尝试增加export.statements.per.transaction
并减少每条语句的记录。我认为这对 ROS 容器方面没有帮助,因为我认为每批 SQL = 1 COPY 语句 = 1 ROS 容器。我认为它不会将多批 INSERT 转换为单个 COPY,但我现在没有办法对其进行测试。
您可以绕过 sqoop 并流式传输数据(您可能需要构建 COPY),例如:
impala-shell -k -i server:port -B -q 'select * from mytable' --output_delimiter="|" | vsql -h database_host -U user -w password -c 'copy mytable from stdin direct'
【讨论】:
感谢您的回答!我现在正在尝试 per.transaction 选项,让我们看看它是如何工作的。顺便说一句,我们目前的解决方案是vsql直接复制,但是先导出到本地文件,然后再从本地文件复制vsql。从您的脚本来看,这是否意味着不需要先导出到文件,对吗?谢谢! 您也可以使用mkfifo
并在一个进程中写入并在另一个进程中加载。我上面给出的示例流式传输数据。它可能不是 100%,但如果您运行第一个命令,您应该会看到要加载的确切数据,没有页眉或页脚。如果是这样,那可以像上面显示的那样直接传送到第二个命令中。您可能需要根据分隔符等进行调整。
如你所说,per.transaction 对于“too many ros files”错误效果不佳。然后我会尝试 COPY 解决方案。由于它不需要导出到文件,它可能会缩短处理时间。非常感谢!
先分两部分工作(使用> output.txt
将数据导出到文件,然后使用cat output.txt | vsql...
导入。分部分进行会使开发更容易。
感谢您的回答。我已经分别对它们进行了测试,并且都可以正常工作。成功导出到目标目录和导入部分也很好用。但不能在一起。一个原因是 "-o --output_delimiter="|"" 会生成一个名为 --output_delimiter="|" 的文件到当前目录。你知道如何解决这个问题吗?谢谢!以上是关于Sqoop 导出作业的 sqoop.export.records.per.statement 是不是有限制?的主要内容,如果未能解决你的问题,请参考以下文章
sqoop export 无法将数据从 hive 仓库文件夹加载到 mysql
Sqoop 脚本开发规范(实例手把手带你写sqoop export和sqoop import)