优化你的Sqoop import程序

概述

       本文对Sqoop原理进行分析,结合实战经验,给出一些优化策略。对如下问题给出建议。

  1. 怎样让sqoop快起来?
  2. 该用那个字段做分片?
  3. m 应该设置成多少?
  4. 可以用时间字段做分片么?
  5. 为什么写入Hbase把RS写挂了?

     本文只讨论sqoop 1 的import。

用途

       Sqoop通常被用来做关系型数据库与Hadoop生态的数据交换。从语法上看的出来它是站在hadoop的角度,sqoop import … 就是把数据取进来,sqoop export… 是把数据吐出去。

重要原理

       Sqoop是基于Mapreduce的,为的是在大数据量下多进程批量并行读写。因此我们在使用时要注意充分发挥集群性能。在大数据量情况下,Sqoop可以通过增加并发数-m加快速度,它将一个命令转换成m个sql同时读写目标数据库,如此一条命令会因为最慢的一个sql影响整体时长。增加并发数与均匀的分布是最基本的原则,而这与数据有非常直接的联系,因此要对数据有充分的了解

m与split-by

       当表数据量较小时没有必要并发,建议m=1即可,否则会带来资源的浪费,还有过多的小文件。当数据量较大时应增大m的值,m>1时必须指定split-by参数的值,即用表中的哪个字段进行分片。sqoop会先取该字段的max和min找到边界,然后根据m的值切分出每个sql的边界。如以数字类型字段为例,如果split-by的字段值max为100、min为0、m=2时,就会出现2个sql,分别取[0,50)和(50,100]。

      大数据量下要特别考虑数据的特征,对于split-by最完美的情况是有一个:均匀分布的数字(如自增列)或时间字段,且这个字段还有索引,这样在抽取时使得并发的每个sql处理相近的数据量,并且sqoop附加的where条件可以使用索引。

      对于m要综合考虑数据量、IO、源数据库的性能、集群的资源等等。一种简单的考虑是最大不超过yarn上分配给这个用户的vcore个数,最小 “数据量/m”要够一个128MB的文件。如果条件允许可以先设置一个值跑着试试,然后观察源数据库负载、集群IO以及运行时长等,再进行相应调整。

 

hbase-bulkload

       Sqoop不仅支持数据写入hdfs\hive,也支持写入hbase。sqoop会将取来的数据变为一个个的put,如果数据量很大会对Hbase RegionServer带来较大压力,可能会因为GC而宕机。熟悉Hbase的朋友知道Hbase支持bulkload的快速装载,即先生成hfile文件再存入表中,不进入RS堆不产生GC。sqoop中使用hbase-bulkload参数开启这项功能,建议在有大数据量导入hbase时使用。

猜你喜欢

转载自blog.csdn.net/fantuanbaba/article/details/84544998