hive优化
在学习hive的时候,就要像说下hive和hadoop集群之间的关系了,
Hive利用HDFS存储数据,利用MapReduce查询数据
hive最适合于数据仓库程序,对于数据仓库程序不需要实时响应查询,不需要记录级别的插入、更新和删除。因此hive不适用于联机事务处理,可以用于联机分析处理。
上图都是来解释hive的一个运行情况,
- 用户可以使用JDBC、ODBC、CLI等连接hive
- 需要开启Thrift Server 服务,这样会将hive当做一个服务器,用户作为客户端连接该服务器处理,
- 通过Driver(驱动模块)对输入进行解析编译
- hive通过JobTracker通信来初始化MapReduce任务(job)
hive的优化
可以从以下几点入手:
-
设置map、reduce、及java堆内存的大小
//每个节点生成动态分区的最大个数,默认是100
set hive.exec.max.dynamic.partitions.pernode=10000;
//一个DML操作可以创建的最大动态分区数,默认是1000
set hive.exec.max.dynamic.partitions=100000;
有时候内存溢出会报错,可以减小set mapred.max.split.size的值(增加map的数量),增加map内存
set mapred.max.split.size=25600000;(切片大小的值不要随意更改)
set mapreduce.map.memory.mb=8192;
set mapreduce.reduce.memory.mb=8192;
set mapred.child.java.opts=-Xmx6144m; -
并行执行
set hive.exec.parallel=true; -
设置中间结果压缩
set mapred.map.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec;
如果发生数据倾斜,可以尝试设置此参数
hive.groupby.skewindata=true
-
配置如下参数,可以开启Hive的本地模式(使用本地模式执行可以使hive执行的更快些):
set hive.exec.mode.local.auto=true;(默认为false)当一个job满足如下条件才能真正使用本地模式:
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或者1 -
其他配置
hive.merge.mapfiles; //设置map读取数据是合并小文件
hive.exec.parallel; //任务并行执行
hive.exec.reducers.bytes.per.reducer //多少个字节的数据产生一个reduce
hive.exec.reducers.max //reduce的最大个数
hive.exec.default.partition.name //hive默认分区名字,碰到值为空或者null,数据就到默认分区
hive.exec.mode.local.au0to //决定Hive是否应该自动地根据输入文件大小,在本地运行
hive.auto.convert.join //开关map join模式
hive.groupby.skewindata //数据倾斜 -
还有就是自己电脑的硬件问题了~