更新时间:2023-03-17 GMT+08:00

将Oracle数据库中的数据导入HDFS时各连接器的区别

问题

使用Loader将Oracle数据库中的数据导入到HDFS中时,可选择的连接器有generic-jdbc-connector、oracle-connector、oracle-partition-connector三种,要怎么选?有什么区别?

答案

  • generic-jdbc-connector

    使用JDBC方式从Oracle数据库读取数据,适用于支持JDBC的数据库。

    在这种方式下,Loader加载数据的性能受限于分区列的数据分布是否均匀。当分区列的数据偏斜(数据集中在一个或者几个值)时,个别Map需要处理绝大部分数据,进而导致索引失效,造成SQL查询性能急剧下降。

    generic-jdbc-connector支持视图的导入导出,而oracle-partition-connector和oracle-connector暂不支持,因此导入视图只能选择该连接器。

  • oracle-partition-connector和oracle-connector

    这两种连接器都支持按照Oracle的ROWID进行分区(oracle-partition-connector是自研,oracle-connector是社区开源版本),二者的性能较为接近。

    oracle-connector需要的系统表权限较多,下面是各自需要的系统表,需要赋予读权限。

    • oracle-connector:dba_tab_partitions、dba_constraints、dba_tables、dba_segments、v$version、dba_objects、v$instance、SYS_CONTEXT函数、dba_extents、dba_tab_subpartitions。
    • oracle-partition-connector:DBA_OBJECTS、DBA_EXTENTS。

    相比于generic-jdbc-connector,oracle-partition-connector和oracle-connector具有以下优点:

    1. 负载均匀,数据分片的个数和范围与源表的数据无关,而是由源表的存储结构(数据块)确定,颗粒度可以达到“每个数据块一个分区”。
    2. 性能稳定,完全消除“数据偏斜”和“绑定变量窥探”导致的“索引失效”。
    3. 查询速度快,数据分片的查询速度比用索引快。
    4. 水平扩展性好,如果数据量越大,产生的分片就越多,所以只要增加任务的并发数,就可以获得较理想的性能;反之,减少任务并发数,就可以节省资源。
    5. 简化数据分片逻辑,不需要考虑“精度丢失”、“类型兼容”和“绑定变量”等问题。
    6. 易用性得到增强,用户不需要专门为Loader创建分区列、分区表。