大多数的
Hadoop Job
是需要
Hadoop
提供的完整的可扩展性来处理大数据集的。不过,
有时
Hive
的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能
会比实际
job
的执行时间要多的多。对于大多数这种情况,
Hive
可以通过本地模式在单台机
器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
用户可以通过设置
hive.exec.mode.local.auto
的值为
true
,来让
Hive
在适当的时候自动
启动这个优化。
1
)案例实操:
(2)关闭本地模式(默认是关闭的),并执行查询语句
hive (default)> select count(*) from emp group by deptno;
(1)开启本地模式,并执行查询语句
hive (default)> set hive.exec.mode.local.auto=true;
hive (default)> select count(*) from emp group by deptno;
4
表的优化
4.1
小表大表
Join
(
MapJOIN
)
将
key
相对分散,并且数据量小的表放在
join
的左边,可以使用
map join
让小的维度表
先进内存。在
map
端完成
join
。
实际测试发现:新版的
hive
已经对小表
JOIN
大表和大表
JOIN
小表进行了优化。小表放
在左边和右边已经没有区别。
1
)需求介绍
测试大表
JOIN
小表和小表
JOIN
大表的效率
2
)开启
MapJoin
参数设置
(1)设置自动选择
Mapjoin
set hive.auto.convert.join = true;
默认为
true
(2)大表小表的阈值设置(默认
25M
以下认为是小表):
set hive.mapjoin.smalltable.filesize = 25000000;
3
)
MapJoin
工作机制
4)建大表、小表和 JOIN 后表的语句
5)分别向大表和小表中导入数据
6)小表 JOIN 大表语句
7)大表 JOIN 小表语句
4.2 大表 Join 大表
1
)空
KEY
过滤
有时
join
超时是因为某些
key
对应的数据太多,而相同
key
对应的数据都会发送到相同
的
reducer
上,从而导致内存不够。此时我们应该仔细分析这些异常的
key
,很多情况下,
这些
key
对应的数据是异常数据,我们需要在
SQL
语句中进行过滤。例如
key
对应的字段为
空,操作如下:
案例实操
(1)配置历史服务器
配置
mapred-site.xml
启动历史服务器
sbin/mr-jobhistory-daemon.sh start historyserver
查看
jobhistory
http://hadoop102:19888/jobhistory
(2)创建原始数据空
id
表
(3)分别加载原始数据和空
id
数据到对应表中
(4)测试不过滤空
id
(5)测试过滤空
id