
# 将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创建分区列、分区表。
   
 
