没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
13页
大数据企业级调优的完整过程:9.1 Fetch抓取;9.2 本地模式;9.3 表的优化(9.3.1 小表、大表Join;9.3.2 大表Join大表;9.3.3 MapJoin;9.3.4 Group By;9.3.5 Count(Distinct) 去重统计;9.3.6 笛卡尔积;9.3.7 行列过滤;9.3.8 动态分区调整;9.3.9 分桶;9.3.10 分区);9.4 数据倾斜(9.4.1 合理设置Map数;9.4.2 小文件进行合并;9.4.3 复杂文件增加Map数;9.4.4 合理设置Reduce数。);9.5 并行执行;9.6 严格模式;9.7 JVM重用;9.8 推测执行;9.9 压缩;9.10 执行计划(Explain)
资源推荐
资源详情
资源评论
第 9 章 企业级调优
9.1 Fetch 抓取
Fetch 抓取是指,Hive 中对某些情况的查询可以不必使用 MapReduce 计算。例如:
SELECT * FROM employees;在这种情况下,Hive 可以简单地读取 employee 对应的存储目录
下的文件,然后输出查询结果到控制台。
在 hive-default.xml.template 文件中 hive.fetch.task.conversion 默认是 more,老版本 hive
默认是 minimal,该属性修改为 more 以后,在全局查找、字段查找、limit 查找等都不走
mapreduce。
<property>
<name>hive.fetch.task.conversion</name>
<value>more</value>
<description>
Expects one of [none, minimal, more].
Some select queries can be converted to single FETCH task minimizing latency.
Currently the query should be single sourced not having any subquery and
should not have
any aggregations or distincts (which incurs RS), lateral views and joins.
0. none : disable hive.fetch.task.conversion
1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
2. more : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual
columns)
</description>
</property>
案例实操:
1)把 hive.fetch.task.conversion 设置成 none,然后执行查询语句,都会执行 mapreduce
程序。
hive (default)> set hive.fetch.task.conversion=none;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
2)把 hive.fetch.task.conversion 设置成 more,然后执行查询语句,如下查询方式都不会
执行 mapreduce 程序。
hive (default)> set hive.fetch.task.conversion=more;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
9.2 本地模式
大多数的 Hadoop Job 是需要 Hadoop 提供的完整的可扩展性来处理大数据集的。不过,
有时 Hive 的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能
会比实际 job 的执行时间要多的多。对于大多数这种情况,Hive 可以通过本地模式在单台机
器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
用户可以通过设置 hive.exec.mode.local.auto 的值为 true,来让 Hive 在适当的时候自动
启动这个优化。
set hive.exec.mode.local.auto=true; //开启本地 mr
//设置 local mr 的最大输入数据量,当输入数据量小于这个值时采用 local mr 的方式,默认为
134217728,即 128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;
//设置 local mr 的最大输入文件个数,当输入文件个数小于这个值时采用 local mr 的方式,默
认为 4
set hive.exec.mode.local.auto.input.files.max=10;
案例实操:
1)开启本地模式,并执行查询语句
hive (default)> set hive.exec.mode.local.auto=true;
hive (default)> select * from emp cluster by deptno;
Time taken: 1.328 seconds, Fetched: 14 row(s)
2)关闭本地模式,并执行查询语句
hive (default)> set hive.exec.mode.local.auto=false;
hive (default)> select * from emp cluster by deptno;
Time taken: 20.09 seconds, Fetched: 14 row(s)
9.3 表的优化
9.3.1 小表、大表 Join
将 key 相对分散,并且数据量小的表放在 join 的左边,这样可以有效减少内存溢出错误
发生的几率;再进一步,可以使用 map join 让小的维度表(1000 条以下的记录条数)先进
内存。在 map 端完成 reduce。
实际测试发现:新版的 hive 已经对小表 JOIN 大表和大表 JOIN 小表进行了优化。小表
放在左边和右边已经没有明显区别。
案例实操
1.需求
测试大表 JOIN 小表和小表 JOIN 大表的效率
2.建大表、小表和 JOIN 后表的语句
// 创建大表
create table bigtable(id bigint, time bigint, uid string, keyword string,
url_rank int, click_num int, click_url string) row format delimited fields
terminated by '\t';
// 创建小表
create table smalltable(id bigint, time bigint, uid string, keyword string,
url_rank int, click_num int, click_url string) row format delimited fields
terminated by '\t';
// 创建 join 后表的语句
create table jointable(id bigint, time bigint, uid string, keyword string,
url_rank int, click_num int, click_url string) row format delimited fields
terminated by '\t';
3.分别向大表和小表中导入数据
hive (default)> load data local inpath '/opt/module/datas/bigtable' into table
bigtable;
hive (default)>load data local inpath '/opt/module/datas/smalltable' into table
smalltable;
4.关闭 mapjoin 功能(默认是打开的)
set hive.auto.convert.join = false;
5.执行小表 JOIN 大表语句
insert overwrite table jointable
select b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
from smalltable s
left join bigtable b
on b.id = s.id;
Time taken: 35.921 seconds
6.执行大表 JOIN 小表语句
insert overwrite table jointable
select b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
from bigtable b
left join smalltable s
on s.id = b.id;
Time taken: 34.196 seconds
9.3.2 大表 Join 大表
1.空 KEY 过滤
有时 join 超时是因为某些 key 对应的数据太多,而相同 key 对应的数据都会发送到相同
的 reducer 上,从而导致内存不够。此时我们应该仔细分析这些异常的 key,很多情况下,
这些 key 对应的数据是异常数据,我们需要在 SQL 语句中进行过滤。例如 key 对应的字段
为空,操作如下:
案例实操
(1)配置历史服务器
配置 mapred-site.xml
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
启动历史服务器
sbin/mr-jobhistory-daemon.sh start historyserver
查看 jobhistory
http://192.168.1.102:19888/jobhistory
(2)创建原始数据表、空 id 表、合并后数据表
// 创建原始表
create table ori(id bigint, time bigint, uid string, keyword string, url_rank int,
click_num int, click_url string) row format delimited fields terminated by '\t';
// 创建空 id 表
create table nullidtable(id bigint, time bigint, uid string, keyword string,
url_rank int, click_num int, click_url string) row format delimited fields
terminated by '\t';
// 创建 join 后表的语句
create table jointable(id bigint, time bigint, uid string, keyword string, url_rank
剩余12页未读,继续阅读
资源评论
都来学
- 粉丝: 8
- 资源: 165
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功