1.hive 数据格式之间的区别
textfile :默认存储格式,行存储,每一行是一条记录,每行以换行符进行结尾(\n),数据不做压缩,磁盘开销大,数据解析开销大。
优点:最简单的数据格式,便于查看和编辑,加载较快
缺点:耗费存储空间,I/O性能较低;Hive不进行数据切分合并,不能进行并行操作,查询效率低
适用场景:小型查询,需要查看数据文件内容
sequenceFile:由键值对组成的二进制文件,行存储,使用方便,可分隔,可压缩
优点:可压缩、可分割,优化磁盘利用率和I/O;可并行操作数据,查询效率高
缺点:存储空间消耗最大,对hadoop 生态系统以外的工具不适用
查看SecequenceFile:hdfs dfs -text sequenceFile 文件路径
ORC:列式存储,HIve从大型表读取、写入和处理数据时,使用orc文件可以提高性能
数据按行分块 每块按列存储
特点:压缩快,快速列存取、是rcfile的改良版本。
缺点:加载时性能消耗较大;需要通过text文件转化加载;
应用场景:适用于Hive中大型的存储、查询
parquet:
Parquet文件是以二进制方式存储的,不可以直接读取和修改,文件是自解析的,文件中包括该文件的数据和元数据。
优点:Parquet能够很好的压缩和编码,有良好的查询性能,支持优先的模式演进。
缺点:写速度通常比较慢,不支持update、insert,delete、ACID等特性。
应用场景:适用于字段数非常多,无更新、只取部分列的查询。
2.spark 与MR 的区别
例如:select count(cost),id from tb.在spark 与MR的区别
首先Spark是借鉴了mapreduce并在其基础上发展起来的,继承了其分布式计算的优点并改进了mapreduce
1).spark把运算的中间数据存放在内存,迭代计算效率更高;mapreduce的中间结果需要落地,需要保存到磁盘,存在磁盘io,影响性能
2).spark容错性高,它通过弹性分布式数据集RDD来实现高效容错,Rdd是一组分布式的存在于节点内存中的只读的数据集,当出现错误时,可以通过整个数据集计算流程的血缘关系
进行重建,mapreduce的话容错可能只能重新计算了,成本较高
3).spark更加通用,spark提供了transformation和action这两大类的多个功能api,另外还有流式处理,sparkstreaming模块、图计算GraphX等等;mapreduce只提供了map和reduce两种操作,流计算以及其他模块的支持比较缺乏
4)spark框架和生态更为复杂,首先有RDD、血缘lineage、执行时的有向无环图DAG、stage划分等等,很多时候spark作业都需要根据不同业务场景的需要进行调优已达到性能要求;mapreduce框架及其生态相对较为简单,对性能的要求也相对较弱,但是运行较为稳定,适合长期后台运行
3.sparkStreaming 如何保证消费kafka 数据时的一致性
Kafka与Spark Streaming集成时有两种方法:旧的基于receiver的方法,新的基于direct stream的方法
基于Receiver 的api 只能保证at least once :通过引人WAL 来确保数据不会丢失,但还有可能会出现消息已经写入WAL,但offset更新失败的情况,Kafka就会按上一次的offset重新发送消息
directStream:
driver进程只需要每次从Kafka获得批次消息的offset range,然后executor进程根据offset range去读取该批次对应的消息即可。由于offset在Kafka中能唯一确定一条消息,且在外部只能被Streaming程序本身感知到,因此消除了不一致性,达到了exactly once
Spark RDD之所以被称为“弹性分布式数据集”,是因为它具有不可变、可分区、可并行计算、容错的特征。一个RDD只能由稳定的数据集生成,或者从其他RDD转换(transform)得来。如果在执行RDD lineage的过程中失败,那么只要源数据不发生变化,无论重新执行多少次lineage,都一定会得到同样的、确定的结果
4.SQL 求每个年龄成绩最高的学生前十位
select id ,score from(select id ,score ,row _number() over(partition by age order by score desc) rank from a ) where rank<=10
5.何为dsp,ssp,adx,msdk
6.在MR过程中为啥要合并多个溢写文件
7.hive 参数优化
1.map join:
hive.auto.convert.join=true
.hive.mapjoin.smalltable.filesize=600M(default 25M)
强制指定对a表做 map join select /+MAP JOIN(a)+/…a join b
2.并行执行:
hive的物理执行任务默认情况下是一个job执行完了之后再执行其它job,这种情况下如果想加快hive job的执行的话,可以采用并行的方式执行
hive.exec.parallel=true(设置并行执行)
hive.exec.parallel.thread.number=8(同一个sql允许并行任务的最大线程数)
3.数据量超过 map 或者 reduce task 的内存大小。所以 yarn 不得不讲整个任务杀死
set mapreduce.map.memory.mb=4096;
set mapreduce.map.java.opts=-Xmx4096m;
set mapreduce.reduce.memory.mb=4096;
set mapreduce.reduce.java.opts=-Xmx4096m;
4.动态分区
hive 帮我们生成新的分区
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;
https://www.deeplearn.me/1536.html
http://www.itongji.cn/detail?type=99993313
5)小文件参数
// 输出合并小文件
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; -- 当输出文件的平均大小
小于 16m 该值时,启动一个独立的 map-reduce 任务进行文件 merge
6)调节hive 数据倾斜
hive.map.aggr = true
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。
7).fetch task 参数设置
8.hive 中是如何进行小表分发的
MapJoin简单说就是在Map阶段将小表读入内存,顺序扫描大表完成Join。减少昂贵的shuffle操作及reduce操作
MapJoin分为两个阶段:
通过MapReduce Local Task,将小表读入内存,生成HashTableFiles上传至Distributed Cache中,这里会HashTableFiles进行压缩。
MapReduce Job在Map阶段,每个Mapper从Distributed Cache读取HashTableFiles到内存中,顺序扫描大表,在Map阶段直接进行Join,将数据传递给下一个MapReduce任务。
9.如何编写hive使hive执行的更快
1.在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce
10.数组与链表的实用场景
11.汉字一与字符一
12 数仓模型
13.请说明hive中 Sort By,Order By,Cluster By,Distrbute By各代表什么意思?
order by:会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)。只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
sort by:不是全局排序,其在数据进入reducer前完成排序。
distribute by:按照指定的字段对数据进行划分输出到不同的reduce中。
cluster by:除了具有 distribute by 的功能外还兼具 sort by 的功能。
14.Hive的函数:UDF、UDAF、UDTF的区别?
UDF:单行进入,单行输出
UDAF:多行进入,单行输出
UDTF:单行输入,多行输出
15. hive 执行sql 的流程
16.hive 优化的原理
17.在存在spark context 之后为啥要创建spark session
1.SparkSession是Spark 2.0引如的新概念。SparkSession为用户提供了统一的切入点,来让用户学习spark的各项功能。
2.在spark的早期版本中,SparkContext是spark的主要切入点,由于RDD是主要的API,我们通过sparkcontext来创建和操作RDD。对于每个其他的API,我们需要使用不同的context。例如,对于Streming,我们需要使用StreamingContext;对于sql,使用sqlContext;对于Hive,使用hiveContext。但是随着DataSet和DataFrame的API逐渐成为标准的API,就需要为他们建立接入点。所以在spark2.0中,引入SparkSession作为DataSet和DataFrame API的切入点,SparkSession封装了SparkConf、SparkContext和SQLContext。为了向后兼容,SQLContext和HiveContext也被保存下来。
3.SparkSession实质上是SQLContext和HiveContext的组合(未来可能还会加上StreamingContext),所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。SparkSession内部封装了sparkContext,所以计算实际上是由sparkContext完成的。
18.dataframe 是如何变成表的
19.spark rdd 内部源码实现及lineage 如何实现的
20.集合框架
Collection:list set
Map:hashmap ,treemap,hashtable,LinkedHashMap,ConcurrentHashMap,Properties
List:ArrayList,LinkedList,Stack,Vector
Set:HashSet,TreeSet,LinkedHashSet
21.hashmap 原理及hashmap 为啥线程不安全
hashmap 线程不安全表现在:多线程环境下扩容出现死循环 并且在多个线程进行插入是会出现覆盖
底层实现:1.7 数组+链表 1.8 数组+链表+红黑树 解决链表太长导致的查询速度变慢
hashmap 的初始容量,加载因子,扩容:初始容量为16,加载因子0.75 ,扩容增量为原始增量的一倍,hashmap 扩容指的是数组+链表+红黑树中的元素个数超过12 后开始扩容
hashmap 插入:调用put() 来传递键值,先对键调用hashcode() 返回bucket 位置来存储entry,当两个键的hash发送冲突时,会在每一个bucket 后面加上链表,如果链表长度超过8 ,会被转成红黑树来解决,新存储的键值对放在表头
键值对插入hashmap 中时,key 的hash 值将与length-1(全为1) 进行&运算,实现key 的定位,2的幂次方可以减少冲突(不是2的幂次方时会出现有些位置无法插入数据)
hashmap 获取:get(),根据hashcode 找到对应的bucket,再根据equals来在链表中找到对应的值
解决hash 冲突:拉链法,线性探测再散列法
22.hashmap 与hashtable /concurrenthashmap区别
hashmap 没有考虑同步,线程不安全;hashtable 使用synchronized关键字,线程安全
hashmap 允许null 为key,hashtable 不允许null 为key/value
concurrenthashmap 结合hashmap 与hashtable 二者优势。hashmap 没有考虑同步,hashtable 在每次同步时都要锁住整个结构。concurrenthashmap 的锁是稍微细粒度的,concurrenthashmap 将hash表分成16个桶3,get,put,remove 等常用操作只需要锁上当前需要用的桶
23.concurrethashmap 如何实现线程安全的及锁的类型
具体实现:
concurrenthashmap 中包含两个静态内部类:mapentry 与segment ,前者用来封装映射表的键值对,后者用来充当锁 segment 是一种可重入的锁,每个segment 守护一个hashentry 数组里面的元素,当对hashentry 里面的数据进行修改时必须先获得segment 锁
https://www.cnblogs.com/hustzzl/p/9343797.html
24.spark sql函数实现wordcount
25.hive 分桶及使用
分区提供了一个隔离数据和优化查询的便利方式,但是并非所有数据都可以形成合理的分区,尤其是需要确定合适分区大小的分区划分方式。(不合理的数据分区划分方式可能导致有的分区数据过多,而某些分区没有什么数据的尴尬情况),分桶是将数据集分解为更加容易管理的若干部分的另一种技术
数据分桶原理:按照分桶字段的hash 值对分桶个数取模
26.spark on yarn 执行过程及与spark on client区别
27.mysql 索引
28.oracle 与mysql的区别
29.MR shuffle 与spark shuffle 区别
30.vi less和more
31.spark transformation 算子与action 算子之间有32.collect_list()
33.spark dag/spark 如何调度的
34.flink checkpoint 内部实现原理
35.flink 窗口类型
36.Flink 容错性机制- 屏障(barrier)实现原理
37.spark 内存模型
38.spark out of memory shuffle file not find 啥错误
39.trait 与类的区别
40.伴生类与伴生对象
41.广播变量与累加器,广播变量的作用
42.spark yarn 执行过程及资源申请过程
43.谓词下推
44.spark exector-core 指的什么,container指的什么,并行度如何指定,spark broadcast, 红黑树
45,spark checkpoint干啥的,三种缓存区别
46.kudu 的主键如何设置
47. map join 与left semi join 区别 实现
48.循环链表
49.二叉树最长深度
50.spark shuffle 具体实现
51.flink watermark
52.kafka topic 怎么读,当partition 多于consumer 时怎么读
53..你认为数仓之中哪一层最有价值,为什么数仓分层要如此设计
54.你是如何去设计数仓表的,为什么要这样设计及他们对你的业务有什么帮助
55.多个用户群体A,B,C,如何快速的求取出在A,B 用户群体中但不在C 用户群体中的用户(bitmap)
56.一亿用户,每个用户均有一个分数,分数区间为1到100万,快速的求出每个用户分数的排名
57.如何层次遍历有向无环图
58.如何判断一个链表是否含有环
59.求出1到n 中含有1 的个数