1、简述java中,throw和throws的区别
答:
- throw:
- throw关键字用于在方法体内抛出异常。
- 它后面跟着一个异常对象。
- 使用throw,你可以抛出自定义异常或标准异常。
- 方法体中只能有一个throw语句被执行。
- throws:
- throws关键字用于方法签名中,用于声明该方法大概抛出的异常。
- 它后面跟着一个或多个异常类名,用逗号分隔。
- 使用throws,你可以声明方法大概会抛出的checked异常。
- 一个方法可以声明抛出多个异常。
这两个关键字在处理异常时饰演不同的角色:throw用于抛出异常,而throws用于声明异常。
2、简述java中,==和equals方法的区别
答:
在Java中,==和equals()方法是用来比较两个对象是否相等的,但它们之间有显著的区别:
- ==操作符:
- 用于比较两个对象的引用是否雷同,即它们是否指向内存中的同一个位置。
- 对于基本数据范例(如int, float等),==比较的是数值是否相等。
- 对于对象,即使两个对象的内容完全雷同,但如果它们是不同的实例,==也会返回false。
- equals()方法:
- 是Object类的一个方法,可以被继承和重写。
- 默认的实现(即从Object类继承的)与==雷同,比较的是引用。
- 但在很多Java类中(如String, Integer等),equals()方法被重写,以比较对象的内容或状态。
- 使用equals()时,必要思量对象是否为null,由于对null对象调用equals()会抛出NullPointerException。
总结来说,==用于比较引用,而equals()用于比较内容,尽管其默认行为也是比较引用。在实际应用中,应根据必要选择使用哪种方法。
3、简述java聚集框架中,聚集框架的体系结构,以及他们之间的区别
答:
- Collection接口:是聚集框架的根本接口,用于存储一组不唯一、无序的对象。它包括List、Set和Queue等子接口。
- List接口:继承自Collection,允许重复元素,元素有序,可以通过索引访问。重要实现类有ArrayList和LinkedList。
- ArrayList:基于动态数组实现,支持随机访问,适合查找和更新操作。
- LinkedList:基于双向链表实现,支持快速插入和删除,适合列表中间的添加和删除操作。
- Set接口:继承自Collection,不允许重复元素。重要实现类有HashSet、LinkedHashSet和TreeSet。
- HashSet:基于哈希表实现,无序,不包管元素的次序。
- LinkedHashSet:继承自HashSet,维护了元素的插入次序。
- TreeSet:基于红黑树实现,有序,元素按照自然次序或自定义比较器排序。
- Queue接口:用于存储待处理的元素序列,元素有序,重要实现类有LinkedList和PriorityQueue。
- LinkedList:可以用作栈、队列或双端队列。
- PriorityQueue:基于优先级堆实现,元素按照优先级次序出队。
- Map接口:用于存储键值对,键唯一,值可以重复。重要实现类有HashMap、LinkedHashMap、TreeMap和Hashtable。
- HashMap:基于哈希表实现,无序,允许使用null键和null值。
- LinkedHashMap:继承自HashMap,维护了元素的插入次序。
- TreeMap:基于红黑树实现,有序,元素按照键的自然次序或自定义比较器排序。
- Hashtable:是HashMap的同步版本,不允许使用null键和null值。
这些聚集类和接口的选择取决于具体的应用场景,比方对元素的排序、访问速度、插入和删除操作的频率等需求。
4、简述java的泛型可以使用的场景
答:
Java的泛型重要应用于以下场景:
- 聚集框架:泛型最常见的应用是在Java的聚集框架中,如List、Set、Map等。使用泛型可以包管聚集中存储的对象范例安全,制止在运行时出现范例转换错误。
- 类和接口:泛型类和接口允许在类或接口的定义中指定范例参数,这样可以在实例化时指定具体的范例,增强代码的通用性和可重用性。
- 方法:泛型方法允许在方法签名中指定范例参数,使得方法可以接受不同范例的参数,进步方法的灵活性。
- 泛型通配符:用于表示未知的范例,比方List<?>,可以接受任何范例的List。通配符还可以指定上界或下界,如List<? extends Number>表示接受Number或其子范例的List。
- 泛型擦除和桥接方法:Java中的泛型是通过范例擦除来实现的,这意味着在编译后的字节码中不包含泛型信息。为了保持范例安全,编译器会生成桥接方法。
- 自定义泛型结构:除了使用Java提供的泛型聚集和类外,还可以自定义泛型结构,如泛型类、接口和方法,以创建更加灵活和可重用的代码。
5、简述java中序列化和反序列化机制
答:
1、序列化机制是指将jvm内存中的对象转换成与操作平台无关的二进制流存储到外部装备如磁盘、U盘等
2、反序列化机制是指通过网络传输的情势将这种二进制流传到某个网络节点时,java程序会将其转换为java对象
6、简述java中,线程的5种状态
答:
要想实现多线程,必须在主线程中创建新的线程对象。Java 语言使用 Thread 类及其子类的
对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态:
①、新建: 当一个 Thread 类或其子类的对象被声明并创建时,新生的线程对象处于新建
状态。
②、就绪: 处于新建状态的线程被 start()后,将进入线程队列等待 CPU 时间片,此时它
已具备了运行的条件,只是没分配到 CPU 资源。
③、运行: 当就绪的线程被调度并得到 CPU 资源时,便进入运行状态, run()方法定义了线
程的操作和功能。
④、阻塞: 在某种特殊环境下,被人为挂起或执行输入输出操作时,让出 CPU 并临时中
止自己的执行,进入阻塞状态。
⑤、殒命: 线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结束。
7、简述java中8个基本数据范例是哪几个
答:byte、short、int、long、float、double、char、boolean
8、简述JDK、JRE、JVM三者的区别
答:
JDK = JRE + 开发工具集(比方 Javac 编译工具等)
JRE = JVM + Java SE 标准类库
9、面向对象的三大特性是哪三个
答:封装、继承、多态
10、简述java中,方法重写和重载的区别
答:
========重写========
①、子类重写的方法必须和父类被重写的方法具有雷同的方法名称、参数列表
②、子类重写的方法的返回值范例不能大于父类被重写的方法的返回值范例
③、子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限,子类不能重写
父类中声明为 private 权限的方法
④、子类方法抛出的异常不能大于父类被重写方法的异常
========重载========
①、在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数范例不同即可。 调用时,根据方法参数列表的不同来区别
②、子类可以对父类中继承到的方法举行重载
11、请你谈谈对java中多线程的理解
答:
what:
若一个进程同一时间并行执行多个线程,就是支持多线程的。
why:
多线程程序的长处:
①、进步应用程序的响应。对图形化界面更有意义,可增强用户体验。
②、进步盘算机体系 CPU 的使用率。
③、改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改。
when:
①、程序必要同时执行两个或多个使命。
②、程序必要实现一些必要等待的使命时,如用户输入、文件读写操作、网络操作、搜索等。
③、必要一些后台运行的程序时。
warning:
多个线程操作同一共享资源时,将引发数据不安全问题。解决的方案有:
Java 对于多线程的数据不安全问题提供了专业的解决方案:同步机制
Java 的同步机制有两种方式:同步代码块和同步方法。
12、简单形貌java中,通过反射获取Class对象的四种方式
答:
一、在知道类名称的环境下,可以通过 Class 类的 class 属性获取。
二、在有类的对象时,可以通过 getClass()方法获取。
三、已知类的完全限定名,可以通过 Class.forName(String)获取。
四、已知类的完全限定名,可以通过类的加载器加载获取。
13、形貌使用java实现单例模式的步调
答:
①、如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问
权限设置为 private,这样,就不能用 new 操作符在类的外部产生类的对象了,但在类内部
仍可以产生该类的对象。
②、由于在类的外部开始还无法得到类的对象,只能调用该类的某个静态公共方法以返回
类内部创建的对象,静态方法只能访问类中的静态成员变量,以是,指向类内部产生的该类
对象的变量也必须定义成静态的。
14、简述在java网络编程中,TCP和UDP编程协议的区别
答:盘算机间的信息传输必要遵守传输协议,常见的传输协议有TCP和UDP。当我们必要传输体量比较大的数据时,并且要求在传输过程中不丢失数据,这种环境下选用TCP协议;当我们必要快速传输体量比较小的数据,并且对传输过程中数据是否丢失不作要求的话,选用UDP。使用TCP时,我们必要创建两条进程,实现点对点传输,并且通过三次握手四次挥手来包管数据传输的安全性;使用UDP时,客户端向服务器端发送数据,服务器端对是否收到数据不会给出回应,客户端和服务器端是相互独立的,不必要建立连接。
15、谈谈你对java中注解的理解,可以从什么是注解,如何定义注解,如何使用注解三个方面谈谈
答:
- 什么是注解:注解(Annotation)是Java语言提供的一种用于为代码添加元数据的机制。它是一种特殊的解释,可以被编译器或其他工具读取并处理。
- 如何定义注解:定义注解使用@interface关键字。在注解中可以定义一些元素,这些元素可以有自己的默认值。
- 如何使用注解:注解可以直接用在代码中,好比类、方法或字段上。使用注解时,可以传递参数给注解的元素。
16、你是如何理解大数据技能的
17、JDBC中连接字符串作用
答:JDBC URL用来标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择精确的驱动程序,从而建立到数据库的连接
18、JDBC获取数据库连接的三要素
答:
1、驱动类
2、连接字符串
3、用户名和密码
19、编写JDBC程序的步调
答:
1、导入并添加java.sql包
2、通过反射加载并注册一个驱动程序
3、创建connection连接对象
4、创建一个statement对象
5、对数据库的增删改查操作中,增删改都只会返回int型数值,表示受影响的行数;对数据库的查询操作中,返回的数据会被封装打包为ResultSet供我们提取
6、依次关闭连接
20、JDBC有哪些常用接口
答:
JDBC(Java Database Connectivity)是Java语言用于数据库连接的一种标准规范,它定义了一系列接口,使得Java程序能够以一种同一的方式访问各种关系型数据库。常用的JDBC接口重要包括:
- DriverManager:用于管理数据库驱动程序,可以注册和注销驱动,以及建立数据库连接。
- Connection:代表与数据库的连接,通过它可以执行SQL语句,管理事务等。
- Statement:用于执行静态SQL语句并返回效果。
- PreparedStatement:继承自Statement,用于执行预编译的SQL语句。
- CallableStatement:用于执行SQL存储过程。
- ResultSet:代表SQL查询的效果集,可以从中获取查询到的数据。
21、事务的ACID属性
答:
1、原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2、一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态
3、隔离性:事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。
4、长期性:长期性是指一个事务一旦被提及,它对数据库中数据的改变就是永久的,接下来的其他操作和数据库故障不应该对其有任何影响。
22、简述JDBC数据库连接池的作用
答:数据库连接池技能可以解决传统开发中的数据库连接问题。数据库连接池就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数目的连接,但必要建立数据库连接时,只必要从“缓冲池”中取出一个,使用完毕之后再放回去。
23、简述maven的功能
24、简述maven的三个坐标
25、简述maven的scope依赖范围的常见取值
26、简述maven的三个生命周期
27、简述使用maven对main文件举行编译,使用什么下令?
28、请你使用maven对test文件举行编译,使用什么下令?
29、简述使用maven对项目举行打包,使用什么下令?
30、简述使用maven对项目举行安装,使用什么下令?
31、简述xml和json两种文件格式的作用和区别?
32、简述你对数据中台的理解?
33、Maven的作用
答:maven可以为java项目提供构建和依赖管理支持
34、git中,远程仓库拉下来与当前当地分支合并的下令
答:git pull 远程库地址别名 远程分支名
35、git remote add 远程地址,该下令表示什么?
答:起别名
36、git创建分支的下令
答:git branch 分支名
37、简述大数据解决什么问题
答:重要解决海量数据的采集、存储和分析盘算问题
38、简述hadoop解决什么问题
答:重要解决海量数据的存储和海量数据的分析盘算问题
39、简述hadoop框架中,1.x、2.x、3.x在组件组成上的区别
答:
1、hadoop1.x由mapreduce、hdfs、common构成,其中mapreduce负责资源调度和盘算,hdfs负责数据存储,common是辅助工具
2、hadoop2.x在1.x的根本上新增了yarn负责资源调度,mapreduce只负责盘算
3、hadoop3.x在组成上没有变化
40、简述在hadoop的hdfs文件体系中,一个文件块的大小是由什么决定的?
答:文件块大小由磁盘传输速率决定,它的大小往往是2的次方,比方,一家公司磁盘传输速率在500~600MB/s,那么建议数据块大小设置为512M
41、简述在hadoop中,常见的端口号有哪些,写出他们的作用
答:
NameNode内部通讯端口:8020
NameNode Http UI :9870
MapReduce查看执行使命端口:8088
历史服务器通讯端口:19888
42、简述hdfs中,常见的组件名字及其作用
答:
一、NameNode(NN),就是 Master,它是一个主管、管理者。
①、管理 HDFS 的名称空间;
②、配置副本战略;
③、管理数据块(Block)的映射信息;
④、处理客户端读写请求。
二、DataNode,就是 Slave。NameNode 下达下令,DataNode 执行实际的操作。
①、存储实际的数据块;
②、执行数据块的读写操作。
三、Secondary NameNode,并非 NameNode 的热备。当 NameNode 挂掉的时候,它并不能马上更换 NameNode 并提供服务。
①、辅助 NameNode,分担其工作量,好比定期合并 Fsimage 和 Edits,并推送给 NameNode;
②、在告急环境下,可辅助规复 NameNode。
四、Client:就是客户端。
①、文件切分。文件上传 HDFS 的时候,Client 将文件切分成一个一个的 Block,然后举行上传;
②、先与 NameNode 交互,获取文件的位置信息;
③、与 DataNode 交互,读取或者写入数据;
④、Client 提供一些下令来管理 HDFS,好比 NameNode 格式化;
⑤、Client 可以通过一些下令来访问 HDFS,好比对 HDFS 增删改查操作。
43、简述yarn中,常见的组件名字及其作用
答:
一、ResourceManager(RM)
①、处理客户端请求
②、监控NodeManager
③、启动或监控ApplicationMaster
④、资源的分配与调度
二、NodeManager(NM)
①、管理单个节点上的资源
②、处理来自ResourceManager的下令
③、处理来自ApplicationMaster的下令
三、ApplicationMaster(AM)
①、为应用程序申请资源并分配给内部的使命
②、使命的监控与容错
四、Container
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、cpu、磁盘、网络等
44、在shell编程中 ,定义一个函数,盘算两个数的和,并且调用该函数得出效果
在Shell编程中,定义一个函数来盘算两个数的和并调用该函数非常简单。以下是一个示例:
- # 定义函数
- sum() {
- local num1=$1
- local num2=$2
- local result=$((num1 + num2))
- echo $result
- }
- # 调用函数并传递参数
- result=$(sum 5 3)
- # 输出结果
- echo "The sum is: $result"
复制代码 在这个例子中,我们定义了一个名为sum的函数,它接受两个参数num1和num2,盘算它们的和,并返回效果。然后我们调用这个函数,传递两个数字作为参数,并将效果存储在变量result中。最后,我们输出这个效果。
45、简述HDFS文件体系的优缺点
答:
============长处============
1、高容错性
①、数据自动生存多个副本。它通过增加副本的情势,进步容错性。
②、某一个副本丢失以后,它可以自动规复。
2、适合处理大数据
①、数据规模:能够处理数据规模到达 GB、TB、甚至 PB 级别的数据;
②、文件规模:能够处理百万规模以上的文件数目,数目相称之大。
3、可构建在廉价机器上,通过多副本机制,进步可靠性
============缺点============
1、不适合低延时数据访问,好比毫秒级的存储数据,是做不到的
2、无法高效的对大量小文件举行存储 ①、存储大量小文件的话,它会占用 NameNode 大量的内容来存储文件目录和块信息。
这样是不可取的,由于 NameNode 的内存总是有限的;
②、小文件存储的寻址时间会超过读取时间,它违反了 HDFS 的计划目标。
3、不支持并发写入和文件随机修改
①、一个文件只能有一个写,不允很多个线程同时写;
②、仅支持数据追加(append),不支持文件的随机修改。
46、简述hdfs的写数据流程
1、客户端会根据分布式文件体系向NameNode请求上传文件
2、NameNode 检查目标文件是否存在,父目录是否存在,返回是否可以上传
3、客户端请求第一个 Block 上传到哪几个 DataNode 服务器上
4、对于常见环境,当复制因子为3时,NameNode会根据机架感知战略返回3个DateNote节点信息,分别是DateNote1、DateNote2、DateNote3。HDFS 的放置战略是,如果写入程序位于数据节点上, 则将一个副本放置在当地机器上,否则放置在随机数据节点上;将另一个副本放在不同(远 程)机架中的节点上,最后一个放在同一远程机架中的不同节点上。
5、客户端根据数据输出流向DataNode1节点请求建立block传输通道,DateNote1收到请求会继续调用DateNote2,然后DateNote2调用DateNote3,将这个通讯管道建立完成
6、DateNote1、DateNote2、DateNote3逐级应答客户端
7、当客户端开始往DataNode1节点上传第一个数据块(先从磁盘读取数据放到一个当地内存缓存),一个128M的数据块会被分成很多64KB大小的packet包,dn1 收到一个 Packet 就会传给 dn2,dn2 传给 dn3;dn1 每传一个 Packet 会放入一个应答队列等待应答。
8、当一个 Block 传输完成之后,客户端再次请求 NameNode 上传第二个 Block 的服务
器。(重复执行 3~7 步)
47、简述hdfs的读数据流程
答:
1、客户端通过 DistributedFileSystem 模块向 NameNode 请求下载文件,NameNode 通
过查询元数据,找到文件块所在的 DataNode 地址。
2、挑选一台 DataNode(就近原则,然后随机)服务器,请求读取数据。
3、DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位 来做校验)。
4、客户端以 Packet 为单位接收,先在当地缓存,然后写入目标文件。
48、简述NameNode和SecondaryNameNode的工作流程
答:
第一阶段:NameNode启动
1、第一次启动NameNode格式化后,创建FsImage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存,形成最新的元数据。
2、客户端对元数据举行增删改的请求。
3、NameNode记录操作日志,更新滚动日志。
4、NameNode在内存中对元数据举行增删改。
第二阶段:SecondaryNameNode工作
1、SecondaryNameNode询问NameNode是否必要CheckPoint,直接带回NameNode的响应
2、SecondaryNameNode请求执行CheckPoint
3、NameNode滚动正在写的Edits日志
4、将滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode
5、SecondaryNameNode加载编辑日志和镜像文件到内存,并合并
6、生成新的镜像文件fsimage.checkpoint
7、拷贝fsimage.checkpoint到NameNode
8、NameNode将fsimage.checkpoint重新命名成fsimage
49、简述DataNode的工作机制
答:
1、一个数据块在DataNode上以文件情势存储在磁盘上,包括两个文件,一个是数据自己,另一个是元数据,包括数据块的长度,快数据的校验和,以实时间戳
2、DataNode启动后向NameNode注册,通过后会立刻上报数据块,这是第一次上报,之后周期性(6小时)的向NameNode上报全部的块信息。
3、心跳是每3秒一次,心跳返回效果带有NameNode给该DataNode的下令,如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
4、集群运行中可以安全加入和退出一些机器。
50、简述MapReduce中,序列化的步调
答:
1、必须实现Writable接口
2、反序列化时,必要反射调用空参构造函数,以是必须有空参构造器
3、重写序列化方法
4、重写反序列化方法
5、留意反序列化的次序和序列化的次序完全一致
6、要想把效果表现在文件中,必要重写toString()方法,可用"\t"分开,方便后续用
7、如果必要将自定义的bean放在key中传输,则还必要实现Comparable接口,由于MapReduce框中的Shuffle过程要求对key必须能排序
51、叙述hadoop中的shuffle的流程
答:
map方法输出之后,reduce方法输入之前这个过程称为shuffle,它只是一个逻辑过程,并不是使命启动阶段,它高出了MapTask阶段和ReduceTask阶段。
map方法的输出效果以<k,v>键值对的情势传给采集器,采集器将数据写入环形缓冲区。环形缓冲区中有两类数据,一类是数据自己,以<k,v>键值对情势存储;一类是元数据,有kvindex,partition,kstart,vstart,vallen。环形缓冲区默认大小为100M,默认溢写阈值为80M,这个溢写阈值可以自定义。当数据写入环形缓冲区,它是从0M开始写,写到占据内存的80%,再从100M这个位置往里反向写入。当数据量比较大时,会生成多个溢写文件。Mapper会处理全部数据,包括在内存缓冲区始终达不到溢写阈值的剩余数据,也会被写入磁盘。数据在写入环形缓冲区之前就已经分好区了,在溢写的时候,还会对元数据举行一次分区,并会以分区为单位对元数据举行快排。等到这个切片上全部数据都溢写完成,会将全部的溢写文件合并成一个大文件,并对同一分区的数据举行归并排序。之后我们可以选择举行combine合并,利益是传输数据量会变小,但是条件不能影响终极效果的准确性。我们还可以选择将数据压缩,写入磁盘。
当全部MapTask进程处理完使命后,MrAppMaster会根据分区数目启动雷同数目的ReduceTask并告知要处理的数据分区。ReduceTask就会去各个MapTask所在节点的磁盘上拷贝相应分区的数据到内存缓冲区,若数据量大也会溢写进磁盘。当数据全部拷贝结束,会对数据举行归并排序并将同一key值的value值放一块传给reduce方法。
52、简述MapTask的5个阶段
答:
MapTask的5个阶段分为Read、Map、Collect、Spill、Merge阶段。
1、Read阶段:MapTask通过InputFormat得到一个个kv对
2、Map阶段:将Read阶段得到kv对交给map方法处理得到新的kv数据。
3、Collect阶段:收集map方法所产生数据并将数据写入环形缓冲区中。
4、Spill阶段:溢写,当环形缓冲区到达80%时,将数据快排并写入到磁盘中
53、简述ReduceTask的3个阶段
答:
ReduceTask的3个阶段分为Copy、Sort、Reduce阶段。
1、Copy阶段:将MapTask处理完的数据拷贝到内存中,如果数据过大会溢写。
2、Sort阶段:在拷贝的同时,会把内存和磁盘里雷同分区的数据举行合并,然后再归并排序。
3、Reduce阶段:接收sort阶段数据,运行reduce方法,将盘算效果发送给HDFS
54、论述mapreduce中,分区和reduceTask之间的数目问题
答:
ReduceTask数目可以自己设置,一样平常环境劣等于分区数目,输出分区数个文件。
当ReduceTask为1时,分区等于没设置,只会有一个输出文件。
当ReduceTask数小于分区数大于1时,程序报错。
当ReduceTask数大于分区数时,会有空文件产生,浪费性能。
当ReduceTask为0时,没有Reduce阶段。
55、简述mapreduce中,FileInputFormat切片规则
答:
1、切片的时候不思量数据集整体,而是逐个针对每一个文件单独切片。
2、简单地按照文件的内容长度举行切片
3、切片大小,默认等于Block的大小
4、当maxsize(切片最大值)<blocksize,会让切片变小,此时切片大小为maxsize
5、当minsize(切片最小值)>blocksize,会让切片变大,此时切片大小为minsize
6、当文件大小小于切片大小时,不对该文件举行切片;在切片时,检查剩余文件大小是否大于切片块的1.1倍,大于接着切,不大于不切。
56、没有行业工作履历,薪资要求高于预期怎么办
57、简述zookeeper中的选举机制和监听原理
答:
==========选举机制===========
假设有五台服务器组成的Zookeeper集群,他们的myid依次是1~5。假设他们都是最新启动的,那么在存放数据量这一点上,都一样没有历史数据。假设这些服务器按照id依次启动到半数以上的机器,也就是第三台服务器时,集群成功启动,选myid最大值的节点作为leader,其他服务器包括后面启动的服务器都会作为follower。
1)服务器1启动,此时只有它一台服务器启动了,它发出去的报文没有任何响应,以是它的选举状态不绝是LOOKING状态。
2)服务器2启动,它与最开始启动的服务器1举行通讯,相互交换自己的选举效果,由于两者都没有历史数据,以是id值较大的服务器2胜出,但是由于没有到达超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),以是服务器1、2还是继续保持LOOKING状态。
3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的leader,而与上面不同的是,此时有三台服务器选举了它,以是它成为了这次选举的leader。
4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,以是它只能接收当小弟的命了。
5)服务器5启动,同4一样当小弟。
到半数以上的机器,也就是第三台服务器时,集群成功启动,选myid最大值的节点作为leader,其他服务器作为follower。
==========监听原理===========
1)首先要有一个main()线程
2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通讯(connect),一个负责监听(listener)
3)通过connect线程将注册的监听事件发送给Zookeeper
4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
5)Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程
6)listener线程内部调用了process()方法
58、Hive 框架原理(非常重要)
1)用户接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc 访问 hive)、WEBUI(浏览器访问 hive)
2)元数据:Metastore
元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的范例(是否是外部表)、表的数据所在目录等。默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore。
3)Hadoop
使用 HDFS 举行存储,使用 MapReduce 举行盘算。
4)驱动器:Driver
(1)解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一样平常都用第三方工具库完成,好比 antlr;对 AST 举行语法分析,好比表是否存在、字段是否存在、SQL 语义是否有误。
(2)编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划举行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说,就是 MR/Spark。
59、Hive 和数据库的关系与比较
答:
1、Hive的元数据表默认存放在Derby库中,但由于Derby不能满意并发需求,以是我们会将Hive的元数据地址改为MySQL。
2、Hive和数据库除了拥有类似的查询语句,再无类似之处。
3、查询语言方面,由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性计划了类SQL的查询语言HQL。认识SQL开发的开发者可以很方便的使用Hive举行开发。
4、数据更新方面,由于Hive是针对数据仓库应用计划的,而数据仓库的内容是读多写少的。因此,Hive中不建议对数据的改写,全部的数据都是在加载的时候确定好的。而数据库中的数据通常是必要常常举行修改的,因此可以使用INSERT INTO...VALUES添加数据,使用UPDATE...SET修改数据
5、执行延迟方面,Hive在查询数据的时候,由于没有索引,必要扫描整个表,因此延迟较高。另外一个导致Hive执行延迟高的因素是MapReduce框架。由于MapReduce自己具有较高的延迟,因此在使用MapReduce执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。固然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行盘算显然能体现出优势。
6、数据规模方面,由于Hive建立在集群上并可以使用MapReduce举行并行盘算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
60、hadoop自定义分区的步调
61、公司是如那边理小数据的
答:
hadoop框架默认的TextInputFormat切片机制是对使命按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。
CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。
62、yarn调度器的种类
答:
现在,Hadoop 作业调度器重要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。 Apache Hadoop3.1.3 默认的资源调度器是 Capacity Scheduler。
63、Hive的运行机制
Hive 通过给用户提供的一系列交互接口,接收到用户的HQL指令,通过解析器将HQL指令解析成语法树,通过编译器将语法树编译成逻辑执行计划,通过优化器优化逻辑执行计划,再通过执行器将逻辑执行计划转化成物理执行计划。之后联合元数据(MetaStore),若盘算引擎是MapReduce,就将这些指令翻译成 MapReduce程序,并提交给Hadoop 的yarn执行,最后, 将执行返回的效果输出到用户交互接口。
64、hive中,内部表和外部表区别?你们公司在做数据分析的时候用什么表?什么场景下使用内部表、外部表?(非常重要)
答:
1、什么是内部表、外部表?
在Hive中,内部表(也称为管理表或Managed Table)和外部表(External Table)是两种不同的表范例。
2、内部表和外部表有什么区别?
它们在数据管理方式上存在一些关键区别:
1)内部表是由Hive完全管理的。当创建一个内部表时,Hive会控制表数据的整个生命周期,包括数据的存储和删除。具体来说,内部表的数据存储在Hive的数据仓库中,当删除一个内部表时,Hive会自动删除表的元数据以及存储在HDFS上的数据。
2)外部表则不同,Hive只管理外部表的元数据,而不控制实际的数据。外部表的数据存储在HDFS或其他外部文件体系中。当删除一个外部表时,Hive只会删除表的元数据,而不会删除存储在外部文件体系中的实际数据。
3、内部表和外部表有什么使用场景?
内部表适合于数据必要Hive完全管理的环境,而外部表则适用于数据必要在Hive之外举行共享或备份的环境。好比,天天将收集到的网站日志定期流入 HDFS 文本文件。在外部表(原始日志表)的根本上做大量的统计分析,用到的中间表、效果表使用内部表存储,数据通过 INSERT+SELECT 进 入内部表。
65、hive中, Order By、Sort By、Distribute By、Cluster By这四种排序有什么区别?(非常重要)
答:
1、Order By是按照指定字段对表数据举行全局排序,只有一个Reducer
2、Sort By是在分区后,按照指定字段对表数据举行区内排序,常在Distribute By后使用
3、Distribute By是按照指定的字段对表数据举行分区,分区后用Sort By来对区内数据排序
4、当Distribute By和Sort By字段雷同时,就可以使用Cluster By方式来排序,而且Cluster By只能是升序排序
66、hive中,数据表用什么来存的?
答:关于文件格式、压缩格式
67、hive中,分区表和分桶表有什么区别?
答:
分区针对的是数据的存储路径;分桶针对的是数据文件。
睁开讲就是,分区表实际上就是对应一个HDFS文件体系上的独立的文件夹,该文件夹下是该分区全部的数据文件。而对于一张表或者分区,hive可以进一步组织成桶,也就是更为细粒度的数据范围分别。
分桶是怎么分的呢?hive的分桶采用对分桶字段的值举行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
68、hive中自定义函数的步调?有用过什么自定义函数?
答:
步调:
在hive中,我们可以自定义的函数类别有UDF(一进一出)、UDAF(多进一出)、UDTF(一进多出)这三种。创建流程大体是一致的,我们以自定义UDF函数为例。
1、创建一个Maven工程,导入(hive-exec)依赖
2、创建一个自定义函数类,必要继承GenericUDF类,并重写里面的抽象方法,好比initialize、evaluate、getDisplayString方法(方法的作用)
3、打成jar包上传到hive安装目录的lib目录下,并重启hive服务使得对全部会话有用,或者通过 add jar下令动态地将jar包添加到当前会话的classpath中
4、接着在hive会话中创建临时或永久函数,并与开发好的自定义函数类做关联
5、这时候我们就可以在hql语句中使用自定义的函数了,但是我们还要留意测试和调试,验证自定义函数的功能是否精确,之后我们可以编写文档,说明它的功能和使用方法
有用过什么自定义函数:
通过自定义函数将一行字符串根据分隔符直接炸成多行字符串(虽然我们通过在explode函数中使用split函数也可以实现)
69、hive中,开窗函数用到over(),那over()怎么用的?
答:
over()指定分析函数工作的数据窗口大小,OVER() 子句可以包含多个参数,用于定义窗口的边界和排序方式。
常用分析函数有:
- lag(col,n,default_val):用于访问效果集中当前行之前的第 n 行的数据
- lead(col,n,default_val):用于访问效果集中当前行之后的第 n 行的数据
- ntile(n):用于将效果集中的行分成指定数目的组(分区)
- Rank函数:rank()、dense_rank()、row_number()
over()子句的常见参数:
- OVER (
- [PARTITION BY partition_expression [, ...]],
- [ORDER BY order_expression [ASC | DESC], ...],
- [ROWS BETWEEN range_boundary_preceding AND range_boundary_following]
- )
复制代码
- PARTITION BY:指定窗口的分区标准,每个分区内的数据独立举行窗口函数的盘算。
- ORDER BY:指定窗口内数据的排序方式,排序依据可以影响窗口函数的盘算效果。
- ROWS BETWEEN:指定窗口的大小,可以是固定的行数,也可以是当前行之前或之后的行数。
70、 hive中,最近用开窗函数分析的指标是什么?说一下sql语句怎么写的,有哪些表?哪些字段?如何开窗?开窗的语法是什么?为什么这么开窗?用什么样的分析函数?
答:
71、hive中如何实现覆盖写?
答:
在Hive中,覆盖写(Overwrite)是一种常用的操作,用于更新表中的数据。覆盖写可以用来更新表中某个分区或整张表的数据。以下是实现覆盖写的步调:
- 选择要覆盖写的表:首先,必要确定要举行覆盖写的表。如果只是想更新表中的部门数据,可以选择特定的分区举行覆盖写。
- 创建查询:使用SELECT语句来选择要写入表中的数据。这个查询应该包括全部表中存在的列,以及必要更新的数据。
- 执行覆盖写操作:使用INSERT OVERWRITE语句来执行覆盖写操作。如果只想更新表的某个分区,可以使用PARTITION关键字来指定分区。
- 提交使命:执行完覆盖写操作后,提交Hive使命。
72、hive中,常见聚合函数?用过哪些聚合函数?
答:
常见的聚合函数包括:
- COUNT():盘算指定列中非NULL值的个数,或者盘算表中的行数。
- SUM():盘算列中数值的总和。
- AVG():盘算列中数值的均匀值。
- MAX():返回列中的最大值。
- MIN():返回列中的最小值。
73、hive中,rank()、dense_rank()、row_number()有什么区别?
答:
RANK() 排序雷同时会重复,总数不会变。 DENSE_RANK() 排序雷同时会重复,总数会减少。 ROW_NUMBER() 会根据次序盘算。 74、hive的内置函数包括哪几种?怎么用的
答:
1、NVL(value,default_value)。它的作用:给值为 NULL 的数据赋值,如果 value 为 NULL,则 NVL 函数返回 default_value 的值,否则返回 value 的值,如果两个参数都为 NULL ,则返回 NULL 2、CASE WHEN THEN ELSE END 3、行转列: 1)CONCAT(string A/col, string B/col…):返回输入字符勾通接后的效果,支持任意个输入字符串; 2)CONCAT_WS(separator, str1, str2,...):它是一个特殊情势的 CONCAT()。第一个参数是剩余参数间的分隔符 3)COLLECT_SET(col):函数只接受基本数据范例,它的重要作用是将某字段的值举行去重汇总,产生 Array 范例字段 4、列转行: 1) EXPLODE(col) :将 hive 一列中复杂的 Array 或者 Map 结构拆分成多行 2)LATERAL VIEW udtf(expression) tableAlias AS columnAlias:用于和 split, explode 等 UDTF 一起使用,它能够将一列数据拆成多行数据,在此根本上可以对拆分后的数据举行聚合。 5、开窗函数: 1) LAG(col,n,default_val) :往前第 n 行数据, 若为空,则返回设置的默认值default_val 2) LEAD(col,n, default_val) :往后第 n 行数据, 若为空,则返回设置的默认值default_val 3)NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从 1 开始,对于每一行,NTILE 返回此行所属的组的编号。 留意:n 必须为 int 范例。 6、排序函数: 1)RANK() 排序雷同时会重复,总数不会变。 2)DENSE_RANK() 排序雷同时会重复,总数会减少。 3)ROW_NUMBER() 会根据次序盘算。 75、简述Hive中分析函数Lag和Lead的区别。
答:
1) LAG(col,n,default_val) :往前第 n 行数据, 若为空,则返回设置的默认值default_val 2) LEAD(col,n, default_val) :往后第 n 行数据, 若为空,则返回设置的默认值default_val 76、hive中治理数据倾斜的方法
答:
1、针对group by 造成的数据倾斜,可以思量将hive.map.aggr配置选项设置为true,使Hive尽大概地在Map端完成聚合操作,从而减少Reduce使命的数目和数据倾斜问题。
2、针对小表 join 大表出现的数据倾斜,将Reduce join 改为Map join,这样制止了Shuffle阶段,从而制止了数据倾斜,条件是小表的大小的不能太大,一样平常也就几百兆
3年龄据工程师总结:Hive数据倾斜保姆教程(手册指南) (qq.com)
Hive调优——数据倾斜的解决指南_hive数据倾斜解决办法-CSDN博客
77、 flume采集数据的时候会丢吗?
答:
==============事务机制=================
Flume通过其内部的事务机制来确保数据的完整性和一致性。Flume的事务性可以分为两个阶段:从Source到Channel的传输(put事务)和从Channel到Sink的传输(take事务):
put事务原理:
1、当Source接收到数据时,它会将这些数据封装成事件(Event)并写入到Channel。
2、写入操作是事务性的,意味着Source会实行将事件写入Channel,并在成功写入后提交事务。如果写入操作失败(比方,Channel已满或Channel不可用),Source会回滚事务,确保数据不会被部门写入。
3、只有当全部事件都成功写入Channel并提交事务后,Source才会认为这些事件已经成功处理,并继续处理下一批事件。
take事务原理:
1、Sink从Channel读取事件的过程也是事务性的。Sink会实行从Channel中读取事件,并在成功读取后提交事务。
2、如果读取操作失败(比方,Channel中没有可用的事件或Channel不可用),Sink会回滚事务,确保没有对事件举行处理。
3、只有当全部事件都成功读取并提交事务后,Sink才会认为这些事件已经被处理,并继续读取下一批事件。
78、在kafka中,生产者消息发送的流程有哪些步调?
答:
1、首先在消息发送的过程中,涉及到两个线程,分别是main线程和sender线程。
2、生产者在main线程创建一个ProducerRecord对象,这个对象包含目标主题(Topic)和要发送的消息,还可以指定键(Key)、分区(Partition)和副本数目。
3、通过序列化器,生产者将消息的键和值序列化为字节数组。
4、如果ProducerRecord中没有指定分区,那么分区器会根据键(Key)来选择一个分区。如果消息中没有键,那么分区器会使用轮询(Round-Robin)战略来选择一个分区。
5、序列化后的数据会被添加到双端队列缓冲区(RecordAccumulator)的不同队列中,sender线程会不绝轮询队列,看是否有消息批次到达配置的阈值(批处理大小或等待时间),如果满意触发条件就会从缓冲区中读取这些消息批次,并将其发送给NetworkClient(网络客户端)。每个消息批次都会形成一个请求request,默认每个broker节点最多缓存5个请求。
6、Selector通过网络将请求request发送到Kafka集群的Broker
7、如果在发送过程中发生异常,如网络问题或Broker节点故障,NetworkClient会根据生产者的配置举行重试。
8、发送完成后,NetworkClient会等待Broker的应答。默认是Leader 和 isr 队列 里面的全部节点收齐数据后应答。可以通过生产者的配置,修改应答级别。
0 :生产者发送过来的数据,不必要等数据落盘应答。 1 :生产者发送过来的数据, Leader 收到数据后应答。 -1 ( all ) :生产者发送过来的数据, Leader 和 isr 队列 里面的全部节点收齐数据后应答。 9、producer收到响应时会调用回调函数,回调函数有两个参数,分别是元数据信息(RecordMetadata)和异常信息(Exception),如果Exception为null,说明消息发送成功,如果Exception不为null,说明消息发送失败。 79、遍历Map聚集的常见方法
答:
1、使用for-each循环和Map.Entry遍历: 这是一种非常常用的方法,通过Map.Entry对象可以同时获取键和值
2、使用Iterator遍历: 使用Map的entrySet()方法获取迭代器
3、只遍历键或值: 如果只必要键或值,可以使用keySet()或values()方法
4、使用Java 8的Stream API: Java 8引入了Stream API,也可以用来遍历Map
80、stringbuffer和stringbuilder的区别
答:
1、StringBuffer的方法都是同步的,使用synchronized关键字来包管线程安全;
StringBuilder不是线程安全的,它没有同步方法
2、StringBuffer由于其线程安全的特性,通常比StringBuilder慢
3、StringBuffer适用于多线程环境下的字符串操作,而StringBuilder适用于单线程环境下的高性能字符串操作
81、kafka根本架构
答:
1、生产者:生产者是向Kafka集群发送消息的客户端应用程序。它们可以发送消息到Kafka集群中的一个或多个主题(Topic),每个主题可以有多个分区(Partition)
2、kafka集群
3、消费者:每个消费者可以订阅多个topic,可以指定订阅的分区,并且可以同时消费来自不同分区的数据,这种并行读取可以显著进步消息处理的吞吐量。
4、消费者组:消费者组用于管理一组消费者的和谐和负载平衡。一个消费者组可以消费多个Topic,组内每个消费者负责消费不同的分区,从而实现负载平衡。如果多个消费者订阅了雷同的Topic,但它们属于不同的消费者组,这些消费者可以并行消费消息,而不会产生重复。
5、zookeeper:Zookeeper用于和谐Kafka集群中的署理。它维护署理的元数据信息,如主题和分区的信息,以及领导者副本的选举。Zookeeper还帮助实现署理之间的通讯。
82、生产者如何包管数据可以百分百发送给kafka?
答:
83、生产者要往kafka发送数据,如何包管数据不重复不丢?
答 主题
实现准确一次有两种方法: 1、幂等性+至少一次(...) 2、幂等性+事务机制 84、kafka中,如何包管数据单分区有序?
答:
85、kafka中,开启并使用事务的步调
答:
1、设置事务 id(必须),事务 id 任意起名
properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "transactional_id_0"); 2、初始化事务 kafkaProducer.initTransactions(); 3、开启事务 kafkaProducer.beginTransaction(); 4、提交事务 kafkaProducer.commitTransaction(); 5、终止事务 kafkaProducer.abortTransaction(); 86、kafka中,分区在生产环境中带来什么样的利益?
答:
一、 便于合理使用存储资源 ,每个 Partition 在一个 Broker 上存储,可以把海量的数据按照 分区切割成一块一块数据存储在多台 Broker 上。合理控制分区的使命,可以实现 负载平衡 的效果。 二、 进步并行度 ,生产者可以以分区为单位发送数据;消费者可以以分区为单位举行 消费数 据 。 87、kafka中的三种应答级别
88、kafka的几种分区战略
答:
89、kafka三种数据传递语义,用ack的应答级别怎么设置?
答:
1、至少一次(At Least Once)=ACK级别设置为-1+分区副本大于等于2+ISR里应答的最小副本数目大于等于2
2、最多一次(At Most Once)=ACK级别设置为0或1
3、准确一次(Exactly Once):幂等性+至少一次(ack=-1+分区副本书>=2+ISR最小副本数目>=2)
90、kafka中,生产者如何实现自定义分区器?
答:
1、定义类实现 Partitioner 接口。
2、重写 partition()方法
3、使用分区器的方法,在生产者的配置中添加分区器参数
91、kafka中,broker的工作流程
答:
1、broker启动后会把自身的元数据信息注册到zookeeper中
2、每个broker中都会有一个controller进程,当kafka集群启动时,各个broker中的controller谁先在zookeeper中注册,这个controller就会去监听brokers节点变化,并管理副本leader的选举。
3、选举过程中,controller会根据“在isr中存活为条件,按照AR中排在前面的优先”这样的规则选举leader,其他存活的副本作为follower。
4、controller会将节点信息上传到zookeeper上,包括副本的leader所在的节点,以及isr队列中会记录存储该副本的存活的节点有哪些(包括leader和follewer)
5、其他broker上的controller进程会从zookeeper同步相关信息。
6、假设broker1中的leader挂了,controller会监听到节点变化,从zookeeper中获取isr列表信息,并会根据“在isr中存活为条件,按照AR中排在前面的优先”这样的规则重新选举leader。如果follower挂了,不会影响leader。
7、当生产者往leader所在节点发送消息,,由于应答级别设置为-1,leader会等isr列表里的全部节点收齐消息后应答producer。数据在broker逻辑上是以分片的情势存储的,分片大小最大1G,实际数据存储在.log文件中,.index是索引文件。
92、kafka中,LEO和HW的区别?
答:
1、LEO(Log End Offset):每个副本的最后一个offset,LEO其实就是最新的offset+1
2、HW(High Watermark):全部副本中最小的LEO
93、kafka中,AR、ISR和OSR之间的关系?
答:
AR(Assigned Replicas):是kafka分区中的全部副本所在节点的broker id的列表
ISR:kafka分区中全部活着的副本所在节点的broker id的列表
OSR:kafka分区中挂了的副本所在节点的broker id的列表
关系:AR = ISR + OSR
94、kafka是如何实现高效读写数据的?
答:
1、kafka自己是分布式集群,可以采用分区技能,并行度高
2、读数据采用稀疏索引,可以快速定位要消费的数据
3、kafka的producer生产数据,会写进日志文件中,写的过程是次序写,次序写可以省去大量磁头寻址的时间
4、零拷贝:kafka的数据加工处理操作交由kafka生产者和kafka消费者来处理,而kafka Broker应用层不关心存储的数据,以是读取数据时不消走应用层,传输效率高
PageCache页缓存:kafka重度依赖底层操作体系提供的页缓存功能。当上层有写操作是,操作体系只是将数据写入页缓存中。当读操作发生时,先从页缓存中查找,如果找不到,再去磁盘中读取。实际上,页缓存是把尽大概多的空闲内存都当作了磁盘缓存来使用。
95、kafka中,假设一个主题的数据有4个分区,配几个消费者可以到达最好的性能?
答:4个消费者
96、kafka中,消费者组初始化流程
答:
1、消费者启动时,会指定它所属的消费者组id,并连接到kafka集群。
2、消费者向kafka集群发送一个加入消费者组的请求,这个请求会被发送给kafka集群中的组和谐器,由组和谐器来管理加入消费者组。
3、如果消费者组是第一次启动,kafka会从各节点的和谐器中选举一个和谐器负责管理这个消费者组的全部请求,包括消费者加入和离开组、分区分配等。
选举规则:consumer_offsets主题的第 “hashcode值%50” 个分区所在节点的和谐器为该消费者组的组和谐器。(50为consumer_offsets主题的默认分区数目)
4、组和谐器在消费者组中选出一个consumer作为leader
5、组和谐器把要消费的topic环境发送给consumer leader
6、consumer leader会负责订定消费方案,并把消费方案发给组和谐器
7、组和谐器会把消费方案下发给组内各个消费者实例
8、组内每个消费者实例都会和组和谐器保持默认3秒一次的心跳,一旦超过默认的45s没有响应,该消费者就会被移除,并触发再平衡;或者消费者处理消息的时长超过默认的5分钟,也会触发再平衡。
97、kafka中,消费者组详细消费流程
答:
1、组内消费者通过网络客户端向分区发送消费请求
2、当分区内写入消息,数据量到达默认的50M阈值,或者等待时间到达默认的500ms时,消费者从分区拉取消息,一次拉取的消息条数最大值默认500条,这些消息被存储到消费者的内存缓冲区中。
3、消费者对拉取到的消息举行反序列化处理、业务逻辑处理等
4、在处理完消息后,消费者必要向Kafka提交offset,表示这些消息已经被消费。
98、kafka中,生产履历--消费者分区的分配以及再平衡
答:
==============分区分配战略=================
1、kafka中默认的分区分配战略是什么?它的工作原理是什么?
Range+CooperativeSticky
这种默认分配战略联合了Range战略的平衡性和CooperativeSticky战略的粘性
2、列举消费者主流的分区分配战略是什么?
1)Range:
对于每个主题,将分区按范围分给消费者。每个消费者负责一个连续的分区范围。这种战略可以包管负载平衡,但大概会导致某些消费者处理更多的数据。
2)RoundRobin:
把消费者组订阅的全部主题的全部分区当作一个整体,分别对分区和消费者排序,然后通过轮询的方式,按照次序将分区分配给消费者。
3)Sticky、CooperativeSticky:
对于每个主题,将分区平衡的分配给消费者,在发生再平衡时,会尽量保持原有的分区分配稳定,即保持消费者与分区的粘性,这种战略通过最小化分区的移动来实现
==============再平衡================
1、什么时候会触发消费者的分区再平衡?
消费者加入或离开消费者组、主题的分区数发生变化
2、如果一个消费者在处理消息时超过了max.poll.interval.ms设置的时间,会发生什么?
移出消费者组,触发消费者分区再平衡
3、在使用range分区战略时,如果一个消费者宕机,其他消费者如何重新分配这个消费者的分区?
分区会作为一个整体分配给其他某个消费者
4、在使用粘性分区战略时,如果一个消费者宕机,其他消费者如何重新分配这个消费者的分区?
分区会通过轮询的方式,分配给其他消费者
5、如果在使用RoundRobin分区战略时,一个消费者宕机,其他消费者如何重新分配这个消费者的分区?
分区会按照粘性规则,尽大概平衡、随机地分配给其他消费者
99、kafka中,面临数据积存的环境,消费者如何进步吞吐量
答:
1、增加topic的分区数,并同时增加消费组的消费者数目,包管消费者数=分区数
2、进步每次从分区拉取消息数目的最大值,即max.poll.records
100、kafka中,什么是重复消费、漏消费?怎么能做到既不漏消费也不重复消费?
答:
重复消费:
是指将数据拉到消费者的内存缓冲区后,此时数据还没有被处理,以是offset并没有被自动提交。此时,消费者挂了,当重启消费者后,会从上一次提交的offset处重新消费数据。
漏数据:
是指数据已经在消费者的内存缓冲区内处理过了,在数据落盘长期化前,我们利市动提交了offset。此时若消费者挂了,内存里的数据丢失,而由于已经提交了offset,当重启消费者后,并不会重新消费数据。
怎么能做到既不漏消费也不重复消费?(。。。)
1、建议在业务逻辑处理完数据并确认数据已经被成功长期化后,再手动提交offset,这样可以制止在消费者线程kill或其他故障环境下导致的数据丢失或重复消费。 2、将kafka消费端的消费过程和提交offset过程做原子绑定,下游消费者支持事务,将kafka的offset生存到支持事务的自定义介质(如MySQL) 101、给集群加机器或者给机器加硬盘后,如何实现数据平衡?
答:
1 )节点间数据平衡 开启数据平衡下令: start-balancer.sh -threshold 10 对于参数 10 ,代表的是集群中各个节点的磁盘空间使用率相差不超过 10% ,可根据实 际环境举行调整。 克制数据平衡下令: stop-balancer.sh 2 )磁盘间数据平衡(单个节点) ( 1 )生成平衡计划 hdfs diskbalancer -plan hadoop183 ( 2 )执行平衡计划 hdfs diskbalancer -execute hadoop183.plan.json ( 3 )查看当前平衡使命的执行环境 hdfs diskbalancer -query hadoop183 ( 4 )取消平衡使命 hdfs diskbalancer -cancel hadoop183.plan.json 102、hadoop参数调优
==========问题1=============
景象形貌 :总共 7 台机器,天天几亿条数据,数据源 ->Flume->Kafka->HDFS->Hive 面临问题:数据统计重要用 HiveSQL ,没有数据倾斜,小文件已经做了合并处理,开 启的 JVM 重用,而且 IO 没有阻塞, 内存用了不到 50% 。 但是还是跑的非常慢,而且数据 量洪峰过来时,整个集群都会宕掉。基于这种环境有没有优化方案。 解决办法: 内存使用率不敷。这个一样平常是 Yarn 的 2 个配置造成的,单个使命可以申请的最大内存 大小,和 Hadoop 单个节点可用内存大小。在 yarn-site.xm l配置文件中,调治这两个参数能进步体系内存的使用率。 (a)yarn.nodemanager.resource.memory-mb 表示该节点上 YARN 可使用的物理内存总量,默认是 8192(MB),留意,如果你的节点 内存资源不敷 8GB,则必要调减小这个值,而 YARN 不会智能的探测节点的物理内存总量。 (b)yarn.scheduler.maximum-allocation-mb 单个使命可申请的最多物理内存量,默认是 8192(MB)。 ==========问题2============== 问题形貌:当HDFS 集群面临高并发访问时,比方有很多客户端同时举行文件操作,如何进步 NameNode 处理请求的能力? 解决办法:
在配置文件hdfs-site.xml中,调大参数 dfs.namenode.handler.count,它的默认值为10。
<property> <name>dfs.namenode.handler.count</name> <value> 10 </value> </property> 如何确定这个值? dfs.namenode.handler.count=20 × ,好比集群规模为 8 台时,此参数设置为 41。可通过简单的 python 代码盘算该值,代码如下。 - [bdqn@hadoop182 ~]$ python
- Python 2.7.5 (default, Apr 11 2018, 07:36:10)
- [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
- Type "help", "copyright", "credits" or "license" for more
- information.
- >>> import math
- >>> print int(20*math.log(8))
- 41
- >>> quit()
复制代码
103、如何确定kafka机器数目?
答: Kafka 机器数目(履历公式) =2* (峰值生产速度 * 副本数 /100 ) +1 先拿到峰值生产速度,再根据设定的副本数,就能预估出必要摆设 Kafka 的数目。 好比: 我们的峰值生产速度是 50M/s 。副本数为 2 。 Kafka 机器数目 =2* ( 50*2/100 ) + 1=3 台 104、如何确定kafka分区数目?
答: 1 )创建一个只有 1 个分区的 topic 2 )测试这个 topic 的 producer 吞吐量和 consumer 吞吐量。(通过kafka压力测试得到吞吐量) 3 )假设他们的值分别是 Tp 和 Tc ,单位可以是 MB/s 。 4 )然后假设总的目标吞吐量是 Tt ,那么分区数 =Tt / min ( Tp , Tc ) 5)尽量保持kafka集群规模和分区数目相等 好比: producer 吞吐量 =20m/s ; consumer 吞吐量 =50m/s ,盼望吞吐量 100m/s ; 分区数 =100 / 20 =5 分区 https://blog.csdn.net/weixin_42641909/article/details/89294698 分区数一样平常设置为: 3-10 个 105、维度建模
答:《03-大数据项目之电商数据仓库体系》2.3、2.4、2.5 106、ods层的用户留存率?
107、数仓怎么分层的?
108、hive string的字符串截取函数、求某某数的对数的函数
重点:项目分层、哪些指标、离线中常见函数、
hive中map流程太长了,怎么优化?按照自己的业务逻辑,切分成很多小的临时表作为下一层的输入
列转行、行转列、dwd层、ods层
项目、hive
spark常见算子,转化算子
spark血缘
spark怎么提交资源
spark宽依赖窄依赖
mysql中添加一个字段,用sqoop统计字段的时候会有影响吗
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |