首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >大数据高级核心技术点问题总结

大数据高级核心技术点问题总结

作者头像
wuzhigang
发布2026-06-18 08:36:10
发布2026-06-18 08:36:10
600
举报
  1. 大数据高级核心技术点问题总结 1、 HDFS 读写流程? 读: 客户端发出请求 hdfs dfs -put /etc/profile /qf/data namenode 查看维护的目录结构,检查/qf/data 是否存在,如不存在直接报错”no such file or directory“,如存在返回给客户端同意上传文件请求,将操作写入日志文件 客户端请求上传第一个块,询问 namenode 块的存储位置 namenode 查看自己的 datanode 池,返回给客户端一个 datanode 列表 客户端发出请求建立 pipeline 客户端先把文件写入缓存,达到一个块的大小时,会在客户端和第一个 datanode 建立连 接开始流式的传输数据,这个 datanode 会一小部分一小部分(4K)的接收数据然后写入本 地仓库,同时会把这些数据传输到第二个 datanode,第二个 datanode 也同样一小部分一小 部分的接收数据并写入本地仓库,同时传输给第三个 datanode… (在流式复制时,逐级传输 和响应采用响应队列来等待传输结果。队列响应完成后返回给客户端) 第一个数据块传输完成后会使用同样的方式传输下面的数据块直到整个文件上传完成。 整个文件完成,namenode 更新内存元数据 写: 客户端向 namenode 发起 RPC 调用,请求读取文件数据。 namenode 检查文件是否存在,如果存在则获取文件的元信息(blockid 以及对应的 datanode 列表)。 客户端收到元信息后选取一个网络距离最近的 datanode,依次请求读取每个数据块。 客户端首先要校检文件是否损坏,如果损坏,客户端会选取另外的 datanode 请求。 datanode 与客户端建立 socket 连接,传输对应的数据块,客户端收到数据缓存到本地, 之后写入文件。 依次传输剩下的数据块,直到整个文件合并完成。 2、 MR 的工作原理? 略 3、 RPC 通信机制? Hadoop RPC 分为四个部分: (1)序列化层:Clent 与 Server 端通信传递的信息采用了 Hadoop 里提供的序列 化类或自定义的 Writable 类型; (2)函数调用层:Hadoop RPC 通过动态代理以及 java 反射实现函数调用; (3)网络传输层:Hadoop RPC 采用了基于 TCP/IP 的 socket 机制; (4)服务器端框架层:RPC Server 利用 java NIO 以及采用了事件驱动的 I/O 模型, 提高 RPC Server 的并发处理能力; 4、 Yarn 的工作原理? 1、用户向 YARN 提交程序,以 Map Reduce 程序为例,Resource Manager(资源管理器) 接收到客户端程序的运行请求 2、Resource Manager 分配一个 Container(资源)用来启动 Application Master(程序管理 员),并告知 Node Manager(节点管理员),要求它在这个 Container 下启动 Application Master 3、Application Master 启动后,向 Resource Manager 发起注册请求 4、Application Master 向 Resource Manager 申请资源 5、取得资源后,根据资源,向相关的 Node Manager 通信,要求其启动程序 6、Node Manager(多个)启动 MR(每个 MR 任务都是一个 job,可以在 job 日志中 查看程序运行日志)7、Node Manager 不断汇报 MR 状态和进展给 Application Master 8、当 MR 全部完成时,Application Master 向 Resource Manager 汇报任务完成,并注 销自己 5、 Zookeeper 的选举机制? 集群中半数以上机器存活,集群可用,所以 Zookeeper 适合安装奇数台服务器 在分布式系统中选主最直接或者传统的方法是直接选定集群的一个节点为 leader,其 它的节点为 follower,这样引入的一个问题是如果 leader 节点挂掉,整个集群就挂掉了。所 以我们需要一种自动选主算法,如果 leader 节点挂掉,则从 follower 节点中选出一个主节 点。 内部选举步骤: \1. 选举阶段 Leader election 最大 ZXID 也就是节点本地的最新事务编号,包含 epoch 和计数两部分。epoch 是纪元 的意思,相当于 Raft 算法选主时候的 term,标识当前 leader 周期,每次选举一个新的 Leader 服务器后,会生成一个新的 epoch 所有节点处于 Looking 状态,各自依次发起投票,投票包含自己的服务器 ID 和最新事 务 ID(ZXID)。 如果发现别人的 ZXID 比自己大,也就是数据比自己新,那么就重新发起投票,投票给 目前已知最大的 ZXID 所属节点。 每次投票后,服务器都会统计投票数量,判断是否有某个节点得到半数以上的投票。如 果存在这样的节点,该节点将会成为准 Leader,状态变为 Leading。其他节点的状态变为 Following。 \2. 发现阶段 Discovery 为了防止某些意外情况,比如因网络原因在上一阶段产生多个 Leader 的情况。 Leader 集思广益,接收所有 Follower 发来各自的最新 epoch 值。Leader 从中选出最大 的 epoch,基于此值加 1,生成新的 epoch 分发给各个 Follower。 各个 Follower 收到全新的 epoch 后,返回 ACK 给 Leader,带上各自最大的 ZXID 和历 史事务日志。 Leader 选出最大的 ZXID,并更新自身历史日志。 \3. 同步阶段 Synchronization Leader 刚才收集得到的最新历史事务日志,同步给集群中所有的 Follower。只有当半数 Follower 同步成功,这个准 Leader 才能成为正式的 Leader。 6、 列举 Hadoop 的常用命令? 略 7、 Flume 的 Source 有哪些类型? KafkaSource、AVROSource、HttpSource、TailDirSource、ExecSource 等 8、 Flume 的 Channel 有哪些类型? MemoryChannel、KafkaChannel、FileChannel 等 HDFSSink、KafkaSink、HbaseSink、HiveSink、AvroSink 等、 9、 Flume 会不会数据丢失,如果不丢失如何能保证? 会数据丢失,如果使用内存 channel 就会有丢失风险,想要数据不丢失的话,要使用 FileChannel,或者 KafkaChannel 来保存数据,也就是说将数据不要用内存传输,使用磁盘 落地的方式来发送,这样就不会丢失数据 10、 Flume 会不会数据重复? 会数据重复,如果当数据传输 sink 的时候,集群宕机那么写入一半数据的话,数据后一半 会回滚,前一半写入磁盘,再次发送就会重新发送这个批次数据,那么前一半数据就会重复11、 Hbase 是怎么进行读写的? 每次更新数据的时候,都会先把数据记录在提交日志(commit log)中,在 HBase 中,这叫 做预写日志(WAL),然后才会把这些数据写入内存的 Memstore 中。一旦内存保存的写入数 据的累计大小超过了一个给定的最大值,系统就会把这些数据移出内存,作为 HFile 文件 刷写到磁盘中。数据移出内存后,系统会丢弃对应的提交日志,大小有限,只保留未持久化 到磁盘的提交日志。 12、 Hbase 的各个组件作用? HMaster 的作用: 管理用户对 table 的 DDL 操作 为 Region server 分配 region 负责 Region server 的负载均衡 发现失效的 Region server 并重新分配其上的 region HDFS 上的垃圾文件回收 处理 schema 更新请求 HRegionServer 作用: 维护 master 分配给他的 region,处理对这些 region 的 io 请求 负责切分正在运行过程中变的过大的 region 13、 Hbase 的热点问题?什么时候会发生?发生后如何解决? 检索 habse 的记录首先要通过 row key 来定位数据行。当大量的 client 访问 hbase 集群的 一个或少数几个节点,造成少数 region server 的读/写请求过多、负载过大,而其他 region server 负载却很小,就造成了“热点”现象。 有大量连续编号的 row key,大量 row key 相近的记录集中在个别 region,client 检索记录时, 对个别 region 访问过多 , 此 region 所在的主机过载,产生热点 加盐、哈希、反转、时间戳反转、尽量减少行和列的大小 14、 Hbase 和 Hive 的区别? Hive 和 Hbase 是两种基于 Hadoop 的不同技术–Hive 是一种类 SQL 的引擎,并且运行 MapReduce 任务,HBase 是一种在 Hadoop 之上的 NoSQL 的 Key/value 数据库。当然,这 两种工具是可以同时使用的。Hive 可以用来进行统计查询,HBase 可以用来进行实时查询, 数据也可以从 Hive 写到 Hbase,设置再从 Hbase 写回 Hive。 15、 Hbase 的预分区和二级索引的作用? 预分区:提前划分 region,避免单节点 region 一次性写入大量数据频繁分裂 二级索引:主要是为了提高查询效率达到秒级查询的目的 16、 Sqoop 的增量导入和全量导入有什么区别? 17、 Sqoop 如何修改导入的文件格式?是否有默认的压缩机制? 可以使用 Sqoop 中 import 命令的–as-textfile 参数明确指定此文件格式。 Sqoop 没有任何内置代码来执行文件压缩。 它依赖 Hadoop 的压缩设置。 18、 Hive 的动态分区和静态分区? 静态分区 SP(static partition) 1、静态分区是在编译期间指定的指定分区名 2、支持 load 和 insert 两种插入方式 2.1load 方式 1)会将分区字段的值全部修改为指定的内容 2)一般是确定该分区内容是一致的时候才会使用 2.2insert 方式1)必须先将数据放在一个没有设置分区的普通表中 2)该方式可以在一个分区内存储一个范围的内容 3)从普通表中选出的字段不能包含分区字段 3、适用于分区数少,分区名可以明确的数据 动态分区 DP(dynamic partition) 1、根据分区字段的实际值,动态进行分区 2、是在 sql 执行的时候进行分区 3、需要先将动态分区设置打开(set hive.exec.dynamic.partition.mode=nonstrict ) 4、只能用 insert 方式 5、通过普通表选出的字段包含分区字段,分区字段放置在最后,多个分区字段按 照分区顺序放置 静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进 行判断。 19、 Hive 的分桶作用? 分桶是相对分区进行更细粒度的划分。 分桶将整个数据内容安装某列属性值得 hash 值进行区分,如要按照 name 属性分为 3 个 桶,就是对 name 属性值的 hash 值对 3 取摸,按照取模结果对数据分桶。 如取模结果为 0 的数据记录存放到一个文件,取模为 1 的数据存放到一个文件,取模为 2 的数据存放到一个文件 20、 Hive 和 MySQL 的区别? Hive 采用了类 SQL 的查询语言 HQL(hive query language)。除了 HQL 之外,其余 无任何相似的地方。Hive 是为了数据仓库设计的。 存储位置:Hive 在 Hadoop 上;Mysql 将数据存储在设备或本地系统中; 数据更新:Hive 不支持数据的改写和添加,是在加载的时候就已经确定好了;数据 库可以 CRUD; 索引:Hive 无索引,每次扫描所有数据,底层是 MR,并行计算,适用于大数据量; MySQL 有索引,适合在线查询数据; 执行:Hive 底层是 MarReduce;MySQL 底层是执行引擎; 21、 Hive 的内部表和外部表区别? 创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录 数据所在的路径, 不对数据的位置做任何改变。 删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数 据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。 22、 Hive 支持的文件格式和压缩方式及各自特点? textfile 存储空间消耗比较大,并且压缩的 text 无法分割和合并 查询的效率最低,可以 直接存储,加载数据的速度最高; sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过 text 文件转化来加载; orcfile, rcfile 存储空间最小,查询的效率最高 ,需要通过 text 文件转化来加载,加载的 速度最低; parquet 格式是列式存储,有很好的压缩性能和表扫描功能 Hive 支持的压缩格式为 Gzip、Bzip2、lzo、snappy 23、 列举常用的 Hive 的函数及作用?聚合函数 sum()—求和 count()—求数据量 avg()—求平均直 distinct—求不同值数 min—求最小值 max—求最人值 分析函数 Analytics functions RANK ROW_NUMBER DENSE_RANK CUME_DIST PERCENT_RANK 字符串连接函数 concat concat_ws collect_list collect_set 其他函数 cast -类型转换 if 判断 – if(con,’’,’’); 等 24、 Hive 的 UDAF、UDF、UDTF 是什么? User-Defined-Function 自定义函数 、一进一出; 自定义 udaf 函数 self_count,实现系统 udaf count 的功能 User-Defined Table-Generating Functions,要解决一行输入多行输出的问题,用 udtf 解决 一行输入多行输出的不多,往往被 lateral view explode+udf 等替代实现,比直接用 udtf 会 更简单、直接一些 25、 Hive 的数据倾斜原因及解决方法? Group By 聚合倾斜:分组的维度过少,每个维度的值过多,导致处理某值的 reduce 耗 时很久;对一些类型统计的时候某种类型的数据量特别多,其他的数据类型特别少。当按照 类型进行 group by 的时候,会将相同的 group by 字段的 reduce 任务需要的数据拉取到同 一个节点进行聚合,而当其中每一组的数据量过大时,会出现其他组的计算已经完成而这个 reduce 还没有计算完成,其他的节点一直等待这个节点的任务执行完成,所以会一直看到 map 100% reduce99%的情况; 解决办法: set hive.map.aggr=true; 这个配置代表开启 map 端聚合; set hive.groupby.skewindata=true; 当选项设定为 true,生成的查询计划会有两个 MR Job。 当第一个 MR Job 中,Map 的输出结果结合会随机分布到 Reduce 中,每个 Reduce 做部分 聚合操作,并输出结果 如果数据量非常大,执行如 select a,count(distinct b) from t group by a;类型的 sql 时, 会出现数据倾斜的问题 解决办法: 使用 sum…group by 代替。如:select a,sum(1) from(select a,b from t group by a,b) group bya; Join 问题:当遇到一个大表和一个小表进行 join 操作时。 解决办法: 使用 mapjoin 将小表加载到内存中。 如:select /*+ MAPJOIN(a) */ a.c1, b.c1 ,b.c2 from a join b where a.c1 = b.c1; 其他通用配置: 1-hive.fetch.task.conversion=more;将 hive 拉取的模式设置为 more 模式 2-hive.exec.mode.local.auto 决定 Hive 是否应该自动地根据输入文件大小,在本地运 行(在 GateWay 运行) ; 3-hive.auto.convert.join :是否根据输入小表的大小,自动将 Reduce 端的 Common Join 转化为 Map Join,从而加快大表关联小表的 Join 速度。 默认:false。 4-mapred.reduce.tasks :所提交 Job 的 reduer 的个数,使用 Hadoop Client 的配置。 默认是-1,表示 Job 执行的个数交由 Hive 来分配; mapred.map.tasks:设置提交 Job 的 map 端个数; 5-hive.merge.mapredfiles :是否开启合并 Map/Reduce 小文件,对于 Hadoop 0.20 以 前的版本,起一首新的 Map/Reduce Job,对于 0.20 以后的版本,则是起使用 CombineInputFormat 的 MapOnly Job。 默认是:false; 6-hive.mapred.mode :Map/Redure 模式,如果设置为 strict,将不允许笛卡尔积。 默 认是:‘nonstrict’; 7-hive.exec.parallel :是否开启 map/reduce job 的并发提交。 默认 Map/Reduce job 是顺序执行的,默认并发数量是 8,可以配置。默认是:false; 8-JVM 重用:需要在 Hadoop 的 mapred-site.xml 文件中进行配置 mapreduce.job.jvm.numtasks 的个数即可 9-行列过滤:列处理:在 SELECT 中,只拿需要的列,如果有,尽量使用分区过滤,少 用 SELECT *。 行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在 Where 后面,那么就会先全表关联,之后再过滤 26、 你了解哪些建模模型,说说其区别? 星型架构是一种非正规化的结构,多维数据集的每一个维度都直接与事实表相连接,不 存在渐变维度,所以数据有一定的冗余 当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时, 雪花模型是对星型模型的扩展。它对星型模型的维表进一步层次化,原有的各维表可能被扩 展为小的事实表,形成一些局部的 "层次 " 区域,这些被分解的表都连接到主维度表而不 是事实表。通过最大限度地减少数据存储量以及联合较小的维表来改善查询性能。雪花型结 构去除了数据冗余。 27、 数据仓库和数据库区别? 数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交 易。 数据仓库:数据仓库系统的主要应用主要是 OLAP(On-Line Analytical Processing),支持 复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 28、 数仓建模步骤? 业务建模、概念建模、逻辑建模、物理建模 29、 数仓架构? inmon 架构自上而下的开发模式,从多个数据源出发,根据需求将不同数据源的数据经过 ETL 过程获取 到各个主题需求的数据集成到数仓中,完成了数据治理后再进行统计业务,将统计结果存入 数据集市。 kimball 架构 自下而上的开发模式,往往已经存在某个关系明确的业务数据库,架构师需要根据数据库中 的数据寻找出有价值的分析指标,然后根据这些指标建立数据集市,再从数据集市出发向下 建设需要的数据仓库表。 30、 数仓的分层作用?ODS、DWD、DWS、DM、DIM 分别什么意思?各有什么作用? 分层作用:复杂问题简单化、减少重复计算、血缘追踪、架构更清晰 ODS:源始数据层;操作型数据层,存放的是从不同来源进入数仓的原始数据,ods 层往 往只存放少量加工的原始数据,因此这里的数据不是集成的。 DWD:数据细节层。将 ods 层的数据统一整合后,依照各主题需要将数据拆分存储,常 见的星型模型和雪花模型就是在这一层。 DWS:数据服务层。按照范式存储的数据在分析时往往需要进行多表 join,这样的分析效 率很低,因此需要将 dwd 层的数据按照分析需求提前进行整合。由于主题之间的重合,该 层的设计是反三范式的,存在数据冗余。 DM: 存放使用 DW 层数据进行业务统计的结果,它们可能被用于线上可视化的指标分 析,也可能用于进一步的数据挖掘使用。 DIM: 维度层。有些数仓会将 dwd 层中的维度表单独抽离出来维护。 31、 Kafka 的生产者分区策略有哪几种? 按照分区发送:指定分区的话就写入对应分区 对 Key 的 Hash 发送:如果未指定分区但是指定了 Key 就对 Key 进行 HashCode 取余发送到 对应分区 轮询发送:如果 Key 也没指定分区也没指定,那么就是用轮询的方式每条顺序写入分区 32、 Kafka 如何保证消息一致性? 幂等:多次发送等于一次发送 事务:如中间数据传输有断层,开启事务机制,数据会回滚 实现恰好一次性语义 33、 Kafka 的 Leader 和 follower 在 Kafka 中的作用? Leader:主要是负责进行生产者和消费者的数据接收发送,不管同步操作 Follower:主要是负责同步 Leader,还用于 leader 选举(leader 挂了才能选举) 34、 Redis 数据类型? String、Hash、List、Set、Zset 35、 Redis 持久化? RDB 持久化 符合一定条件时 redis 会将内存中所有数据以二进制方式生成一份副本存储到硬盘上(快 照),redis 重启时可以通过该副本恢复数据,生成快照时 redis 进入阻塞状态。 AOF 持久化 redis 将日志追加到磁盘文件中,redis 启动时优先选择从 AOF 文件恢复数据。由于每次写操 作都会记录日志,因此 AOF 会降低性能,但比起 RDB 的一次性阻塞式备份数据,AOF 消耗 的内存和资源更少。 AOF 文件达到阀值时(或执行 bgrewriteaof 命令),会重写一次 AOF 文件,将每个 Key 只保留最新的 value 的日志 36、 什么是 Spark 内存模型?1. 内存分为两种:堆内和堆外内存 堆内:指的是我们启动程序后,指的的参数列表就是堆内内存(–executor-memory) 堆内内存分为:存储内存、执行内存、其他内存 堆 外 : 指 的 是 不 在 我 们 的 分 配 范 围 内 , 需 要 开 启 才 能 使 用 (spark.memory.offHeap.enabled=true,设置大小 spark.memory.offHeap.size=1G) 堆外内存分为:存储内存、执行内存 \2. Spark 版本划分 1.6 和 2.X 以上版本将内存管理分为两大类 静态内存管理模型(1.6): 如果当程序启动后,我们所分配的内存区域大小不可改变,并且也不可以动态占用对方未使 用的内存空间。 堆内: 存储内存:内存空间占用 60%,在内部内存当中,会预留出百分之 10 防止 OOM 内存溢出 执行内存:内存空间占用 20%,在内部内存当中,会预留出百分之 20 防止 OOM 内存溢出 其他内存:内存空间占用 20% 堆外: 存储内存:占用总的内存的 50% 执行内存:占用总的内存的 50% 统一内存管理模型(2.0 以上): 与静态内存管理的区别在于存储内存和执行内存共享同一块空间叫做统一内存,可以动态占 用对方的空闲区域(动态占用机制) 堆内: 统一内存:占用总内存的 60%,内部分为存储内存和执行内存,各占用 50% 其他内存:占用总内存的 40% 预留内存:固定大小 300M 堆外: 统一内存:50% 其他内存:50% 动态占用机制:如果存储内存和执行内存的内存空间都不足了,此时会将数据落盘,如果当 我们的执行内存空间有剩余,此时存储空间不足,就会占用执行内存空间,那么如果发生计 算,使用执行内存空间,存储内存占用的空间要归还给执行内存,那么这一部分归还的内存 存储的数据就会淘汰(当我们的缓存级别设置为内存存储的话,这部分数据就被删除,如果 是内存加磁盘的话,就落盘),如果执行内存占用了存储内存,当存储内存空间不足后,有 新的存储数据进来,此时执行内存也不会归还内存,这部分数据就要启动淘汰机制(将老的 数据删除或者落盘,取决于你的存储级别),总结来说,执行内存级别高于存储内存级别。 37、 Spark On Yarn Client 工作原理? Spark Yarn Client 向 YARN 的 ResourceManager 申请启动 Application Master。同时在 SparkContent 初始化中将创建 DAGScheduler 和 TASKScheduler 等,由于我们选择的是 Yarn-Client 模式,程序会选择 YarnClientClusterScheduler 和 YarnClientSchedulerBackendResourceManager 收到请求后,在集群中选择一个 NodeManager,为该应用程序分配第一 个 Container , 要 求 它 在 这 个 Container 中 启 动 应 用 程 序 的 ApplicationMaster , 与 YARN-Cluster 区别的是在该 ApplicationMaster 不运行 SparkContext,只与 SparkContext 进 行联系进行资源的分派 Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager 注册,根据任务信息向 ResourceManager 申请资源(Container) 一旦 ApplicationMaster 申请到资源(也就是 Container)后,便与对应的 NodeManager 通 信 , 要 求 它 在 获 得 的 Container 中 启 动 CoarseGrainedExecutorBackend , CoarseGrainedExecutorBackend 启动后会向 Client 中的 SparkContext 注册并申请 Task client 中 的 SparkContext 分 配 Task 给 CoarseGrainedExecutorBackend 执 行 , CoarseGrainedExecutorBackend 运行 Task 并向 Driver 汇报运行的状态和进度,以让 Client 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务 应用程序运行完成后,Client 的 SparkContext 向 ResourceManager 申请注销并关闭自己 38、 Spark 本地化级别? PROCESS_LOCAL 进程本地化 NODE_LOCAL 节点本地化 NO_PREF 非本地化 RACK_LOCAL 机架本地化 ANY 任意 39、 cache 和 checkpoint 的区别? Cache 持久化操作,主要是用于内存式缓存操作,如果内存充足,可以使用其缓存操作, 但是最好设置磁盘加内存,如果程序停止或者宕机,这种方式就失效了 Checkpoint 是检查点,用于缓存操作,不过存储的时候磁盘,主要适用于大数据量的数据 缓存,如果机器一旦宕机,那么可以通过检查点来恢复数据,相比较缓存性能会低一些,但 是比持久化的数据保存更久。 40、 什么是 Hash 碰撞,怎么解决 Hash 碰撞? Hash 碰撞说白了就是数据倾斜,因为数据使用的是 Hash 的分区方式,如果将 Key 转换为 HashCoed 值,那么就有可能有一大批 Hash 值取余的时候回分配到同一分区,导致这个分 区数据过大,那么就会发生数据倾斜 解决办法:使用自定义分区器,不要用默认的 HashPartition 分区器,自己按照自己的规则 去定义分区器,将数据分配到不同的分区即可 41、 SparkStreaming 如果实时处理数据过大,一个批次任务执行不完成,你如何解决(数 据积压)? 第一种设置背压机制,保证程序动态的实时感知数据量大小和资源情况,按照现有的资源进 行拉去数据,保证每个批次数据处理不会太大。 第二种增大处理里并行度,提高执行效率和处理速度,这样可以有效解决数据积压问题 第三种进行硬件调整,可以动态的扩容 Kafka 集群,增加消费节点,保证消费者消费的并行 度更大。 42、 Spark 的 Shuffle 有几种,说说各自的原理? HashShuffle:特点是复用缓冲区和本地文件,不需要进行合并小文件操作,而且默认也不 用排序,但是这种 Shuffle 已经退出历史舞台,在 1.2 以后已经不是默认的 shuffle 操作了 SortShuffle:分为两种方式(普通机制会默认的排序操作,bypass 机制不会排序操作),内部进行 shuffle 操作的时候和 MR 的内部 shuffle 有些类型,也要进行合并小文件的,不使用 复用操作,在合并小文件的时候,会根据每一个文件创建对应的索引信息,主要是为了 reduce 拉去数据的时候找到元数据。 43、 SparkStreaming 消费 Kafka 的有哪两种方式,并说明其区别? 使用了receivers来接收数据,利用的是Kafka高层次的消费者api,对于所有的receivers 接收到的数据将会保存在 spark executors 中,然后通过 Spark Streaming 启动 job 来处理这 些数据,默认会丢失,可启用 WAL 日志,该日志存储在 HDFS 上 区别 Receiver 接收数据,这种方式定期地从 kafka 的 topic+partition 中查询最新的偏移 量,再根据偏移量范围在每个 batch 里面处理数据,使用的是 kafka 的简单消费者 api 优点: 简化并行,不需要多个 kafka 输入流,该方法将会创建和 kafka 分区一样的 rdd 个数,而且会从 kafka 并行读取。 高效,这种方式并不需要 WAL,WAL 模式需要对数据复制两次,第一次是被 kafka 复制, 另一次是写到 wal 中 恰好一次语义(Exactly-once-semantics),传统的读取 kafka 数据是通过 kafka 高层次 api 把 偏移量写入 zookeeper 中,存在数据丢失的可能性是 zookeeper 中和 ssc 的偏移量不一致。 EOS 通过实现 kafka 低层次 api,偏移量仅仅被 ssc 保存在 checkpoint 中,消除了 zk 和 ssc 偏移量不一致的问题。 44、 分别解释 DF、DS、RDD? DF:SparkSQL 在 1.2 以后推出的新的特性,它是对 RDD 的又一次封装,不过使用了 SQL 解 析器,和优化器,然后转换 Spark 可识别的代码进行运行,其实就是 SparkSQL 的抽象 DS: 是 在 Spark 的 1.6 以 后 才 推 出 的 新 特 性 , 它 封 装 了 DF 和 RDD 的 特 性 , Dataframe=DataSet[Row],也代表了在 DS 的返回值类型中可以使用任意的类来封装数据, 整合了 RDD 与 DF 的各个有点,在 2.0 以后全部是使用的 DS 来实现 RDD:弹性分布式数据集,是一个不可变,可分区,并行计算的集合,RDD 之间存在依赖关 系(血缘),有高容错性,并且可以进行持久化。 45、 Foreach、map、foreachPartition、foreachRDD 区别是什么,简要说明? Foreach:Action 算子,进行输出操作,按照每条输出 ForeachPartition:Action 算子,进行输出操作,是按照每个分区输出 Map:转换算子,主要是对数据进行转换操作,是对每条数据操作 ForeachRDD:是 Dstream 的算子,主要是对流进行转换输出操作,将流转换成 RDD 进行输 出 46、 Task 与 Job 之间的关系,简要说明? Task 是任务,是任务的最小单位,在 Job 提交后,内部的所有分区都是一个 Task,所以 Task 用来进行计算和保存数据 Job 是任务:是任务的最大单位,主要是提交整个任务的程序,也就内部包含了多个 Task 47、 RDD 是什么? 弹性分布式数据集,是 Spark 中的最基本的数据抽象,代表着一个不可变可分区并行计算的 集合,相当于一个代理,本身没有数据,代理着元数据信息 48、 Transformation 算子和 Action 算子的区别? Transformation 属于转换算子,不进行数据加载,逻辑概念,返回值一直都是 ,而 Action 是属于执行算子,是触发 Job 算子,一个 Action 触发一个 Job,并且转换算子需要执行算子 来触发任务执行 49、 什么是 DAG? 有向无环图,是 Spark 的整体的执行程序,内部会进行 Stage 的划分,分为 ShuffleMapStage 和 ResultStage,并且内部划分 Task,Task 也分为两种 Task,ShuffleMapTask 和 ResultTask, 所有的任务的阶段划分和 Task 任务划分都在内部执行,是整个程序的核心 50、 Spark 的调优方案有哪些? 参考 Spark 内核调优文档即可 51、 如何设置 Spark 的自定义分区?作用? 继承 Partitioner 的 trait,实现内部的抽象方法,按照自定义的需求分区,将数据分到自己想 要分配的区域,这样可以解决数据倾斜的问题,相比默认的 HashPartitioner 分区器来说, 分区更合理,也更灵活 52、 Spark 的 Job 提交运行原理 略 53、 Hbase 二级索引设计原则 协处理器 coprocessor 方案。 原理就是自定义协处理器,实现双写,就是写主 表的时候,同时写索引表[这里这个索引表是根据业务对查询的需求建立的]。比 如我们要查询的主表是A, 里面有RowKey,还有一列ColumnA. 如果想对ColumnA 这一列建立索引,就自定义一个协处理器(观察者模式),当我们写入 A 表中一条 数据,比如 行键 rowkey(123),cloumnA 列值:abc,这时协处理在索引表(自己 建立,比如 A_INDEX)中插入一条记录 行键为刚才列 A 的值 abc,列值为主表的 rowkey(123). 查询的时候,先查索引表得到 rowkey,然后根据 rowkey 在主表 中查。 54、 Kafka Partition 如何保证副本数据的一致性 参考:http://coder.yihongyeyan.com/question/42 55、 HBase 如何保证数据的强一致性 HBase 是牺牲了数据的部分可用性来保证它的数据强一致性的。 * HBase 中每一条数据只会出现在一个 Region,它的数据冗余备份不是在 Region 这个层面做的,还是依赖 HDFS 来做的冗余。而且同一时间一个 Region 只会被分配给一个 RegionServer,这就保证了系统中只会有一条可以使用的数 据。HBase 支持行级事物,即一个 put 操作要么成功,要么失败。 * 另外当有 RegionServer 宕机的时候,Region 会被分配到其他的 RegionServer 上,同时重写 WAL Log,这个过程中整个 Region 中的数据是不 可用的,因为它是缺失的。如果可用性强的话那么必定会有数据不一致的问题(即 写入过的数据查询不到),所以这里用可用性来换取了强一致性,等到 WAL 写 完,保证了数据完整性之后,才可重新访问。 56、 Spark Structured Streaming 优势 增量查询模型(Incremental query model): Structured Streaming 将会在 新增的流式数据上不断执行增量查询,同时代码的写法和批处理 API (基于 Dataframe 和 Dataset API)完全一样,而且这些 API 非常的简单。支持端到端的引用(Support for end-to-end application): Structured Streaming 和内置的 connector 使的 end-to-end 程序写起来非常的简单,而 且 “correct by default”。数据源和 sink 满足 “exactly-once” 语义,这样 我们就可以在此基础上更好地和外部系统集成 复用 Spark SQL 执行引擎:我们知道 Spark SQL 执行引擎做了非常多的优 化工作,比如执行计划优化、codegen、内存管理等。这也是 Structured Streaming 取得高性能和高吞吐的一个原因。 支持了基于事件时间(event time)的窗口操作,同时结合水位线 (watermark)来处理延迟数据。 57、 Spark Cache,Presist,CheckPoint 的区别 * Cache、Persist 是转化类算子,和其他算子一样,触发的时机是在对应分区 的上游算子计算完成之后。 * Cache、Persist 会把 RDD 缓存到指定位置,这个操作不会改变 Lineage 血 缘的依赖关系,且 Job 执行完成之后,缓存的数据会被清除。 * Cache、Persist 一般应用于需要访问重复数据的应用(如迭代型算法和交互 式应用)缓存可以运行得更快。 * CheckPoint 执行完毕后,会产生 CheckPointRDD,此时 lineage 血缘关系已 经改变了,容错会从 CheckPointRDD 开始。 * CheckPoint 将 RDD 持久化到 HDFS ,会被永久保存,可以给其他的 Driver 使用 * 虽然 Presist 也可以持久化数据到磁盘,但是它有 BlockManager 管理,一旦 Driver 结束,BlockManager 也会 stop,被 cache 到磁盘上的 RDD 也会被清 空,而 checkpoint 将 RDD 持久化到 HDFS 或本地文件,如果不被手动 remove 掉,是一直存在的
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档