Hive优化

一、hive表重新合并小文件

merge_file="
set mapreduce.input.fileinputformat.split.maxsize=268435456;
set mapreduce.input.fileinputformat.split.minsize.per.node=268435456;
set mapreduce.input.fileinputformat.split.minsize.per.rack=268435456;
alter table app.search_keyword_analyise_base_v1 partition ( dt=' c u r r d a t e ′ ) c o n c a t e n a t e ; " h i v e − e " curr_date') concatenate; " hive -e " currdate)concatenate;"hivee"merge_file"

二、Hive 查询优化

    /** 一、mapper数量设置 **/
    spark.sql("set mapred.min.split.size.per.node=256000000")
    spark.sql("set mapred.min.split.size.per.rack=256000000")
    spark.sql("set mapred.max.split.size=256000000")

解释:

它的主要思路是把输入目录下的大文件分成多个map的输入, 并合并小文件, 做为一个map的输入. 具体的原理是下述三步:

  1. 根据输入目录下的每个文件,如果其长度超过mapred.max.split.size,以block为单位分成多个split(一个split是一个map的输入),每个split的长度都大于mapred.max.split.size, 因为以block为单位, 因此也会大于blockSize, 此文件剩下的长度如果大于mapred.min.split.size.per.node, 则生成一个split, 否则先暂时保留.
  2. 现在剩下的都是一些长度效短的碎片,把每个rack下碎片合并, 只要长度超过mapred.max.split.size就合并成一个split, 最后如果剩下的碎片比mapred.min.split.size.per.rack大, 就合并成一个split, 否则暂时保留.
  3. 把不同rack下的碎片合并, 只要长度超过mapred.max.split.size就合并成一个split, 剩下的碎片无论长度, 合并成一个split.
    举例: mapred.max.split.size=1000
    mapred.min.split.size.per.node=300
    mapred.min.split.size.per.rack=100

输入目录下五个文件,rack1下三个文件,长度为2050,1499,10, rack2下两个文件,长度为1010,80. 另外blockSize为500.

经过第一步, 生成五个split: 1000,1000,1000,499,1000. 剩下的碎片为rack1下:50,10; rack2下10:80

由于两个rack下的碎片和都不超过100, 所以经过第二步, split和碎片都没有变化.

第三步,合并四个碎片成一个split, 长度为150.

如果要减少map数量, 可以调大mapred.max.split.size, 否则调小即可.

其特点是: 一个块至多作为一个map的输入,一个文件可能有多个块,一个文件可能因为块多分给做为不同map的输入, 一个map可能处理多个块,可能处理多个文件。
// hive.map.aggr = true 是否在 Map 端进行聚合,默认为 True
// hive.groupby.mapaggr.checkinterval = 100000在 Map 端进行聚合操作的条目数目

    /** 二、reducer数量设置 **/
    //1 每个reduce任务处理的数据量,默认为1000^3=1G  (另外 mapred.reduce.tasks可以强制指定reduce的任务数量)
    spark.sql("set hive.exec.reducers.bytes.per.reducer=100000000")
    //2 hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
    //spark.sql("set hive.exec.reducers.max=999")
    //因此 计算reducer数N=min( hive.exec.reducers.max ,总输入数据量/ hive.exec.reducers.bytes.per.reducer )

    /** 三、设置小文件合并 **/
    //map输出文件合并
    spark.sql("set hive.merge.mapfiles=true")
    //reduce输出文件合并
    spark.sql("set hive.merge.mapredfiles=true")
    //合并文件的大小
    spark.sql("set hive.merge.size.per.task=256000000")

    /** 四、解决数据倾斜:分为两个MR job **/
    spark.sql("set hive.groupby.skewindata=true")

三、快速copy一个table

新建一个表 create table t2 like t1;
复制hdfs分区文件 hdfs dfs -cp dir_t1/* dir_t2/
在hive中修复分区 MSCK REPAIR TABLE t2;
**

修改表location并且迁移已有数据:
  1. 复制hdfs文件
  2. use app; alter table app_szsf_algo_pin_search_short_da partition(dt=‘2019-08-28’) set location “hdfs://ns1016/user/jd_ad/ads_polaris/feature_engeering/app_szsf_algo_pin_search_short_da/dt=2019-08-28” ;
  3. 注意:不可以用app. 会报错

四、Hive 不等于<> 和 != 陷阱

hive中的不等于符号 <>和!=基本同等作用。但是存在某种情况下查询无结果:

int <> 'string' 或者 int != 'string'
例如: 1 != '1' , 1<>'' 等,并不会报错,但是无返回结果!!!

五、hive和spark读表的block, partitions, cores等概念

https://blog.csdn.net/u013013024/article/details/72876427#comments

六、Join predict pushdown机制ppd

  1. http://allabouthadoop.net/what-is-predicate-pushdown-in-hive/
  2. https://blog.csdn.net/strongyoung88/article/details/81156271
  3. https://cwiki.apache.org/confluence/display/Hive/OuterJoinBehavior#OuterJoinBehavior-CaseW1:WherePredicateonPreservedRowTable
  4. left join on只会提前过滤右表,左表不受影响全部都会出来;where会提前过滤左表,但是不会提前过滤右表
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值