Hive2优化参数

最近为了调试hive试了很多hive参数,对于hive任务优化,减少使用内存有一些自己的见解,在此做一个记录。

一:Hive是什么

Hive是面向大数据的数据仓库,是一种将SQL转换为mapreduce的工具。

二:mapreduce的基本流程及阶段可进行的优化操作

(其实有很多不用设置有默认的设置或设置后反而执行时间长,此处做了解,参考设置在下一节)

附上网上的一张老图(虽然老但是很具有代表性,哈哈哈)

上面的图知道,对于mapreduce任务可分为以上几个步骤,input、splitting、Mapping、Shuffing、reducing、finalresult,我们可以对这些阶段进行分别的优化!!

Splitting阶段优化:将输入数据进行按照大小节分,分成不同的块。

优化点:1.适当增加切割块的大小(单个节点先按照maxsize进行切分,剩下的进行minsize大小的合并。然后是节点之间的合并,最后是机架之间的合并。)

set mapreduce.input.fileinputformat.split.minsize = 1024000000;
                     set mapreduce.input.fileinputformat.split.maxsize = 1024000000;(默认256M)
                     set mapreduce.input.fileinputformat.split.minsize.per.node= 1024000000;
                     set mapreduce.input.fileinputformat.split.maxsize.per.node= 1024000000;(默认1b)
                     set mapreduce.input.fileinputformat.split.minsize.per.rack= 1024000000; 
                     set mapreduce.input.fileinputformat.split.maxsize.per.rack= 1024000000;(默认1b)
                     set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;(默认存在)

Mapping阶段优化:将相同的key进行对应的转换,其实map的个数取决于上一阶段切割的最终的数据块个数。

优化点:1.手动规定map的个数(例子:任务中有100个map,但是可以使map分批执行一批10个)

set mapreduce.job.running.map.limit=20;

2.规定map同时并行的个数(例子:任务中有100个map,但是可以使map分批执行一批10个)

set mapreduce.map.memory.mb=3584;(3.5G内存)  默认2.1倍会杀掉

3.限制map可使用的最大内存

set hive.map.aggr = true
                     set hive.groupby.mapaggr.checkinterval = 100000(将数据每100000进行聚合)

Shuffing阶段优化:将相同的的key放到一个reduce中,其实是一个网络传输的过程。

优化点:1.map后进行压缩(压缩后自动解压)

set mapreduce.map.output.compress=true(map输出压缩,mapreduce参数)
                     set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec(map输出压缩格式,mapreduce参数)

2.map后进行合并文件操作

set hive.merge.mapfiles = true(新启一个job完成合并,合并多大set hive.merge.size.per.task决定)

reducing阶段优化:进行数据累加操作,并将结果传输到对应的文件中。

优化点:1.手动规定reduce的个数

set mapred.reduce.tasks = 20;

2.规定reduce同时并行的个数(例子:任务中有100个reduce,但是可以使reduce分批执行一批10个)

set mapreduce.job.running.reduce.limit=80;

3.限制reduce可使用的最大内存

set mapreduce.reduce.memory.mb=7168;(7G内存)    默认2.1倍会杀掉

4.设置每个reduce可处理的数据大小(直接决定reduce个数)

set hive.exec.reducers.bytes.per.reducer=1024*1000*1000;

5.reduce最大个数

set hive.exec.reducers.max =2000;(mapreduce.job.running.reduce.limit变相使用)

6.reduce后可进行文件合并

set hive.merge.sparkfiles = false(spark引擎,结束后合并文件,新启动一个任务)
                     set hive.merge.tezfiles = false(tez引擎,结束后合并文件,新启动一个任务)
                     set hive.merge.mapredfiles = true(mapreduce引擎,结束后合并文件,新启动一个任务)
                     set hive.merge.smallfiles.avgsize =100*1000*1000 (输出文件小于当前值的时候,任务结束后合并文件的大小)
                     set hive.merge.size.per.task = 1024*1000*1000 (将文件合并成为多大)

finalresult阶段优化:其实就是写文件的过程。

优化点:1.reduce后要进行压缩写到HDFS(每个节点单独跑任务,但是最后的结果需要汇聚到一处)

set mapreduce.output.fileoutputformat.compress=false // 默认值是 false reduce属性
                     set mapreduce.output.fileoutputformat.compress.type=BLOCK // 默认值是 Record reduce属性
                     set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec // 默认值是 org.apache.hadoop.io.compress.DefaultCodec

