有点标题党了,但是大部分常用知识点也算是涉及到了,希望对你有帮助
其中计划执行的最小单元是一个个 operator,每个operator代表一个操作或者一个MR作业

image.png
create table day_hour_table (id int, content string) partitioned by (dt string, hour string);
ALTER TABLE table_name ADD PARTITION (dt='2018-06-02', hour='18')
ALTER TABLE table_name DROP PARTITION (dt='2018-06-02', hour='18')
LOAD DATA INPATH "/testFile" INTO TABLE table_name PARTITION(dt='2018-06-02', hour='18')
set hive.exec.dynamic.partition=true; 默认:false
set hive.exec.dynamic.partition.mode=nostrict; 默认:strict(至少有一个分区列是静态分区)
set hive.exec.max.dynamic.partitions.pernode; 每一个执行mr节点上,允许创建的动态分区的最大数量(100) set hive.exec.max.dynamic.partitions; 所有执行mr节点上,允许创建的所有动态分区的最大数量(1000) set hive.exec.max.created.files; 所有的mr job允许创建的文件的最大数量(100000)
from table_name1 insert overwrite table table_name2 partition(age, sex) select id, name, age, sex, address distribute by age, sex;
set hive.enforce.bucketing=true; 默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用) 注意:一次作业产生的桶(文件数量)和reduce task个数一致。
CREATE TABLE tb_name( id INT, name STRING, age INT) CLUSTERED BY (age) INTO 4 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table tb_name select id, name, age from source_tb_name;
select id, name, age from tb_name tablesample(bucket 1 out of 2 on age); 一共4个桶,抽取2(4/2)个bucket的数据,抽取第1、第3(1+2)个bucket的数据
beeline -u jdbc:hive2://hostname:10000/db_name -n username 进行hive的连接CREATE FUNCTION [db_name.] function_name AS class_name [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
create index t1_index on table tb_name1(name) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild in table t1_index_table; as:指定索引器; in table:指定索引表,若不指定默认生成在default__psn2_t1_index__表中
5.使用的时候根据索引条件查询能加快查询速度,但是由于索引表也是需要维护的,会带来额外开销。
当我们使用一些类似于 group by , join 等会产生 shuffle 语法的时候,
默认的 partition 方式都是通过 key 来决定的,
所以一般导致数据倾斜的原因都是 key 的分布不均匀。
a. 设置参数 :set hive.map.aggr=true ,开启 map 端的聚合功能,也就是 MR 程序中写的 combiner
b. 设置 set hive.groupby.skewindata=true ,开启Group By 产生数据倾斜优化
该处理方式是将一次group 操作进行了两次处理,
首先会对map端输入的数据进行随机分发给reduce端,
因为是随机的,所以数据会均匀分发给reduce 进行 group ,
然后对第一次group处理的数据再进行一次正常的 group操作,
因为有了第一次的处理,第二次处理的数据将会大大减少
从而使得数据倾斜问题不再明显。
严格来说,这并没有解决数据倾斜问题,
但是却大大减少了数据倾斜带来的影响
mapjoin 标记)b. 对于两张都是大表的情况, 我们可以想办法将一个大表转化为小表,然后采用 a 方案; 另外我们也可以使用分桶的思想,来加快join; 我们还可以根据业务,来避免这类问题, 比如:找到导致数据倾斜的 key 过滤出来额外处理。 很多时候,这个导致倾斜的 key 可能是一个脏数据,那么直接过滤就好了 其中 数据倾斜解决方案 这上面的一些方案也可以参考,
谈起优化,上面很大一部分内容都有涉及,这里我们主要谈谈 HQL 优化
select count(1) from (select distinct(uid) d_uid from t)
来优化distribute by一起使用sort by,
可以做到全局有序 所以上面这个问题可以通过
select a,b,c from t distribute by a sort by a asc, b desc
来解决
//union all
insert overwrite table t
select a,b,c
from t1
union all
select a,b,c from t2
//普通方式
insert overwrite table t
select a,b,c from t1
insert overwrite table t
select a,b,c from t2hive.limit.optimize.enable=true --- 开启对数据源进行采样的功能
hive.limit.row.max.size --- 设置最小的采样容量
hive.limit.optimize.limit.file --- 设置最大的采样样本数mapred.job.tracker=true 参数开启本地模式
当然,hive 也提供了自动开启本地模式的优化机制
通过 hive.exec.mode.local.auto开启自动执行,自动开启的条件如下:
1.job的输入数据量小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
2.job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
3.job的reduce数必须为0或者1hive.exec.parallel=true开启stage 是什么? hive 将sql 解析后自动生成的一个抽象概念,比如我们要做饭,那么这个 stage 就可以理解为:1.买菜买米,2.煮饭,3.炒菜,4.上桌。如果开启了并行执行那么,煮饭 和 炒菜 就可以一起执行了,当然前提是你要忙的过来,所以集群资源要足够才行,如果没开启,那么就傻傻的 先煮饭,饭熟了,再炒菜
mapred.job.reuse.jvm.num.tasks=1 可以设置每个JVM 执行的 task 数量为什么默认值是1 ? 因为如果JVM设置的task数量超过1,那么这个JVM只有等待其执行完自己指定的任务,或者整个 job执行完成才会退出释放资源。 我们可以来假设一下,我们有 6 个task分别是 1,2,3,4,5,6。对应执行的JVM 是 1到6 号,其中 1 需要1min 执行完,其余的都是1s执行完,如果一个jvm执行完一个任务就退出,那么可能在 2s 到 3s 的时候,就只有 1号JVM 占用资源了,而如果不是,2到6号 在 2-3s 执行完毕,但是因为有重用功能,会导致这几个 JVM 继续等待其他任务的派发,直到 1号JVM 执行完毕才会释放 ,导致资源的浪费。 所以才资源不是很充足的情况下,该功能还是要慎用噢~!
这里啰嗦一下,reduce的数量可能需要根据你自己的业务来设置一下, 没什么可说,但是 Map 一般都不会需要自己设置和优化, 因为默认一个 Map就是对应 hdfs 上的一个 block, 当hdfs block设置合理,并且小文件很少的情况, 那么 Map 一般也还算合理并不会有多大影响。
hive shell 就和 mysql shell 差不多的使用方式, 支持 repl 的方式进行数据查询, 这里我们主要来说明两个特殊的使用
hive> dfs -ls / !就 ok 了,比如:hive> !ls / 通过 hive --debug port=9999 来开启远程调,关于java 远程调试可以参考其他文章
可以参考:https://blog.csdn.net/yycdaizi/article/details/43341239