携程面经1

news2025/1/13 13:06:20

面经

HDFS读写流程

1.读流程

  1. 客户端向NameNode发起读请求
  2. (如果存在)NameNode返回一批block地址
  3. 客户端与第一个block的拓扑距离最近的节点建立连接以packet(64kb)的单位读取数据块。
  4. 一个block读取完成后客户端会断开与该DataNode的连接,然后与下一个数据块的最近节点建立连接。
  5. 所有数据块读取完成后会在客户端拼接为一个完整的文件。
  6. 如果在读取过程中一个节点读取出错,客户端会去读取下一个拓扑距离最近的节点,该节点不再连接。

2.写流程

  1. 客户端向NameNode发起写入操作请求,NameNode对请求进行检测:文件是否已存在,父目录是否已存在,是否有权限进行写入。返回检查结果。
  2. 客户端将文件切分为128M大小的Block,向NameNode请求上传第一个Block
  3. NameNode返回一个DataNode集合(拓扑距离排序)
  4. 客户端与距离最近的DataNode通过RPC调用建立连接,后续节点通过同样的方式建立连接形成pipeline。
  5. 客户端将第一个数据块读入缓存中,在缓存中将数据块切分为大小为64kb的packet,数据以packet的形式在pipeline上传输。
  6. 数据块传输完毕后会在pipeline上反向传输ack,最终由DataNode1将确认消息ack传给客户端
  7. 重复以上步骤直到所有数据块传输完毕。

NameNode HA的实现原理

NN的HA主要由两个机制实现:共享editLog机制和ZKFC对namenode状态的控制
共享editLog机制:HA中有多台NN节点,其中有一台为ActiveNN,其他的节点为StandbyNN。Active节点负责对外界提供读写服务,并将操作日志向共享文件系统(QJM,NFS)进行同步,standby节点负责从共享文件系统中同步数据,以便于active节点异常时快速恢复。当active节点宕机或与共享文件系统连接超时时,共享文件系统会对该NN进行fencing,避免发生脑裂。DN需要向所有NN都发送数据块处理报告。为了实现热备,每个NN上都运行了一个轻量级故障转移控制器zkfc。

ZKFC对NameNode状态控制:
主要由两个组件实现:HealthMonitor,ActiveStandByElector
HealthMonitor:负责监视NN的状态。一旦NN的状态发生变化,HM会回调zkfc注册的方法进行主备选举。
ActiveStandByElector:主要负责主备选举,内部封装了zookeeper的处理逻辑。选举完成后会回调zkfc注册的方法进行主备切换。
整体流程:NN启动时会启动一个zkfc进行故障转移。zkfc启动时会初始化一个HealthMonitor,HM定时对NN的状态进行监控,一旦发现NN状态变化,就会回调zkfc注册的方法进行处理。如果需要进行选举,会由ActiveStandByElector与zookeeper进行交互实现主备选举。选举完成后ASE通过回调zkfc注册的方法对NN状态进行更改,从Active/Standby转换为StandBy/Active。

联邦机制

NameNode的联邦机制是用于对NameNode进行横向扩展,解决NameNode的内存瓶颈问题的。
由于NameNode对外提供服务的时候会将fsimage和edits文件加载至内存,所以NameNode的内存瓶颈问题主要是由于数据量过大。这里我们可以采用的解决方案:1.处理小文件
2.减少副本数量 3.增大block大小 4.硬件扩展,增加堆内存大小或者直接对NameNode进行联邦。

联邦的原理:
由于单个NameNode的内存有限,当数据量非常大或者访问量非常大时可能会导致内存不够出现OOM,主要以socketconnect out of time即DataNode与NameNode的连接超时表现出来。联邦的功能便是通过多个NameNode,对NameNode进行横向扩展,将NameNode的namespace进行分块实现。每个namespace互相独立提供服务(HA中使用的是同一个namespace),对数据块池不做划分。DataNode需要向所有的NameNode注册,并周期性的发送心跳以及块处理报告。执行来自所有NameNode的命令。

优点:处理了内存限制;提高了吞吐量;提供了隔离性
缺点:单点故障未处理;负载均衡问题;

Reduce是如何获得Map输出的分区文件的?

Reduce拉取

Kafka如何实现顺序消费