其他优化:

JVM优化:一个JVM运行的job数是有上限的,我们可以设置最大执行的个数

set mapreduce.job.jvm.numtasks=100

并发及并发线程数优化:job的子查询可能没关系,所以可以开启并发查询

set hive.exec.parallel = true; 
                     set hive.exec.parallel.thread.number=8;

数据倾斜优化:可进行key值个数的判断,判断时候发生数据倾斜

set hive.optimize.skewjoin=true;
                     set hive.skewjoin.key=100000;(超过10000个相同的key就认为是数据倾斜,需要进行打散处理)

分区优化:hive有桶表和分区表,可开启动态分区(其实就是不同文件夹)

set hive.exec.dynamic.partition=true
                     set hive.exec.dynamic.partition.mode=nonstrict(分区表分为严格模式和非严格模式)

job之间优化:

set hive.exec.compress.output=true;(最终结果压缩。若map压缩和reduce压缩都没有用,改参数使用的话。两个job第一个job后数据不压缩,第二个job输出压缩)
                     set hive.exec.compress.intermediate=true(若map压缩reduce压缩最终输出压缩都没有用,改参数使用的话。两个job第一个job后数据压缩,第二个job输出不压缩)                          SQL优化:

小表往前放

三:常用hive参数优化

其实上面是对每一个阶段都进行数据优化,有很多参数都是默认开启或者有默认值的。

只需要用到常用的几个就行,其他的作为了解。下面列举出比较常用的:

Splitting阶段:将输入小文件合并成为大文件

set mapreduce.input.fileinputformat.split.minsize = 1024000000;(参数mapreduce.map.memory.mb=3584 默认2.1倍会杀掉,一个map申请3.5G内存不用浪费了)
                     set mapreduce.input.fileinputformat.split.maxsize = 1024000000;
                     set mapreduce.input.fileinputformat.split.minsize.per.node= 1024000000;
                     set mapreduce.input.fileinputformat.split.maxsize.per.node= 1024000000;
                     set mapreduce.input.fileinputformat.split.minsize.per.rack= 1024000000; 
                     set mapreduce.input.fileinputformat.split.maxsize.per.rack= 1024000000;

map阶段一般很快,参数可以不设置

reduce阶段

set mapreduce.job.running.reduce.limit=80;(例子:任务中有100个reduce,但是可以使reduce分批执行一批10个)

合并文件

hive合并文件是新启动一个任务合并文件,感觉这个参数不太合适,有这个时间不如直接输出(map和reduce阶段都是一样的)。

压缩文件

(这个参数十分好,压缩不仅仅节约空间而且在网络传输的时候比较省宽带,mapreduce和spark都是默认可以解压缩的,比较方便。)

set mapreduce.map.output.compress=true(map输出压缩,map阶段参数)
                     set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec(map输出压缩格式,map阶段参数)
                     set mapreduce.output.fileoutputformat.compress=false // 默认值是 false reduce阶段参数
                     set mapreduce.output.fileoutputformat.compress.type=BLOCK // 默认值是 Record reduce阶段参数
                     set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec // 默认值是 org.apache.hadoop.io.compress.DefaultCodec
                     set hive.exec.compress.output=true;(最终结果压缩。若map压缩和reduce压缩都没有用,改参数使用的话。两个job第一个job后数据不压缩,第二个job输出压缩)
                     set hive.exec.compress.intermediate=true(若map压缩reduce压缩最终输出压缩都没有用,改参数使用的话。两个job第一个job后数据压缩,第二个job输出不压缩)

Jvm优化(建议不设置)

并发优化

set hive.exec.parallel = true;
                     set hive.exec.parallel.thread.number=8;

数据倾斜优化:

set hive.optimize.skewjoin=true;
                     set hive.skewjoin.key=100000;(超过10000个相同的key就认为是数据倾斜,需要进行打散处理)

分区优化(建表的时候要partation by ):

set hive.exec.dynamic.partition=true
                     set hive.exec.dynamic.partition.mode=nonstrict(分区表分为严格模式和非严格模式)

SQL优化

小表往前放

四:hivesql内存计算过程,mapreduce确定及常用UI端口

1.hive参数配置:

Hive UI------>>>>Hive Configuration页签找到(版本与版本之间参数的名字不太一样一定要看清楚配置的名字,最好使用最新的配置名称)

2.hivesql使用内存资源

