如何解决Job运行效率低的问题
在模块B中出现某些Job运行时间较长,你认为可能是哪些情况造成?有什么相应的处理办法吗?
数据量过大,导致Job处理时间过长。可以考虑对数据进行分片或增加集群的计算资源。
Job设计不合理,算法复杂度过高。可以优化算法,减少计算量。
网络或IO瓶颈导致Job运行缓慢。可以优化网络连接或改进IO操作。
数据倾斜,导致某些节点负载过高。可以通过数据预处理、数据分布调整等方式解决。
对于数据仓库的理解
在模块B中,对数据进行分层作用(数仓的作用)的理解,
数据仓库,是一个面向主题,集成的,相对稳定的,反映历史变化的数据集合,通常用于支持管理决策
数仓中Hive内外表对比
在模块B中出现分区表均为内表,但分区表还有外表的存在形式,请问它们有哪些区别
内部表(管理表):
删除内部表会直接删除元数据以及存储的数据,对内部表的修改会将修改直接同步给元数据;
外部表:
删除外部表仅仅会删除元数据,HDFS上的数据是不会被删除的,对外部表的表结构和分区进行修改,则需要进行修复;
对于分组排序的理解
在模块B中用到分组排序,请问Hive SQL有哪三种分组排序,他们各自的特点是什么。
row_number:
每一行记录生生产一个序号,依次排序且不会重复
rank:
排序的时候会重复,但是数目不会减少
dense_rank:
排序的时候会重复,数目也会减少
对于UDF/UDAF/UDTF理解
在模块B中可能会用到UDF/UDAF/UDTF,它们的区别是什么,请问它们分别解决了什么问题?
UDF 是自定义函数,输入一行数据输出一行数据,可以实现函数或字符串拼接等操作
UDAF是自定义聚合函数,实现多对一,输入一行数据输出一行数据,主要实现一些复杂的聚合函数操作,比如平均值,求标准差等
UDTF是用来实现一行输入多输出的函数,,适用于一些复杂的数据处理操作
如何解决Job运行效率低的问题
在模块B中出现某些Job运行时间较长,你认为可能是哪些情况造成?
数据倾斜导致效率低
suffle 小文件太多或者分片数量过大
map太多,reduce不够
spark的吞吐量,单一节点的吞吐量
每一个步骤的RDD操作的空任务和小任务
spark的序列化的时间较长
suffle本身的io时间偏长
解决方案:
如果有相同的RDD,使用一个RDD
做suffle的时候可以做一个顶聚合
优化序列化的问题
写程序的时候减少拆箱和装箱的过程
做资源调度,修改spark的yarn
大规模的改suffle 的过程,在execute 里改
调整数据倾斜,尽量少用这种比较倾斜的分片来做
Hive分区表作用
Hive分区表的作用是什么,是否越多越好,为什么?
不是的
原因:hive如果有过多的分区,由于底层是存储在HDFS上,HDFS上只有用于存储大文件,而非下文件,因为过多的分区会增加 NameNode 的负担;hive会转化成 mapreduce ,mapreduce会转化成多个task,过多的小文件的话,每个文件一个task,每个task一个JVM实例,JVM的开启和销毁会降低系统效率。所以hive的分区表不是越多越好。
如何解决数据倾斜问题
当使用spark产生了数据倾斜的情况时,请问有哪些方法可以解决这个问题呢?
原因:
1.数据倾斜导致效率低
2.suffle 小文件太多或者分片数量过大
3.map太多,reduce不够
4.单条记录开销大,导致spark变慢
5.spark的吞吐量,单一节点的吞吐量
6.每一个步骤的RDD操作的空任务和小任务
7.spark的序列化的时间较长
8.suffle本身的io时间偏长
解决方案:
1.如果有相同的RDD,使用一个RDD
2.做suffle的时候可以做一个顶聚合
3.优化序列化的问题
4.写程序的时候减少拆箱和装箱的过程
5.做资源调度,修改spark的yarn
6.大规模的改suffle 的过程,在execute 里改
7.调整数据倾斜,尽量少用这种比较倾斜的分片来做
HDFS存储小文件问题
在HDFS数据存储是常常遇到小文件问题,小文件带来的危害有哪些?你知道的解决小文件问题的方法有哪些?
危害:
如果有大量的小文件的存在,存放的文件数目过多的话会占用很大的内存,甚至撑爆内存。
hdfs使用于高吞吐量,不适合低时间延迟的访问,如果同时存入大量的小文件会花费很长的使时间。访问小文件,则必须从一个datanode跳转到另一个datanode,这样大大降低了读取性能。
解决方案:
生产上设置小文件的阈值,到达阈值就对小文件进行合并。
多Master设计,让元数据散存到不同的NameNode中。
HDFS适合大文件还是小文件,为什么
(1)HDFS不适合大量小文件的存储,因namenode将文件系统的元数据存放在内存中,因此存储的文件数目受限于 namenode的内存大小。HDFS中每个文件、目录、数据块占用150Bytes。如果存放的文件数目过多的话会占用很大的内存
(2)HDFS适用于高吞吐量,而不适合低时间延迟的访问。如果同时存入大量的小文件会花费很长的时间
(3) 流式读取的方式,不适合多用户写入,以及任意位置写入。如果访问小文件,则必须从一个datanode跳转到另外一个datanode,这样大大降低了读取性能。