kafka的topic分区的作用就是提高消费效率,对应的读取方式也是多线程读取,这样自然就无法保证topic维度有序,如果需要实现顺序消费topic,就要对生产者/服务端/消费者三端做以下约束:
1.生产者端保证将数据写入一个分区(可以通过只创建一个分区或者通过指定key写入一个分区内)。
2.服务端创建只有一个分区的topic,开启幂等性来避免重传机制引起的乱序。
3.消费者端用一个线程从一个分区内读取数据

Spark Streaming消费Kafka的两种方式比较。如何提高Spark Streaming消费Kafka的并行度?

1. 基于Receiver的方式

这种方式是通过Receiver来被动接收数据。Receiver是基于Kafka的高级API来实现的。Receiver从kafka中获取的数据存储在Spark的Executor内存中(如果数据量暴增,batch堆积可能会导致OOM)然后等待Streaming job的处理。这种情况下如果spark出错,很容易造成数据丢失。这里就要开启WAL(Write Ahead Log)预写日志机制机制。这种机制会在接收到Kafka数据的同时将数据写入hadoop上的预写日志中,就算发生错误也可以通过日志恢复

2. 基于Direct的方式

这种方式是由计算的Executor来主动拉取数据,速度由自身控制。这种方式会周期性的访问Kafka来获取每个topic+partition的最新offset,从而划分每个batch的offset范围。当处理任务的job启动后,就会直接使用kafka的简单api来直接获取Kafka指定范围offset的数据。

对比

Receiver的方式通过Kafka高阶API在ZooKeeper中保存offset,是这是消费Kafka的传统方式。这种方式配合WAL机制可以保证数据零丢失的高可靠。但是无法实现只处理一次,因为Spark和Zookeeper可能不同步。而Direct机制使用简单Kafka消费API,SparkStreaming自己实现追踪消费的offset并通过CheckPoint保存,从而保证有且只消费一次。
Direct方式不需要通过WAL来实现高可靠,所以性能上比Receiver高。

提高并行度

基于Receiver的方式中,增加Receiver的数量只能增加从kafka中消费数据的线程,而数据处理也就是Spark读取数据的线程数不受影响,所以Receiver方式中只能通过多个输入DStream聚合(Union)的方式来实现提高并行度。
基于Direct方式中,由于是Spark直接拉取Kafka的数据,所以我们只需要创建有多个partition的RDD就可以消费多个partition的Topic。

如何保证Spark Streaming的精准一次性消费?

要实现精准一次消费就是要同时解决数据重复和数据丢失问题。数据丢失发生在Kafka中的数据被消费了,但是本地还未保存成功,offset变化,节点出错导致数据丢失。要避免这种错误,我们需要手动维护offset,当数据成功保存后再提交offset。数据重复就是数据已成功保存但offset未成功提交,进程挂了,就会造成重复消费,解决方案是开启幂等性。

项目中Spark Streaming消费Kakfa的offset保存在哪里?为什么不采用checkpoint保存offset,有什么缺点?

保存在mysql中 mysql保存kafka的offset
缺点:CheckPoint会将Spark Streaming运行时的元数据以及每次RDD的数据状态保存到一个持久化系统中,其中包括offset,一旦程序挂了也可以从CheckPoint中恢复。但是CheckPoint在第一次持久化时会将jar包序列化为二进制文件,每次重启时都会从这个二进制文件中恢复。这样的后果是一旦程序代码修改或迭代了,这里运行的依然是之前的jar包,就会出现两种错误:(1)启动报错,反序列化异常 (2)启动正常,但是运行的代码仍然是上一次的程序的代码。事实上大多数的公司的代码都会进行频繁的迭代,这样就需要对CheckPoint中的offset进行保存,下次运行时再读取保存的offset。而既然要对offset另外进行维护,还不如一开始就手动维护offset。

对RDD的理解

RDD:弹性分布式数据集
弹性:存储弹性,内存和磁盘的自动切换,Spark在执行任务时会将数据保存在内存中提高效率,但是内存不能被占满,所以内存占用到一定的程度后会自动切换为磁盘存储;容错的弹性,数据丢失可以通过血缘重新构造,实现自动恢复;计算的弹性,计算出错重试机制,出错了可以通过之前的逻辑进行重试;分片的弹性,可根据需要重新分片,比如根据executor数进行分区,可以提高资源利用率和计算效率。
分布式:数据分布在不同的节点
数据集:RDD封装了计算逻辑,并不保存数据。
数据抽象:RDD是一个抽象类,代码中需要子类来实现。
不可变:RDD是不可变的,要想改变只能产生新的RDD。