hivesql使用资源可在YARN的管理界面中RUNNING中看到,需要时不时刷新因为是动态的。(一般为3.5g*map个数字+7g*reduce个数)

3.hivesql生成的job的map个数reduce个数

可在YARN的管理界面中FINISHED中找到job后点击History,进去之后就会看到map数和reduce数

Splitting块个数决定map个数,reduce个数取决于输出的大小(1G一个reduce)

4.常用UI:

1、HDFS页面:50070

2、YARN的管理界面:8088

3、HistoryServer的管理界面:19888

4、Zookeeper的服务端口号:2181

5、Hive.server2=10002

6、Kafka的服务端口号:9092

7、Hbase界面:16010,60010

8、Spark的界面:8080

原文地址:https://www.cnblogs.com/wuxiaolong4/p/11565220.html

时间: 2024-10-17 09:00:38

Hive2优化参数的相关文章

MySql常用命令--优化参数以及日常管理

显示插入查询的优化参数: show variables like "concurrent_insert"; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | concurrent_insert | AUTO | +-------------------+-------+ set GLOBAL concurrent_insert=2; 插入数据时MySQL会对插入

模拟优化参数optimizer_switch选项mrr(Multi_Range Read)对查询优化的影响

11.1背景:模拟优化参数optimizer_switch选项mrr(Multi_Range Read)对查询优化的影响 11.2建表语句 mysql> show create table order_line\G; *************************** 1. row *************************** Table: order_line Create Table: CREATE TABLE `order_line` ( `ol_o_id` int(11)

php-fpm优化参数介绍

1.php-fpm优化参数介绍他们分别是:pm.pm.max_children.pm.start_servers.pm.min_spare_servers.pm.max_spare_servers. pm:表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态).在更老一些的版本中,dynamic被称作apache-like.这个要注意看配置文件的说明. 下面4个参数的意思分别为: pm.max_children:静态方式下开启的php-fpm进程数量pm.star

大并发内核优化参数

如何分析系统的性能问题: 从以下几个维度进行考虑 当并发压力加大时,往往是吞吐量上不去,肯定是某一个方面出现了瓶颈,(比如CPU,内存(大量的swap),磁盘IO,网络IO,操作系统,应用) 如果CPU比较高(user,sys,wa),user高,可以把系统的线程dump出来,观察系统正在做的逻辑,优化逻辑:sys高,则说明kernel耗费了大量的CPU时间,比如当前的线程的切换比较厉害等等:wa高一般是IO操作比较频繁,CPU频繁调度 查看CPU,还需要观察系统load,一般不要超过系统的物理

内核优化参数

关于内核参数的优化: net.ipv4.tcp_max_tw_buckets= 6000 timewait的数量,默认是180000. net.ipv4.ip_local_port_range= 1024 65000 允许系统打开的端口范围. net.ipv4.tcp_tw_recycle= 1 启用timewait 快速回收. net.ipv4.tcp_tw_reuse= 1 开启重用.允许将TIME-WAIT sockets 重新用于新的TCP 连接. net.ipv4.tcp_syncoo

fastcgi 性能优化参数

优化性能参数设置,在ngnix.conf中的http 层加上fastcgi参数如下:http {fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10minactive=5m;fastcgi_connect_timeout=300;fastcgi_send_timeout=300;fastcgi_buffer_size=64k;fastcgi_buffers 4 64k;fastcgi_busy

mysql数据库性能优化 - 参数优化

Mysql Server优化                                                                                                                                 1.查看mysql server参数 show variables; / show variables like '参数名';   --mysql服务器配置信息 show status; / show global

mariadb配置文件优化参数

mariadb数据库优化需要根据自己业务需求以及根据硬件配置来进行参数优化,下面是一些关于mariadb数据库参数优化的配置文件. 如下为128G内存32线程处理器的mariadb配置参数优化: [client] #password= your_password port= 3306          socket= /tmp/mysql.sock !includedir /opt/local/mysql/wsrep # The MySQL server [mysqld] port= 3306

mysql存储引擎优化参数

MySQL配置参数优化 本文来自道森学习笔记,版权归 http://wubx.net/ 所有 MyISAM存储引擎优化 涉及参数如下: Key_buffery_size Concurrent_insert = 2 | WAAYS Bulk_insert_buffer_size=8M Myisam_recover_options=FORCE Myisam_recover_threads=1 Myisam_sort_buffer_size=1G 参数解释:   key_buffery_size 主要