- 1. 怎么查看Hive有什么函数?怎么查看函数的详细信息?
- 2. 写出你常用的HDFS命令?
- 3. Redis分布式锁怎么实现?
- 4. HDFS文件系统中,FSimage和Edit的区别?
- 5. Flume的拦截器做了什么?
- 6. HDFS如何保证数据安全性?
- 7. Hive跟HBase的区别是什么?
- 8. 请说明Hive中Sort by, Order by, Cluster by, Distribute by 各代表什么意思?
- 9. Kafka零拷贝的原理?
- 10. HiveSql语句中SELECT FROM WHERE GROUP BY LIMIT ORDER BY的执行顺序?
- 11. Hive为什么要做分区,Hive的元数据在哪?
- 12. Yarn调度策略?
- 13. 描述MR中shuffle的过程及作用?
- 14. Hbase如何读取数据?如何写数据?
- 15. Kafka的偏移量Offset存放在哪儿,为什么?
- 16. 简单描述Hbase的Rowkey的设计原则?
- 17. Redis缓存穿透、缓存血崩、缓存击穿?
- 18. Zookeeper的选举机制,以及我们还可以用zookeeper做些什么?
- 19. Flume丢不丢数据?
- 20. 列式存储和行式存储的区别?
- 21. 说一下Hive怎么优化?
- 22. 简述Redis的热键问题,以及Redis的数据类型。
- 23. Flume事务实现?
- 24. 数据同样存在HDFS,为什么HBase支持在线查询?
- 25. Flume的HDFS Sink对小文件的处理?
- 26. Hive自定义哪些UDF函数?
- 28. 谈谈数据倾斜,如何发生的,并给出优化方案?
- 29. Hadoop优化时经常修改的配置文件和其中配置项?
- 30. Mysql的索引如何理解?常用引擎是什么?有什么区别?比较Redis和Mysql的区别?说一下各自的持久化机制?
1. 怎么查看Hive有什么函数?怎么查看函数的详细信息?
查看系统自带函数:show functions
查看函数的详细信息:desc function pow
2. 写出你常用的HDFS命令?
hdfs dfs -ls /-mkdir /usr 创建目录-moveFromLocal 从本地剪切到HDFS-moveToLocal 从HDFS剪切到本地-rm 移除文件-cp 在HDFS上进行文件拷贝-rmdir 删除空目录-put 本地文件复制到HDFS
3. Redis分布式锁怎么实现?
分布式锁是控制分布式系统之间同步访问共享资源的一种方式,其具体实现方式是使用Set命令获取分布式锁,使用Redis+lua脚本释放锁,生产中使用redisson。
4. HDFS文件系统中,FSimage和Edit的区别?
Fsimage镜像文件:是元数据的持久化检查点,包含HDFS文件系统的所有目录和文件的元数据信息,但不包含文件块位置信息。文件块位置信息只存储在内存中,是在DataNode加入集群的时候,NameNode询问Datanode得到的,并且不断更新。
Edits编辑日志:记录HDFS文件系统的所有更改操作(文件创建,删除或修改),文件系统客户端执行的更改操作首先被记录到Edits文件中。
相同点:Fsimage,Edits文件都是经过序列化的,Namenode启动时,会将Fsimage文件中的内容加载到内存中,然后执行Edits文件的各项操作。使得内存中的元数据和实际的同步。
不同点:客户端对HDFS的操作都会被记录到Edits文件中,成功后,再更新到内存元数据中,不会再FSimage中更新,因为FSimage一般都很大,频繁更新会导致系统缓慢。5. Flume的拦截器做了什么?
拦截器起到过滤器的作用,位置在source和channel之间,指定拦截器后,拦截器可以对event进行保留或者舍弃,舍弃的数据不会到Channel中。
6. HDFS如何保证数据安全性?
HDFS是Master/Slave架构,可有主备Master节点,以及多个DataNode,而且HDFS上文件是多副本存在。
- 文件的副本尽量会分散在不同的机架上。
- DataNode会以Block为单位,没3秒钟报告心跳状态,十分钟内Namenode没有接到Block则认为Block已经死掉,会在其他的DataNode上进行副本的新备份。
7. Hive跟HBase的区别是什么?
Hive:是基于Hadoop的数据仓库工具,可以将结构化数据映射成一张表,并且提供类似于SQL查询对海量的数据进行分析。hiveSql的本质是MR或者Tez、Spark程序。
Hbase:是一个列式存储的分布式数据库系统,具有可伸缩,高性能,高可靠的特点,支持单行事务,基于HDFS。适合并发量的查询,不适合用作数据分析。8. 请说明Hive中Sort by, Order by, Cluster by, Distribute by 各代表什么意思?
Sort by:会在每个reduce中排序,全局无序,但是分区内有序。
Order by:对输入做全局排序,只有一个reduce,数据规模大时,会消耗很大的时间。
Distribute by:根据字段进行分区,类似MR中的Partition,进行分区,结合Sort by使用。
Cluster by:当Distribute by和Sort by字段相同时,可以使用Cluster by代替使用。但是排序只能说升序。9. Kafka零拷贝的原理?
零拷贝并不是不需要拷贝,而是减少不必要的拷贝次数,通常是在说IO读写过程中。
在一般读取文件再通过网络发送数据通常要经过1~4次的Copy
a. 将文件从磁盘读取到操作系统的内核缓冲区
b. 将内核缓冲区的数据Copy到应用程序的Buffer
c. 将应用程序Buffer中的数据Copy到Socket网络缓冲区(属于操作系统内核的缓冲区)
d. 将Socket buffer数据拷贝到网络协议栈中,即由网卡进行网络传输
零拷贝的实现:
传统方式中数据在内核和用户程序之间的Copy会存在内核用户态之间的切换,实际IO读写需要进行IO中断,需要CPU响应中断(带来上下文切换),会消耗时间。kafka是采用DMA(直接存储器访问)接管了CPU的中断请求,但是四次的copy是存在‘不必要的拷贝’。
第2,3次对kafka来说是不必要的拷贝,因为应用程序只是起到一个数据传输的作用,这种场景下,不会起到任何帮助反而带来了开销。因此数据可以直接从读缓冲区传输到套接字缓冲区中。10. HiveSql语句中SELECT FROM WHERE GROUP BY LIMIT ORDER BY的执行顺序?
可以使用explain命令查询sql语句的执行计划
from -> where -> select -> group by -> order by -> limit11. Hive为什么要做分区,Hive的元数据在哪?
hive在做查询时,一般都会扫描整个表,当表很大时,效率低。对表进行分区,只做部分分区查询效率高。
hive的元数据存储在关系型数据库中(Mysql、derby)。hive的元数据包括数据库名、表名、类型、字段名称、数据类型和数据所存储的位置等。12. Yarn调度策略?
Yarn调度策略主要有三种:FIFO(先进先出调度器)、Capacity Scheduler(容器调度器)和Fair Scheduler(公平调度器)。
FIFO:队列,先到先执行,每次执行一个任务。
优点:运行一些较大的任务可以得到更多的资源
缺点:任务是一个接一个的执行,无法做到多个任务一起执行。
容器调度器:允许多个组织共享整个集群,每个组织获得一部分的计算能力,组织内部分配专门的队列,队列内部采用FIFO调度方式。
优点:支持多队列共享集群资源
缺点:存在资源阻塞等待的问题。例如某队列将其他队列的资源占用了,其他队列任务多需要资源时就会找占用资源的队列归还资源,如果占用资源的队列未执行完,则会一直占用,就会存在资源阻塞的现象。Apache Hadoop使用该调度。
Fair Scheduler: 为所有的作业分配公平的资源,也可以在多个队列间工作。
优点:支持多队列多用户,不需要预留一定量的资源,该调度器会在所有作业之间动态平衡资源,可以保证小作业及时完成。
缺点:由于该调度支持抢占功能,执行中的任务会将资源分给等待的任务,因此降低了整个集群的效率13. 描述MR中shuffle的过程及作用?
Shuffle过程指的是map和reduce之间数据处理的过程,是最关键的一个流程。
shuffle过程包括 Collect阶段、Spill阶段、两次Merge阶段、Copy阶段、Merge阶段以及Sort阶段:
a. Collect阶段:MapTask的结果数据输出到默认大小为100m的环形缓冲区,保存的是key/value,partition分区信息。
b. Spill阶段:当环形缓冲区达到80%的阈值时,就会将80%的数据溢写到磁盘中,在数据写入到磁盘前,会对数据进行一次排序,如果配置了Combiner,还会将有相同分区号和key的数据进行排序。
c. Merge阶段:把所有溢写到磁盘中的文件进行一次合并,并进行归并排序,确保一个MapTask只会产生一个数据文件。
d. Copy阶段:ReduceTask会启动Fetcher线程到已完成MapTask的节点上复制一份属于自己的数据,并先写入到本地内存中,然后溢写到磁盘。
e. Merge阶段:在ReduceTask获取数据的同时,会在后台开启线程对内存到磁盘的数据进行合并。
f. Sort阶段:对数据进行合并的同时,会进行归并排序操作。14. Hbase如何读取数据?如何写数据?
读取数据:
1.client首先会去zookeeper上获取meta(元数据)表所在的位置信息,即找到该meta表在哪个HRegionserver上保存着。
2.然后去该HRegionserver读取meta表的数据,从而得到目标表所在的HRegionserver
3.去目标HRegionServer上的BlockCache查看数据是否存在,如果没有,则去Region上的MetaStore以及storeFile上获取数据。
4.最后将数据返回给client
写数据:
1.client访问zookeeper,获取meta表的位置,然后找到meta表,得到元数据信息。
2.通过元数据信息找到HRegionserver和HRegion
3.client向该HRegionserver发起写入数据请求,然后收到响应。
4.client会先WAL,将写入数据的操作写入到日志,然后写到MemStore中。
5.当memstore达到阈值后,将数据flush到磁盘,生成StoreFile文件,当StoreFile数量多的时候,会触发合并操作,减少StoreFile的数量,提高查询速度。15. Kafka的偏移量Offset存放在哪儿,为什么?
Kafka1.0.2后kafka将Offset(位移信息)保存在kafka内部的Topic中,即_consumer_offsets 主题, 并默认提供Kafka_consumer_groups.sh脚本提供用户查看Consumer信息。
zookeeper不适合大批量频繁的写入操作。16. 简单描述Hbase的Rowkey的设计原则?
三个原则:长度原则、散列原则、唯一原则。
1.长度原则:
建议越短越好,最好不要超过16个字节。rowkey过长会降低MemStore内存的利用率和HFile存储数据的效率。
2.散列原则:
建议将rowkey的高位作为散列字段,这样可以尽量将数据均匀分布在每个RegionServer,以实现负载均衡。
3.唯一原则:
必须在设计上保证其唯一性。17. Redis缓存穿透、缓存血崩、缓存击穿?
缓存穿透:在高并发下查询一定不存在的数据,会透过缓存在DB中查询,且不会有缓存。
解决方案:1.将不存在的对象也可以缓存下来,设置一个较短的过期时间。
2.采用布隆过滤器,将所有可能存在的数据通过一系列的哈希函数映射到一个足够大的BitMap中,查询缓存前会被过滤器处理。
缓存血崩:在一段时间内,redis的Key大量失效,许多的查询都落到了数据库上,就会造成缓存血崩。
解决方案:尽量让失效的时间带你不分布到同一个时间点。
缓存击穿:指一个key非常热门,在不停的扛着高并发,该key在失效的瞬间,持续的大并发就会穿破到DB。
解决方法:可以设置key永不过期。18. Zookeeper的选举机制,以及我们还可以用zookeeper做些什么?
半数机制:集群要有一半以上的机器投票通过,才可成为leader。
以五台机器的为例。机器1启动,发起选举,机器数不足,成looking状态;机器2启动,一样的情况;机器三启动,发起选举,机器数足够,且机器3的id值最大,当选leader;后续的机器启动,因为已经有leader,不发起选举。
zookeeper的应用:
分布式数据的发布和订阅;
集群节点动态上下线监听;
实现分布式锁;
命名服务;
分布式队列;
集群管理;19. Flume丢不丢数据?
Flume不会丢数据,因为Channel可以存储到磁盘文件上,数据传输自身有事务;
20. 列式存储和行式存储的区别?
行式存储:
传统数据库Mysql、Oracle等是行式存储;在基于行式存储的数据库中,数据是按照行数据为基础逻辑存储单元进行存储的,一行中的数据在存储介质中以练习存储形式存在。
适用场景:
1.适合随机增删改查操作;
2.需要频繁插入或更新的操作;
列式存储:
Hbase、MangoDB等;数据是基于列进行存储,一列中的数据在存储介质中以连续存储形式存在。
适用场景:
1.高并发查询数据,查询数据高效。
2.需要存储的数据量大,列式存储不会浪费存储空间,且可对数据进行压缩。
21. 说一下Hive怎么优化?
1.MapJoin
2.行列过滤
3.采用分桶分区
4.合理设置map数
5.小文件进行合并
6.合理设置Reduce数
22. 简述Redis的热键问题,以及Redis的数据类型。
热键问题:
当有大量的请求访问某个key时,达到流量上线,造成redis服务器宕机,从而造成缓存击穿,大量的数据查询堆积在DB,然后回填给redis,恶性循环。
解决办法:1.对热点数据的访问进行限流。触发熔断保护机制。
2.在每个Redis主节点上备份热Key,让访问随机分散到各个节点上,实现负载均衡。
Redis的数据类型:
1.字符串类型
2.Hash类型
3.Set类型
4.list类型
5.SortedSet类型
23. Flume事务实现?
在Flume中有两个事物,一个是PUT,一个是TAKE事务;
Put事务存在source->channel之间,Take事务存在Channel->Sink之间;
Put事务时,Flume会将数据封装成Event对象,并将一批Event对象放进一个事务,再将这个事务一次性地放入Channel中;Take事务类似;
put事务:
事务开始,调用doput方法,doput方法将一批Event放入到putlist中;
然后调用docommit方法,检查channel内存队列是否有足够的空间,若有,则提交Event到Channel,然后清空putlist;若空间不够,则调用doRollback方法回滚数据。
Take事务:
开始,调用doTake方法,将Channel数据写入TakeList,若是发送成功,清理takelist;若发送过程中出现失败,则清空缓冲区,将数据还给Channel;
24. 数据同样存在HDFS,为什么HBase支持在线查询?
1.Hbase的存储机制:
HBase存储数据时是先将数据写入到内存(metastore)中,当数据量达到一定量再Flush到磁盘中;在内存中只增加数据,不做数据的更新或者合并,使得用户写操作只要进入到内存即可返回,保证了IO性能。
其次,在内存中的数据是有序的,刷写到HFile中也是保证内容是有序的。HFile文件为磁盘顺序读取做了优化,按页存储,顺序写入而非随机写入,保证了速度的稳定。
2.HBase的底层架构:
Hbase的数据是具体到Region上的,Region是表的一部分,且存在缓存
3.Hbase的读取:
Hbase采用了LSM树结构,读取时可以先到缓存,再到MemStore,最后到HFile中查找。Hbase的缓存使用了LRU,在缓存和MemStore没找到后,去读取HFile内容,但是HFile是顺序存储的,读取速度也很快。
25. Flume的HDFS Sink对小文件的处理?
首先说明HDFS存入大量小文件的坏影响:
元数据层面:每个小文件都会有一份元数据,其中包括文件路径,文件名,所有者,所属组,权限,创建时间等;这些信息都保存在NameNode中,会占用服务器大量的内存,影响NameNode的性能;
计算层面:默认情况下,MR会对每一个小文件启用一个Map任务计算,非常影响计算性能。
Flume的HDFS Sink对小文件的处理:
官方配置存在三个参数:hdfs.rollinterval, hdfs.rollSize, hdfs.rollCount。
通过配置三个参数,可以让tmp文件达到128m时滚动生成文件,或者tmp文件超过多少时间滚动生成正式文件。
26. Hive自定义哪些UDF函数?
不直接开发hive,使用spark开发hive
- Kafka的分区分配策略?
kafka的一个Topic包括多个分区,默认情况下一个分区只能同时给一个消费者消费,于是产生了分区分配的问题。
kafka就提供了分区分配算法:
1.RangeAssignor:这是kafka默认采用的分配算法。对每个Topic,先对分区按照分区ID进行数值排序,然后对消费组的消费者进行字典排序,通过分区数整除消费者得到跨度,按跨度分配分区给消费者,但是第一个消费者会额外分到余数的分区;
2.RoundRobinAssignor:使分区均衡分配到消费者;
3.SkickAssignor:RoundRobin虽然使得分区均匀分配,但是不会考虑到上一次分配的结果,且在消费者主订阅的Topic列表不同的情况下,依然会发生严重的偏差;而SkickAssignor会考虑到这些,每一次重分配的结果尽量和上一次分配结果保持一致。
28. 谈谈数据倾斜,如何发生的,并给出优化方案?
数据倾斜产生的原因:
1.业务数据本身的特性;
2.key分布不均匀
3.建表时考虑不周,
4.sql语句进行聚合操作产生的数据倾斜
29. Hadoop优化时经常修改的配置文件和其中配置项?
30. Mysql的索引如何理解?常用引擎是什么?有什么区别?比较Redis和Mysql的区别?说一下各自的持久化机制?
索引是帮助Mysql高效查找数据的数据结构,Mysql的索引主要有两种:B+Tree 和 Hash索引
常用的引擎:InnoDB,myIsam,Memory
InnoDB:支持事务,支持外键,支持行锁,写入数据操作快;
MyIsam:不支持事务,不支持外键,支持表锁,支持全文索引;
Memory:所有数据保存在内存中,支持Hash索引;
Redis和Mysql的区别:
Redis基于内存的NoSql数据库,读取写入速度快,通常做缓存使用
Mysql行数据为单位的传统业务数据库;