Spark作业运行流程?(从standalone和yarn两种模式进行阐述)

standalone和yarn的区别是调度任务处理者不同:standalone是通过内部master调度,yarn模式是通过yarn实现调度
client和cluster模式的区别:Driver启动在提交任务的client节点;任务被打包为一个task放入调度队列后等待分配资源,在分配的节点executor中开启Driver运行任务;
standalone和yarn模式分别从client,cluster模式解读运行流程

为什么Spark Shuffle比MapReduce Shuffle快(至少说出4个理由)?

注:shuffle过程spark和MapReduce都是基于磁盘的

  1. spark基于内存处理(尽量),可能会涉及磁盘io,MapReduce一定会涉及磁盘io
  2. spark省去了冗余的reduce阶段,MapReduce必须采用完整MapReduce。
  3. spark的中间数据可以保存在内存中,MapReduce则必须落盘重新读取。
  4. MapReduce的shuffle会有多处排序,且不可跳过;spark计算时不指定不排序。
  5. MapReduce采用多进程模型,每次启动都会涉及到进程的开启和关闭;spark采用多线程模型,启动任务时可以通过线程池中线程的复用实现,减少启动关闭task的开销。

java保证线程安全的方式有哪些?

java保证线程安全的方式

一个volatile修饰的变量,如果两个线程同时去写这个变量,线程安全吗?如果不安全该怎么使他变得安全?

不能
volatile不能保证线程安全
方法:加锁

Linux中怎么查看一个进程打开了哪些文件?

Linux中怎么查看一个进程打开了哪些文件

算法题:二叉树非递归中序遍历

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/379449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法训练营 day59 动态规划 两个字符串的删除操作 编辑距离

算法训练营 day59 动态规划 两个字符串的删除操作 编辑距离 两个字符串的删除操作 583. 两个字符串的删除操作 - 力扣(LeetCode) 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符…

DBeaver连接mysql数据库图文教程

文章目录前言一、DBeaver连接mysql数据库二、文档下载地址前言 DBeaver是免费、开源、通用数据库工具,是许多开发开发人员和数据库管理员的所选。下面详细介绍Dbeaver连接mysql数据库的过程。 一、DBeaver连接mysql数据库 1、 打开Dbeaver后,按下图操…

【Unity】P4 脚本文件(基础)

Unity脚本文件(基础)适配的C#代码编辑器如何添加一个脚本文件获取蘑菇当前位置基础代码改变物体位置帧与帧更新前言 上一篇博文主要围绕Unity Inspector部分,围绕组件,资源文件,父子节点部分做介绍。 链接:…

阿里黑客入门学习资料流出来了!!

各位粉丝朋友大家好,最近看到很多粉丝朋友给我留言,希望我给大家找一些学习内容。前段时间整理了我平时常看的一些黑客相关的技术书籍,这些内容从未对外公开,今天分享给大家 ! 内容非常详细且全面,覆盖了W…

5分钟轻松拿下Java枚举

文章目录一、枚举(Enum)1.1 枚举概述1.2 定义枚举类型1.2.1 静态常量案例1.2.2 枚举案例1.2.3 枚举与switch1.3 枚举的用法1.3.1 枚举类的成员1.3.2 枚举类的构造方法1)枚举的无参构造方法2)枚举的有参构造方法1.3.3 枚举中的抽象方法1.4 Enum 类1.4.1 E…

c++系列12:使用vscode进行编译

1. 入门 1.1 操作方法 1)下载安装vscode 2)在扩展中搜索c/c extension pack并安装(或者直接打开cpp文件,会自动提示进行安装) 3)创建项目目录,会自动生成.vscode文件夹,里面是编译…

虹科分享 | Domo零售行业商业智能白皮书:《从零售企业的数据中获取价值》

市场因素、技术创新和不断增长的客户期望,给电子商务带来了新的机遇,与此同时也给传统零售行业带来了压力。零售业正面临着新的挑战:不断变化的需求模式和渠道、不断变化的服务期望、复杂的库存以及交付问题。为了解决这些问题,零…

Linux系统介绍及熟悉Linux基础操作

