hivesql优化-FileInputFormat中切片的大小的参数
hive.exec.parallel可以控制一个sql中多个可并行执行的job的运行方式.
当hive.exec.parallel为true的时候,同一个sql中可以并行执行的job会并发的执行.
而参数hive.exec.parallel.thread.number就是控制对于同一个sql来说同时可以运行的job的最大值,该参数默认为8.此时最大可以同时运行8个job.
我找了个job比较多的sql,task id是1430403,是这个任务中的最后一个sql,是n个sql一起的union操作
通过修改参数hive.exec.parallel和hive.exec.parallel.thread.number测试了下不同情况的执行速度
其中hive.exec.parallel.thread.number表示同时运行的job的个数
不开并行:2533.722 seconds
开并行,并行度为8:266.82 seconds
开并行,并行度为16:194.33 seconds
开并行,并行度为32:133.117 seconds
当并行度为32的时候,速度提升了将近20倍,但是会占用更多的map和reduce资源
选择并发数的影响因素:
1、运算节点的硬件配置
2、运算任务的类型:CPU密集型还是IO密集型
运算任务的数据量
hive可以通过set mapred.max.split.size设置分片大小;
这段逻辑及形成的切片规划描述文件,由FileInputFormat实现类的getSplits()方法完成
1.提交任务时候首先会读取到你的数据在那个目录 例如/datafile/demo.txt 假如(300M)
2.开始遍历处理该目录下所有文件 (规划切片)
3.遍历第一个文件demo.txt
3.1获取文件大小,fs.sizeOf(demo.txt)
3.2计算切片大小computeSplitSize(Math.max("mapred.min.split.size",min("mapred.max.split.size",blockSize)))=blockSize=128M(默认)
3.3 开始切,形成第一个切片:demo.txt --0~128M 第二个分片demo.txt 128~256M 第三个分片 demo.txt 256~300M
3.4 将切片信息写入一个切片规划文件中job.split 配置相关信息写入job.xml 还有运行的jar包 打包发给MrAppMaster