美文网首页
5.2sqoop批量插入数据

5.2sqoop批量插入数据

作者: NEO_X | 来源:发表于2019-06-08 18:37 被阅读0次

    Apache Sqoop Cookbook 英文版-翻译学习!!
    更多信息https://blue-shadow.top/

    5.2批量插入数据

    问题

    虽然Sqoop的导出功能符合需要, 但速度太慢。每一行都插入到单独的insert语句中,是否有方法将多个insert语句一起批处理?

    解决方案

    Sqoop 为各种数据库和用例量身定做, 为每次插入多行提供多个选项。
    首先, 可以使用--batch参数启用 JDBC 批处理:

    sqoop export \
    --connect jdbc:mysql://mysql.example.com/sqoop \
    --username sqoop \
    --password sqoop \
    --table cities \
    --export-dir cities \
    --batch
    

    第二个选项是使用属性 sqoop.export.records.per.statement 指定将在每个 insert 语句中使用的记录数:

    sqoop export \
    -Dsqoop.export.records.per.statement=10 \
    --connect jdbc:mysql://mysql.example.com/sqoop \
    --username sqoop \
    --password sqoop \
    --table cities \
    --export-dir cities
    

    最后, 您可以设置将每个事务插入多少行通过 sqoop.export.statements.per.transaction 属性:

    sqoop export \
    -Dsqoop.export.statements.per.transaction=10 \
    --connect jdbc:mysql://mysql.example.com/sqoop \
    --username sqoop \
    --password sqoop \
    --table cities \
    --export-dir cities
    
    

    默认值可能因连接器而异。对于 sqoop.export.records.per.statement 和 sqoop.export.statements.per.transaction 属性,
    Sqoop 默认为禁用的批处理数100。

    <h3>讨论</h3>

    这些方法都从不同的角度来看, 可以结合认为合适的方式进行组合。让我们仔细看看每种方法。

    JDBC 接口公开了一个 API, 用于在准备好的语句中使用多组值进行批处理。使用批处理参数, Sqoop 可以利用这一点。此 API 存在于所有 jdbc 驱动程序中, 因为它是 jdbc 接口所必需的。实现可能因数据库而异。有些数据库驱动程序使用能够在一个请求内向远程数据库发送多个行以获得更好的性能, 而其他一些则可能只是单独发送每个查询。某些驱动程序在批处理模式下运行时, 由于通过在内部缓存中序列化行然后将其逐行发送到数据库服务器而引入额外的开销, 导致性能更差

    第二种将多行批处理到同一查询中的方法是在一个单一 insert 语句内指定多个行。将属性 sqoop.export.records.per.statement 设置为两个或多个值时, sqoop 将创建以下查询:
    INSERT INTO table VALUES (...), (...), (...), ...;

    当查询完全由 Sqoop 生成时, JDBC 驱动程序不会更改它, 将其发送到远程数据库。不幸的是, 并非所有数据库都支持单个 insert 语句中的多行。像 MySQL、Oracle 和 PostgreSQL 这样的通用关系数据库确实支持这一点, 但某些数据仓库可能不支持。

    在使用单个 insert 语句插入大量行时, 还需要记住另外一个缺点: 大多数数据库对最大查询大小有限制。如果远程数据库服务器不接受生成的查询, 则 Sqoop 导出将失败。
    第三个批处理机制不会尝试通过将多个行放在一起来实现更好的性能, 就像前两个选项一样。在 sqoop.export.statements.per.transaction 中指定的值决定了在提交事务和启动新的数据库之前, 将在数据上发布多少个 insert 语句。

    此属性的较高值将导致更长时间的事务, 并通过创建和完成事务来删除所引入的开销。使用更高的值通常有助于提高性能。但是, 确切的行为取决于基础数据库及其功能。如果数据库需要特殊的表级写锁定以将行插入到表中, 则对每个事务的语句使用较高的值可能会导致性能显著降低。

    由于每个方法都使用不同的方式来提高导出性能, 因此可以将它们全部合并在一起。每个数据库系统和用户环境是不同的。在所有用例中都没有可以广泛应用的最佳实践。我们的建议是开始启用-批量导入, 并指定每条语句的行数大致等于允许的最大查询大小。从这个出发点, 试验不同的价值观。

    相关文章

      网友评论

          本文标题:5.2sqoop批量插入数据

          本文链接:https://www.haomeiwen.com/subject/oqwcxctx.html