HIVE 调优思路和实践

1,数据存储调优 

1.1 设置压缩:
  设置中间数据/输出结果压缩传输,使用snappy格式。

hive-site.xml:

set hive.exec.compress.output = true  # 输出结果压缩

set hive.exec.compress.intermediate = true  # 中间结果压缩

具体压缩算法配置:

mapred-default.xml(Hadoop 安装目录内):

mapreduce.map.output.compress = true  # map任务输出压缩
mapreduce.map.output.compress.codec = Snappy #压缩算法

mapreduce.output.fileoutputformat.compress  # reducer 输出压缩

mapreduce.output.fileoutputformat.compress.codec  # reducer 压缩算法

mapreduce.output.fileoutputformat.compress.type  #reducer 压缩类型

 

1.2 增加热数据的副本数. 减少传输延迟。

hdfs系统的副本数是固定的。这里是修改单个文件的副本数量。

在写入表(文件)时设置:

set dfs.replication=10;  # dfs默认3
Insert overwrite table  tmp.dim_test  select *  from other_table; 

或者在hdfs 内,上传文件时修改;

hadoop dfs -D dfs.replication=2 -put  dim_test.txt   /***/

 

2,常见配置项调优

 

2.1 当查询的数据量足够小时,启用本地模式。

hive-site.xml:

hive.exec.mode.local.auto = true  # 自动启动local 模式
hive.exec.mode.local.auto.inputbytes.max  = 50000000 # 最大字节数的阈值

 

2.2 在一些可以设置并行执行的任务中,配置 parallel

可以运行并行的任务,比如 在join 之前,对多个数据源的处理。 还有移动多个数据源插入目标表。

hive.exec.parallel = true  # 并行运行 
hive.exec.parallel.thread.number  = 8 # 最多线程数 

 

2.3 Fetch task获取数据,直接读取文件,不MR。 某些简单操作适用。 

hive.fetch.task.conversion = more # 对 SELECT, FILTER, LIMIT only UDFs, 有效

 

2.4 更换执行引擎: spark  tez  mr 

hive.execution.engine  = spark # 设置spark引擎

 

 

3,计算代码级调优

3.1,去重算法调优

 不可使用DISTINCT;Hive去重最佳方法----row_number() ,模拟了分区排序。map 内分区排序,reduce内 归并排序,效率高。

举例对 客户表(id , name ,  order_id , data )去重, 假设数据量非常大。

 

 3.2  排序算法

  order by :一个reduce,全局排序,性能差。 数据量较少时,可以使用

  sort by : map端排序完成,分区输出,局部有序。 

  distribute by:按照指定的字段对数据进行划分到不同的输出reduce

  cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能,建议使用。

 

4,常见问题调优

4.1 、小文件太多如何调优

4.1.1,调用 hdfs的方法合并小文件,sync() append() 文件层面; 或者使用hadoop 管理命令合并;

举例 : 每日产生大量product_info_* 的文件, 合并这些文件 

hadoop fs -getmerge /hdfs_path/product_info_* /local_path/product_inf  # 合并后保存到本地

hadoop fs -put  /local_path/product_inf  /hdfs_path # 合并文件再上传到hdfs

 

4.1.2,   Hadoop archive 命令, 解决对于NN 内存问题。  但是不能解决计算中的问题

可以更有效的把大量小文件打包放入block,因此减少NameNode压力。

 hadoop archive -archiveName name -p <parent>  <src>* <dest> # 打包成 .har文件

 

4.1.3,SequenceFile ,使用文件名作为 key,文件内容作为 value。支持mr分块处理,支持压缩
    最好将源数据直接写入 SequenceFile,而不是作为中间步骤写入小文件。

 

 

4.2 、数据倾斜如何调优

  本质原因是,1,发生大量数据的网络传输  2,磁盘IO速度缓慢

4.2.1 配置项

hive.optimize.skewjoin=true;     #默认false,如果存在数据倾斜可能性,可以将其设置为true

SET hive.skewjoin.key=100000;  #默认为100000,如果key的数量大于配置的值,则超过的数量的key对应的数据会被发送到其他的reduce任务

hive.groupby.skewindata=true  #在分组任务,首先额外触发一个mr作业,该作业的map任务的输出会被随机地分配到reduce任务上,从而避免数据倾斜

hive.auto.convert.join=true  # 大表和小表连接问题,  新版可以配置后,自动识别到此情况。

 

4.2.2  代码级

   1,行列裁剪; 2个都是分桶表,连接key是分桶字段。 只读取需要的桶数据。

 select  name , order  from table_a  where  date >= '2008-03-01' AND date <= '2008-03-31' 

 

   2,大表和大表连接问题

    1,Key 字段加随机字段,把分区打散。  

        比如, a 和 b 表连接,连接的key集中于 date = 20200120 

 

      2,把2个表定义为 ”有序分桶表“   使用 BUCKET MAP JOIN / SORT MERGE BUCKET MAP JOIN  // 分桶 有序

 

posted @ 2022-06-19 11:08  gaussen126  阅读(87)  评论(0编辑  收藏  举报