SQOOP可能会导致HDFS分片数量过多的总结
2016-03-16 16:18
274 查看
使用多少个mapreduce来进行移植数据,例如:
./sqoop import --create-hive-table --hive-import --hive-overwrite --connect jdbc:oracle:thin:@XXX.XXX.XXX.XXX:1521:orcl --username name --password pwd --table tablename --hive-database hivedatabasename -m 5
上面使用了5个任务,然后数据在每个任务不满128M的时候,存储文件也会分成5份,在数据量不是很大的情况下,还是应该只用1个任务来跑,这样文件的分片比较少,为什么要分片数量少呢?
比如下面就是用1个任务跑的
当后面用sparksql进行表数据的清洗、筛选和合并的时候,
例如我们把每日的数据最终合并到年表中,当使用
insert into tableyear select * from tableday的方式在sparksql中执行时,hive会自动把日表的文件拷贝到年表中,就会出现以下奇景:
我们发现全部是拷贝的
然后当我们在sparksql中执行某些任务的时候,那么就需要从每个数据分片查询,这都是时间,以2个月为例,每天用5个mapreduce进行sqoop移植数据,最终产生了300多个数据分片,然后执行的sparksql的count表数据的时候,我们就会发现产生了300多个Task
当存在300多个数据分片的时候进行count,我们发现就算那个分片就算是0B,至少也会损耗将近10ms的时间,如果能将分片变成1/5,比如少200个分片,以上面例子为例节省的时间就可能是2s,当然这种计算不一定合理,但至少印证了数据分片数量过多对速度上的影响。
上面的数据量大概是600万,花了5秒。
而我们另外一个数据600多万,比它还多一点数据,执行的时候第一次2秒左右,后面每次执行都1秒钟都不到,就是因为数据分片少
因为执行的任务数量少了,所以效率大幅度提高了:
总结:
如果数据比较少的情况下,我们更加建议,在关系型数据库将数据合并之后再使用sqoop移植,比如oracle我们上面的表,1天的数据本身就只有10万条左右,大小在70M左右,根本没满128M,这个时候就算一天一个HDFS文件,在后续合并区间段(比如历史所有5年的数据全部放在一个表)太长的情况下,都会显得浪费,不如把1个月的数据300万条首先的关系型数据库合并到大表,大小总共就1个G,如果分配合理,最终在hdfs中只需要产生10个左右的数据分片,2个月产生20个,相比上面我们产生了300多个数据分片,最终的效率肯定不可同日而语!!!
当数据量比较多,比如一天数据本身本身就有500万甚至上千万数据的时候,一天的大小可能就会与几个G甚至几十个G,那么这个时候我们就算用多个mapreduce任务也没关系,当然任务还是不能太多,不然很可能出现每个任务的最后产生的文件离128M差距太多,还是会对性能产生一定的影响!!!
性能优化看来是一条疯狂的道路!!!
本文出自 “一枝花傲寒” 博客,谢绝转载!
./sqoop import --create-hive-table --hive-import --hive-overwrite --connect jdbc:oracle:thin:@XXX.XXX.XXX.XXX:1521:orcl --username name --password pwd --table tablename --hive-database hivedatabasename -m 5
上面使用了5个任务,然后数据在每个任务不满128M的时候,存储文件也会分成5份,在数据量不是很大的情况下,还是应该只用1个任务来跑,这样文件的分片比较少,为什么要分片数量少呢?
比如下面就是用1个任务跑的
当后面用sparksql进行表数据的清洗、筛选和合并的时候,
例如我们把每日的数据最终合并到年表中,当使用
insert into tableyear select * from tableday的方式在sparksql中执行时,hive会自动把日表的文件拷贝到年表中,就会出现以下奇景:
我们发现全部是拷贝的
然后当我们在sparksql中执行某些任务的时候,那么就需要从每个数据分片查询,这都是时间,以2个月为例,每天用5个mapreduce进行sqoop移植数据,最终产生了300多个数据分片,然后执行的sparksql的count表数据的时候,我们就会发现产生了300多个Task
当存在300多个数据分片的时候进行count,我们发现就算那个分片就算是0B,至少也会损耗将近10ms的时间,如果能将分片变成1/5,比如少200个分片,以上面例子为例节省的时间就可能是2s,当然这种计算不一定合理,但至少印证了数据分片数量过多对速度上的影响。
上面的数据量大概是600万,花了5秒。
而我们另外一个数据600多万,比它还多一点数据,执行的时候第一次2秒左右,后面每次执行都1秒钟都不到,就是因为数据分片少
因为执行的任务数量少了,所以效率大幅度提高了:
总结:
如果数据比较少的情况下,我们更加建议,在关系型数据库将数据合并之后再使用sqoop移植,比如oracle我们上面的表,1天的数据本身就只有10万条左右,大小在70M左右,根本没满128M,这个时候就算一天一个HDFS文件,在后续合并区间段(比如历史所有5年的数据全部放在一个表)太长的情况下,都会显得浪费,不如把1个月的数据300万条首先的关系型数据库合并到大表,大小总共就1个G,如果分配合理,最终在hdfs中只需要产生10个左右的数据分片,2个月产生20个,相比上面我们产生了300多个数据分片,最终的效率肯定不可同日而语!!!
当数据量比较多,比如一天数据本身本身就有500万甚至上千万数据的时候,一天的大小可能就会与几个G甚至几十个G,那么这个时候我们就算用多个mapreduce任务也没关系,当然任务还是不能太多,不然很可能出现每个任务的最后产生的文件离128M差距太多,还是会对性能产生一定的影响!!!
性能优化看来是一条疯狂的道路!!!
本文出自 “一枝花傲寒” 博客,谢绝转载!
相关文章推荐
- 树莓派3 CentOS7 下载 Raspberry Pi Model 3 B
- 网易公开课《Linux内核分析》学习心得-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- hadoop2.4.1源码在64位系统编译过程中遇到的几个错误及解决方法
- Linux sed指令
- Linux同步工具:rsync
- Nginx分发高级配置
- 《高性能网站建设指南》读后感
- linux终端下查看当前操作系统版本信息
- Hadoop数据压缩
- apache2.2下编译安装php5.6
- Arch Linux安装中文输入法
- 浅谈WebLogic和Tomcat
- linux(centos)搭建SVN服务器
- Linux Shell特殊字符和控制字符大全
- Linux内存管理误区问答总结
- 未安装nginx输入ip直接访问工程
- Linux内核Crash分析
- Linux笔记(47)——shell运算符
- linux 进程的虚拟地址和内核中的虚拟地址有什么关系
- Linux mysql 允许远程连接