1、 Hive和数据库比较
Hive 和数据库除了拥有类似的查询语言,再无类似之处。
1)数据存储位置
Hive 存储在 HDFS 。数据库将数据保存在块设备或者本地文件系统中。
2)数据更新
Hive中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的,
3)执行延迟
Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
4)数据规模
Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。
2、 内部表和外部表
1)内部表又叫管理表:当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
2)外部表:删除该表并不会删除掉原始数据,删除的是表的元数据
3、Hive中order by,sort by,distribute by和cluster by的区别
Sort By:在同一个分区内排序
Order By:全局排序,只有一个Reducer;
Distrbute By:类似 MapReduce 中Partition,进行分区,一般结合sort by使用。
Cluster By:当 Distribute by 和 Sort by 字段相同时,可以使用Cluster by方式。Cluster by 除了具有 Distribute by 的功能外还兼具 Sort by 的功能。但是只能升序排序,不能指定排序规则为ASC或者DESC。
4、UDF、UDAF、UDTF的区别
当Hive自带的函数无法满足我们的业务处理需求时,hive允许我们自定义函数来满足需求。
根据自定义函数的类别分为以下三种:
UDF:User-Defined-Function,用户自定义函数,数据是一进一出,功能类似于大多数数学函数或者字符串处理函数;
UDAF:User-Defined Aggregation Function,用户自定义聚合函数,数据是多进一出,功能类似于 count/max/min;
UDTF:User-Defined Table-Generating Functions,用户自定义表生成函数,数据是一进多处,功能类似于lateral view explore();
5、Rank排名函数
- RANK() 排序相同时会重复,总数不会变;
- DENSE_RANK() 排序相同时会重复,总数会减少;
- ROW_NUMBER() 根据顺序计算排名。
在实际开发中,以上三个rank函数通常是和开窗函数一起使用的。
6、窗口函数(开窗函数)
OVER():用于指定分析函数工作时的数据窗口大小,这个数据窗口大小可能会随着行的变而变化;
CURRENT ROW:当前行;
n PRECEDING:往前n行数据;
n FOLLOWING:往后n行数据;
UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点;
LAG(col,n,default_val):往前第n行数据;
LEAD(col,n, default_val):往后第n行数据;
NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。这个函数需要注意:n必须为int类型。
7、行转列函数
7.1、CONCAt(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串。
例如: concat( aa, ‘:’, bb) 就相当于把aa列和bb列用冒号连接起来了,aa:bb。
7.2、CONCAT_Ws(separator, str1, str2,…):CONCAT_Ws() 代表 ConCAT With Separator ,是CONCAt()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_Ws()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
7.3、COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
8、列转行函数
8.1、EXPLODE(col):将hive某列中复杂的array或者map结构拆分成多行。
8.2、LATERAL VIEW:常和UDTF函数一起使用。
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
9、Hive的数据文件存储格式
texfile:默认的存储格式:普通的文本文件,数据不压缩,磁盘的开销比较大,分析开销大。
sequencefile:提供的一种二进制存储格式,可以切割,天生压缩。
rcfile:提供的是一种行列混合存储方式,该方式会把相近的行和列数据放在一块儿,存储比较耗时,查询效率高,也天生压缩。
orc:是rcfile的一种优化存储。
parquet:自定义输入输出格式
10、Hive中常用的系统函数有哪些
date_add(str,n)、date_sub(str,n) 加减时间
next_day(to_date(str),’MO’) 周指标相关,获取str下周一日期
date_format(str,’yyyy’) 根据格式整理日期
last_day(to_date(str)) 求当月最后一天日期
collect_set(col) 收集数据返回一个以逗号分割的字符串数组
get_json_object(jsondata,object) 解析json,使用object获取对象值
NVL(str,replace) 空字段赋值,str为空返回replace值;两个都为空则返回null
Kafka理论知识汇总01、什么是消息队列?
- 消息队列就是用于当两个系统之间或者两个模块之间实现消息传递时,基于队列机制实现数据缓存的中间件
02、消息队列有什么好处?
- 实现解耦,将高耦合转换为低耦合
- 通过异步并发,提高性能,并实现最终一致性
03、Kafka是什么?
- Kafka是一个基于订阅发布模式的高性能、高吞吐的实时消息队列系统
04、Kafka在大数据中用于什么场景下?
- 用于实时架构中,实现将实时数据采集的数据进行实时存储,供于SparkStreaming或者Flink等工具实现实时数据消费处理
05、请简述Kafka的集群架构
- Kafka是一个分布式主从架构集群
- 主节点:Kafka Controller:一种特殊的Broker,由ZK辅助实现从所有Broker中选举,负责集群管理,管理Topic及分区副本等
- 从节点:Kafka Broker:负责实现Kafka集群的数据存储
- Kafka依赖于Zookeeper实现集群辅助管理
- 基于Zookeeper辅助选举Controller
- 基于Zookeeper存储元数据
06、Kafka中消费者与消费者组的关系是什么?
- 消费者组负责订阅Topic,消费者负责消费Topic分区的数据
- 消费者组中可以包含多个消费者,多个消费者共同消费数据,增加消费并行度,提高消费性能
- 消费者组的id由开发者指定,消费者的id由Kafka自动分配
07、Kafka中Topic和Partition是什么,如何保证Partition数据安全?
- Topic:逻辑上实现数据存储的分类,类似于数据库中的表概念
- Partition:Topic中用于实现分布式存储的物理单元,一个Topic可以有多个分区
- 每个分区可以存储在不同的节点,实现分布式存储
- 保证数据安全通过副本机制:Kafka中每个分区可以构建多个副本【副本个数 <= 机器的个数】
- 将一个分区的多个副本分为两种角色
- leader副本:负责对外提供读写请求
- follower副本:负责与leader同步数据,如果leader故障,follower要重新选举一个成为leader
- 选举:由Kafka Crontroller来决定谁是leader
08、Kafka中的Segment是什么?
- Segment是对分区内部的数据进行更细的划分,分区段,文件段
- 规则:按照文件产生的时间或者大小
- 目的:提高写入和查询性能
- 文件名称可以用于检索数据:用offset命名的
- 组成:每个Segment由两个文件组成
- .log:存储的数据
- .index:对应.log文件的索引信息
09、Kafka中的Offset是什么?
- Offset是kafka中存储数据时给每个数据做的标记或者编号
- 分区级别的编号,每个分区从0开始编号
- 功能:消费者根据offset来进行消费,保证顺序消费以及消费数据的一次性语义
10、请简述如何使用Kafka Simple Java API 实现数据生产?描述具体的类及方法
- step1:构建生产者连接对象:KafkaProducer
- 需要配置对象:管理配置,例如连接地址:Properties
- step2:KafkaProducer:send:生产数据到Kafka中
- 需要构建一个生产的数据对象:ProducerRecord
- ProducerRecord(Topic,Value)
- ProducerRecord(Topic,Key,Value)
- ProducerRecord(Topic,Partition,Key,Value)
11、请简述如何使用Kafka Simple Java API 实现数据消费?描述具体的类及方法
- step1:构建消费者连接对象:KafkaConsumer
- 需要配置对象:管理配置,例如连接地址:Properties
- step2:消费者需要订阅Topic
- KafkaConsumer:subscribe(List)
- step3:消费数据
- KafkaConsumer:poll:实现拉取消费数据
- ConsumerRecords:拉取到的所有数据集合
- ConsumerRecord:消费到的每一条数据
- topic:获取数据中的Topic
- partition:获取数据中的分区编号
- offset:获取数据的offset
- key:获取数据中的Key
- value:获取数据中的Value
12、请简述Kafka生产数据时如何保证生产数据不丢失?
- acks机制:当接收方收到数据以后,就会返回一个确认的ack消息
- 生产者向Kafka生产数据,根据配置要求Kafka返回ACK
-
ack=0:生产者不管Kafka有没有收到,直接发送下一条
- 优点:快
- 缺点:容易导致数据丢失,概率比较高
-
ack=1:生产者将数据发送给Kafka,Kafka等待这个分区leader副本写入成功,返回ack确认,生产者发送下一条
- 优点:性能和安全上做了平衡
- 缺点:依旧存在数据丢失的概率,但是概率比较小
-
ack=all/-1:生产者将数据发送给Kafka,Kafka等待这个分区所有副本全部写入,返回ack确认,生产者发送下一条# 系列文章目录
- 优点:数据安全
- 缺点:慢
- 如果使用ack=all,可以搭配min.insync.replicas参数一起使用,可以提高效率
- min.insync.replicas:表示最少同步几个副本以后,就返回ack
-
- 如果生产者没有收到ack,就使用重试机制,重新发送上一条消息,直到收到ack
13、请简述Kafka生产数据时如何保证生产数据不重复?
- 数据重复的场景:Kafka写入数据,返回ack,但是ack丢失,生产者没有收到ack,重新写入数据,导致Kafka数据重复
- Kafka中使用幂等性机制来保证生产数据不重复
- step1:发送数据时,给每条数据增加一个数据id的编号,每次下一条数据的编号自增1
- step2:Kafka将数据写入,并记住写入的数据id
- step3:如果下一条数据的id与上一次的数据id一致,就不写入,直接返回ack
14、Kafka中生产者的数据分区规则是什么,如何自定义分区规则?
- 如果指定了分区:就写入指定的分区
- 如果没有指定分区,就判断是否指定了Key
- 如果指定了Key:根据Key的Hash取余分区
- 如果没有指定Key:根据黏性分区来实现
- 自定义分区
- 开发一个类实现Partitioner接口
- 实现partition方法
- 在生产者中指定分区器的配置
15、Kafka中消费者消费数据的规则是什么?
- 消费者根据Offset对Topic中的分区进行消费
- 第一次消费:根据auto.offset.reset属性进行消费
- latest:从最新的位置开始消费
- earliest:从头开始消费
- 第二次消费:根据上一次的offset+1继续消费
16、如果消费者遇到故障,Kafka怎么保证不重复不丢失?
- Kafka通过消费者commit Offset机制将每个消费者每次消费的位置存储在__consumer_offset中来保证每个消费者如果故障,依旧能从上一次的位置继续消费
17、Kafka写入数据过程是什么?
- step1:生产者构建批次,提交给Kafka集群
- step2:Kafka根据分区规则,检索元数据,将请求转发给Leader副本对应Broker
- step3:先写Broker的PageCache
- step4:后台实现将PageCache中顺序写同步到磁盘中:.log文件
- step5:Follower同步Leader副本的数据
18、Kafka读取数据过程是什么?
- step1:消费者请求读取数据:Topic+Partition+Offset
- step2:Kafka根据元数据,找到对应分区的leader副本进行检索
- step3:先检索PageCache
- 如果有,就通过零拷贝机制从PageCache中读取数据
- 如果没有,就读取Segment文件段
- step4:先根据Offset找到对应的Segment的一对文件
- step5:先读index,找到offset对应的数据在.log文件中的最近位置
- step6:根据位置,读取.log文件
19、为什么Kafka读写会很快?
- 写很快
- 应用了PageCache的页缓存机制
- 顺序写磁盘的机制
- 读很快
- 优先基于PageCache内存的读取,使用零拷贝机制
- 按照Offset有序读取每一条
- 构建Segment文件段
- 构建index索引
20、为什么要设计Segment?
- 加快查询效率:将数据划分到多个小文件中,通过offset匹配可以定位某个文件,从小数据量中找到需要的数据
- 提高删除性能:以Segment为单位进行删除,避免以每一条数据进行删除,影响性能
21、什么是AR、ISR、OSR?
- AR:all replicas
- 所有副本 = ISR + OSR
- ISR:In-sync-replicas
- 表示正在同步的副本 => 可用副本分区
- 如果Leader故障,会从ISR中选举一个新的leader
- OSR:Out-sync-replicas
- 表示不健康的副本 => 不可用副本
- 判断依据
#如果这个从副本在这个时间内没有与leader副本同步数据,认为这个副本是不正常的
replica.lag.time.max.ms = 10000
22、什么是HW、LEO?
- HW:表示当前leader副本中所有Follower都已经同步的位置 + 1,高水位线
- LEO:表示当前leader副本最新的数据位置 + 1
- 消费者能消费到的位置是HW:为了保证消费者消费分区数据的统一性
23、什么是一次性语义?
- at-most-once:最多一次
- at-least-once:至少一次
- exactly-once:有且仅有一次
24、Kafka如何保证消费者消费数据不重复不丢失?
- Kafka消费者通过Offset实现数据消费,只要保证各种场景下能正常实现Offset的记录即可
- 保证消费数据不重复需要每次消费处理完成以后,将Offset存储在外部存储中,例如MySQL、Zookeeper、Redis中
- 保证以消费分区、处理分区、记录分区的offset的顺序实现消费处理
- 如果故障重启,只要从外部系统中读取上一次的Offset继续消费即可
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)