请选择 进入手机版 | 继续访问电脑版
楼主: brooklet
1174 1

[数据库引擎开发] 大数据技术之高频面试题(四):涉及技术Hive、Hbase [推广有奖]

  • 1关注
  • 1粉丝

讲师

90%

还不是VIP/贵宾

-

威望
0
论坛币
6875 个
通用积分
39.3190
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
54815 点
帖子
162
精华
0
在线时间
688 小时
注册时间
2017-9-25
最后登录
2024-1-18

brooklet 发表于 2020-9-28 08:17:22 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
1.Hive与关系型数据库的区别?
2.Hive中内部表和外部表的区别是什么?
3.Hive中几种By的区别是什么?
4.Hive如何进行优化?
5.HBase中RowKey的设计原则是什么,应该如何进行设计?


4.6 Hive总结
4.6.1 Hive的架构


4.6.2 Hive和数据库比较

Hive 和数据库除了拥有类似的查询语言,再无类似之处。

1)数据存储位置

Hive 存储在 HDFS 。数据库将数据保存在块设备或者本地文件系统中。

2)数据更新

Hive中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的,

3)执行延迟

Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

4)数据规模Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。


4.6.3 内部表和外部表

1)管理表:当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。

2)外部表:删除该表并不会删除掉原始数据,删除的是表的元数据


4.6.4 4个By区别

1)Sort By:分区内有序;

2)Order By:全局排序,只有一个Reducer;

3)Distrbute By:类似MR中Partition,进行分区,结合sort by使用。

4) Cluster By:当Distribute by和Sorts by字段相同时,可以使用Cluster by方式。Cluster by除了具有Distribute by的功能外还兼具Sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。


4.6.5 窗口函数

RANK() 排序相同时会重复,总数不会变

DENSE_RANK() 排序相同时会重复,总数会减少

ROW_NUMBER() 会根据顺序计算

1) OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化

2)CURRENT ROW:当前行

3)n PRECEDING:往前n行数据

4) n FOLLOWING:往后n行数据

5)UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点

6) LAG(col,n):往前第n行数据

7)LEAD(col,n):往后第n行数据

8) NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。


4.6.6 自定义UDF、UDTF

在项目中是否自定义过UDF、UDTF函数,以及用他们处理了什么问题,及自定义步骤?

1)自定义过。

2)用UDF函数解析公共字段;用UDTF函数解析事件字段。

自定义UDF:继承UDF,重写evaluate方法

自定义UDTF:继承自GenericUDTF,重写3个方法:initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close

为什么要自定义UDF/UDTF,因为自定义函数,可以自己埋点Log打印日志,出错或者数据异常,方便调试.

4.6.7 Hive优化

1)MapJoin

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

2)行列过滤

列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。

行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。

3)采用分桶技术

4)采用分区技术

5)合理设置Map数

(1)通常情况下,作业会通过input的目录产生一个或者多个map任务。
主要的决定因素有:input的文件总个数,input的文件大小,集群设置的文件块大小。

(2)是不是map数越多越好?
答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的map数是受限的。

(3)是不是保证每个map处理接近128m的文件块,就高枕无忧了?
答案也是不一定。比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时。
针对上面的问题2和3,我们需要采取两种方式来解决:即减少map数和增加map数;

6)小文件进行合并

在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。

7)合理设置Reduce数

Reduce个数并不是越多越好

(1)过多的启动和初始化Reduce也会消耗时间和资源;

(2)另外,有多少个Reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;

在设置Reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的Reduce数;使单个Reduce任务处理数据量大小要合适;

8)常用参数

  • // 输出合并小文件
  • SET hive.merge.mapfiles = true; -- 默认true,在map-only任务结束时合并小文件
  • SET hive.merge.mapredfiles = true; -- 默认false,在map-reduce任务结束时合并小文件
  • SET hive.merge.size.per.task = 268435456; -- 默认256M
  • SET hive.merge.smallfiles.avgsize = 16777216; -- 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge


4.7 HBase总结
4.7.1 HBase存储结构


4.7.2 rowkey设计原则

1)rowkey长度原则

2)rowkey散列原则

3)rowkey唯一原则


4.7.3 RowKey如何设计

(1)生成随机数、hash、散列值

(2)字符串反转


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:hbase 大数据技术 Hive Base 大数据

三重虫 发表于 2022-1-5 13:00:44 |显示全部楼层 |坛友微信交流群

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-28 19:37