一、什么是Liunx Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发&am…

机器学习知识总结 —— 21. 什么是主成分分析

文章目录什么是PCA(Principal Component Analysis)协方差矩阵什么是协方差协方差矩阵特征值与特征向量PCA降维什么是PCA(Principal Component Analysis) 在机器学习中,PCA(Principal Component Analysis&a…

除了Confluence,还有哪些好用的文档管理软件?测评

在早期,文档管理软件主要是为了将企业内部海量的电子文档集中存储、管理,通过设置共享权限进行内部员工的文档分发,有些甚至可能要提供API接口,便于将ERP、OA等系统的文档纳入其中,形成企业文档管理中心。而随着时间的…

window下的快捷程序链怎么设置环境变量|cmd直接运行快捷方式

对于需要在命令行执行的程序,每次都需要设置环境变量很是麻烦,而且也会导致非必要的文件也在环境变量里并且如果多版本共存软件也会导致只能一个存在环境变量里不然会冲突,这时候如果可以通过快捷方式那不就完美解决了么? 快捷方…

一文带你入门Docker

目录一、什么是Docker?1、背景2、Docker三要素3、Docker四个组成部分二、Docker安装步骤1、VM虚拟机下载2、centrOS 8下载3、安装docker4、配置阿里云镜像加速器5、docker run 执行顺序6、docker和虚拟机比较三、docker常用命令四、docker镜像分层一、什么是Docker&…

运维语言、bash特性、history命令

P4 浅谈运维和编程语言 shell简述 shell C语言开发,和同是C开发的操作系统更兼容。因此shell效率肯定大于其他工具。 shell语言类型 其他运维语言 shell优势 P5 Bash特性 bash是什么 命令历史 -c 清楚存放的历史命令 -r 回复删除的历史命令 !历史id…

0基础怎么入门黑客?

" 有一群人大声嚷嚷着自己是黑客,但他们不是。他们(主要是正值青春的少年)是一些蓄意破坏计算机和电话系统的人。真正的黑客把这些人叫做“骇客”(cracker),并不屑与之为伍。多数真正的黑客认为骇客们又懒又不负责任&#x…

FCN学习

简介 FCN是首个端对端的针对像素级别预测的全卷积网络,发表在2015CVPR。全卷积的意思是全连接层全部替换成了卷积层。 FCN的评价指标 FCN的评价指标主要采用Mean IOU,他在当时已经超过了大多数网络的Mean IOU。 全卷积的优势 通过观察我们能够发现&am…

山东大学数字图像处理实验:MATLAB的图像显示方法

文章目录MATLAB 学习实验目的实验原理及方法实验内容MATLAB的图像显示方法实验目的实验内容MATLAB 学习 实验目的 了解 MATLAB 的基本功能及操作方法。掌握典型离散信号的 Matlab 产生和显示。 实验原理及方法 在 MATLAB 中, 序列是用矩阵向量表示, 但它没有包含采样信息, …

程序,进程,线程 并行,并发

程序: 程序的本质是初始的数据加一些指令,是数据跟指令的集合,是有序代码的集 合。程序的指令在代码里面相当于一个函数,调用一个函数相当于向程序发出一条指令,数据就是一些变量,变量就是用来保存数据的。…

ANTLR的IDE——ANTLRWorks2的安装及基本使用

1. ANTLRWorks2的简单介绍 ① ANTLR官网对ANTLRWorks2的介绍 ANTLRWorks 2.此IDE是ANTLR v3 / v4语法以及StringTemplate模板的复杂编辑器。 它可以运行ANTLR工具来生成识别器,并可以运行TestRig(在命令行上运行)来测试语法。 要将ANTLR生成…

GCC编译器 MinGW的下载安装使用教程

哎 总所周知 gcc可以用来编译C 和C。在linux广泛应用,那么window怎么使用gcc呢。就要用到gcc的window工具----MInGW,安装好之后,直接可以在windows的dos界面编译。下面讲解安装使用过程。1.官网下载MinGW - Minimalist GNU for Windows downl…

家庭消耗品跟踪管理软件HomeLists

什么是 HomeLists ? HomeLists 是一款自托管耗材统计软件,能通过提醒等帮助您跟踪家庭消耗品。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 homelists ,选择第一个 aceberg/homelists,版本选择 latest。 本文写作时&…