sqoop作为一个跨平台抽取和输出数据的工具,在关系型数据库(oralce,mysql等)和大数据平台之间常用。而目前的项目使用的hadoop平台,上游数据库是Oracle。
作为ETL的一环,加载作业的性能也是需要关注和优化的。如果使用Sqoop命令,则可以从以下几点进行优化:
1.允许并行抽数:
-m n:这个参数代表的是允许n个MapReduce任务运行抽数据。对于大表,n>1是最好的,同时需要设定 -split by的字段和表达式(注,只能用单个字段或表达式)。split by 的字段代表了按哪个字段的值来划分并行区间。
但是这样有个隐患,就是当所选字段或表达式的值分布不均时候(有1条记录值为A, 1000条记录值为B),会造成数据倾斜且性能无提升(hadoop中,一个作业的所有MP任务完成后,这作业才会结束)。所以还需要对split 字段或表达式的数据分布进行价差。看到很多篇说可以使用PK字段,但是个人发现PK字段的值也有分布不均的,其他非PK字段也可以使用。例如一个工厂的原料采购数据,可以使用采购年份进行并行,因为每年的采购数据量相差不大。
2. 在源数据中过滤不必要的记录和字段: 可以在上游数据库中建立物化视图或者表,过滤掉不需要的记录和字段,减少耗时。
3. 在上游数据库增加缓存:在并行抽数时,如果无数据倾斜发生,则需要检查上游数据库的缓存空间的大小。增加缓存,能够减少sqoop命令的运行时长。
有错必纠正,欢迎反馈!