ZK/Flume/DataX/MaxWell/DS/JSE知识点复习

一、Zookeeper

1)常用命令

ls、get、create、delete、deleteall

2)选举机制

半数机制(过半机制):2n+1,安装奇数台。

台数多,好处:提高可靠性;坏处:影响通信延时。

(SID:服务器ID。用来唯一标识一台 ZooKeeper集群中的机器,每台机器不能重复,和myid一致

ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻, 集群中的每台机器的ZXID值不一定完全一致,这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑有关。

Epoch:每个Leader任期的代号。没有 Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加.)

Zookeeper选举机制–第一次启动

假设共5台服务器,半数原则,需满足3台。

(1)服务器1启动,发起一次选举,服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),无法完成选举,服务器1状态保持为looking;

(2)服务器2启动,再发起一次选举,服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1) 大,更改选票为推举服务器2,此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1、2状态保持为Looking;

(3)服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;

(4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为 1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING

(5)服务器5启动,同4一样当小弟。


Zookeeper选举机制——非第一次启动

(1)当ZooKeeper集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:

• 服务器初始化启动。 • 服务器运行期间无法和Leader保持连接。

(2)而当一台机器进入Leader选举流程时,当前集群也可能会处于以下两种状态:

• 集群中本来就已经存在一个Leader。

对于第一种已经存在Leader的情况,机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立连接,并进行状态同步即可。

• 集群中确实不存在Leader。

假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并且此时SID为3的服务器是Leader。某一时刻, 3和5服务器出现故障,因此开始进行Leader选举。

​ (EPOCH,ZXID,SID)

SID为1、2、4的机器投票情况: (1,8,1) (1,8,2) (1,7,4)

选举Leader规则: ①EPOCH大的直接胜出 ②EPOCH相同,事务id(ZXID)大的胜出 ③事务id相同,服务器id(SID)大的胜出

二、Flume
一、Flume 组成,Put 事务,Take事务

1)Taildir Source (Flume中的一种源,用于从文件系统中的多个目录中收集日志数据。它具有断点续传和多目录的功能)

(1)断点续传、多目录

断点续传:当Flume启动或者重新启动时,Taildir Source可以在上一次停止的地方继续读取日志文件,而不必重新开始。

多目录:Taildir Source支持监视多个目录,可以同时从多个不同的目录中收集日志数据。

(2)taildir 底层原理

Taildir Source的底层原理是通过监视文件系统中的目录来实现的。它使用了类似于Linux中的tail命令的概念,即持续读取文件的末尾(tail)部分,以实时获取新增的日志数据。下面是Taildir Source的基本工作流程:

1.读取一批数据(batchsize) 2.doPut:放到putList中 3.doCommit:放到Queue中

4.若数据成功到达Channel,则更新positionFile 5.读取下一批数据

6.若数据未成功到达channel,doRollBack并清空putList 7.不更新positionFile,从上次位置重新读取

(3)Taildir挂了

因为有断点续传,所以不会丢数。但有产生重复数据的可能

(4)存在的问题及解决方案

①问题: 新文件判断条件 =iNode值 + 绝对路径(包含文件名) 日志框架凌晨修改了文件名称=》导致会再次重读一次昨天产生的数据

②解决:

方案一:建议生成的文件名称为带日期的。同时配置日志生成框架为不更名的;

方案二:修改TairDirSource源码,只按照iNode值去确定文件

2)file channel /memory channel/kafka channel

(1)File Channel

数据存储于磁盘,优势:可靠性高;劣势:传输速度低

默认容量:100万个event

注意:FileChannel 可以通过配置dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume 吞吐量。

(2)Memory Channel

数据存储于内存,优势:传输速度快;劣势:可靠性差

默认容量:100个event

(3)Kafka Channel

数据存储于Kafka,基于磁盘

优势:可靠性高; 传输速度快

Kafka Channel 大于 Memory Channel + Kafka Sink 原因省去了 Sink 阶段

Kafka Sink用于将Flume事件数据发送到Apache Kafka中

(4)生产环境如何选择

如果下一级是Kafka,优先选择KafkaChannel。

如果是金融、对钱要求准确的公司,选择FileChannel。

如果就是普通的日志,通常可以选择MemoryChannel。

3)HDFS Sink

(1)时间(半个小时) or 大小128m 且 设置Event个数等于0,该值默认10

具体参数:hdfs.rollInterval=1800,hdfs.rollSize=134217728 且 hdfs.rollCount=0

4)事务

Source到Channel是Put事务

Channel到Sink是Take事务

二、Flume拦截器

1)拦截器注意事项

(1)时间戳拦截器:

主要是解决零点漂移问题(零点漂移问题指的是当事件数据中的时间戳与Flume系统当前时间存在较大差异时可能出现的情况,可能会对数据处理和分析造成困扰,例如无法准确地进行事件排序、统计分析等)

时间戳拦截器是一种Flume拦截器,用于在事件数据中添加或者修正时间戳信息。通过时间戳拦截器,可以将事件数据中的时间戳与Flume系统当前时间进行比较,并根据需要进行调整,从而消除或者减小时间戳与实际时间的差异,防止零点漂移问题的发生。

2)自定义拦截器步骤

(1)实现 Interceptor

(2)重写四个方法

initialize 初始化

publicEvent intercept(Event event) 处理单个 Event

public List intercept(List events) 处理多个 Event,在这个方法中调用Event intercept(Event event)

close方法

(3)静态内部类,实现Interceptor.Builder

3)拦截器可以不用吗?

时间戳拦截器建议使用。如果不用需要采用延迟15-20分钟处理数据的方式,比较麻烦。

三、Flume Channel 选择器

Replicating:默认选择器。功能:将数据发往下一级所有通道。

Multiplexing:选择性发往指定通道。

四、Flume 监控器

1)监控到异常现象

采用Ganglia 监控器,监控到Flume尝试提交的次数远远大于最终成功的次数,说明 Flume 运行比较差。

主要是内存不够导致的。

2)解决办法?

(1)自身:默认内存是20m,考虑增加flume内存,在flume-env.sh配置文件中修改 flume 内存为 4-6g

(2)找朋友:增加服务器台数 搞活动 618 =》增加服务器 =》用完在退出

​ 日志服务器配置:8-16g内存、磁盘8T

五、Flume 采集数据会丢失吗?

如果是kafka channel 或者FileChannel不会丢失数据,数据存储可以存储在磁盘中。

如果是MemoryChannel有可能丢。

六、Flume 如何提高吞吐量

调整taildirsource 的batchSize 大小可以控制吞吐量,默认大小100个Event。

吞吐量的瓶颈一般是网络带宽。

三、DataX
1)DataX和Sqoop用于离线系统中批量同步数据处理场景
2)DataX和Sqoop区别如下:

(1)DataX底层是单进程多线程;Sqoop底层是4个Map;

(2)数据量大的场景优先考虑Sqoop分布式同步;数据量小的场景优先考虑DataX,完全基于内存;DataX数据量大,可以使用多个DataX实例,每个实例负责一部分(手动划分)。

(3)Sqoop 是为Hadoop而生的,对Hadoop相关组件兼容性比较好;Datax是插件化 开发,支持的Source和Sink更多一些。

(4)Sqoop目前官方不在升级维护;DataX目前阿里在升级维护

(5)关于运行日志与统计信息,DataX更丰富,Sqoop基于Yarn不容易采集

3)DataX导入数据

(1)全量同步的表如下

活动表、优惠规则表、优惠卷表、SKU平台属性表、SKU销售属性表

SPU商品表(1-2万)、SKU商品表(10-20万)、品牌表、商品一级分类、商品二级分类、商品三级分类 、 省份表、地区表 、编码字典表

(2)增量同步的表如下

加购表(20万)、订单表(10万)、订单详情表(15万)、订单状态表、支付表(9 万)、退单表(1000)、退款表(1000) 订单明细优惠卷关联表、优惠卷领用表 商品评论表、收藏表 用户表、订单明细活动关联表 增量数据每天1-2g

4)Datax 如何实现增量同步

获取今天新增和变化的数据:通过sql过滤,创建时间是今天或者操作时间等于今天。

四、Maxwell

都是主要用于实时系统中实时数据同步处理场景

1)Maxwell好处

支持断点续传

全量初始化同步(可以将数据库中的现有数据以变更事件的形式发送到消息队列中,从而实现全量数据的初始化同步,确保目标系统与源数据库的数据一致性。)

自动根据库名和表名把数据发往Kafka的对应主题

2)Maxwell底层原理

MySql主从复制

将一个 MySQL 数据库服务器(主服务器)上的数据实时复制到其他一个或多个 MySQL 数据库服务器(从服务器)上的过程。在主从复制中,主服务器负责接收客户端的写操作并记录到自己的 binlog 中,而从服务器则定期连接到主服务器,获取主服务器上的 binlog,并将其应用到自己的数据中,从而保持与主服务器上数据的一致性。

3)全量同步速度如何

同步速度慢,全量同步建议采用Sqoop或DataX

4)Maxwell数据重复问题

同步历史数据时,bootstrap会扫描所有数据。

同时maxwell会监听binlog变化。

例如:用bootstarp同步历史数据库时,历史数据库中新插入一条数据,这时bootstrap扫描到,maxwell进程也监控到了,就会出现数据重复问题。

五、DolphinScheduler 调度器
  1. 任务调度和依赖管理:海豚调度器可以根据用户定义的工作流,自动调度执行各种离线数据处理任务,如数据抽取、转换、加载(ETL)等。它能够管理任务之间的依赖关系,确保任务按照正确的顺序执行,避免数据处理过程中的数据丢失或错误。
  2. 资源管理和优化:海豚调度器能够有效地管理集群资源,根据任务的需求和集群的实际情况,进行任务的调度和分配。通过合理地分配资源,可以最大程度地提高集群的利用率,优化任务的执行效率,缩短数据处理的时间。
  3. 任务监控和告警:海豚调度器提供了任务执行状态的实时监控和管理功能,可以随时查看任务的执行情况和进度。同时,它还支持配置任务执行的告警策略,当任务执行出现异常或超时时,可以及时通知相关人员进行处理,保障数据处理的稳定性和可靠性。
  4. 任务调度策略和灵活性:海豚调度器支持多种任务调度策略,可以根据用户的需求和业务场景,灵活地配置任务的调度方式。例如,可以设置定时调度、依赖触发调度、手动触发调度等不同的调度方式,满足不同类型任务的需求。
  5. 可视化管理界面:海豚调度器提供了直观的可视化管理界面,用户可以通过图形化界面轻松地创建、编辑和管理任务调度工作流,无需编写复杂的代码。这极大地提高了用户的操作效率和易用性。

1)每天集群运行多少指标

每天跑100多个指标,有活动时跑200个左右。

2)任务挂了怎么办?

(1)运行成功或者失败都会发邮件、发钉钉、集成自动打电话。

(2)最主要的解决方案就是,看日志,解决问题。

(3)报警网站睿象云,http://www.onealert.com/

(4)双11和618活动需要24小时值班

3)DS 挂了怎么办?

看日志报错原因:直接重启,资源不够增加资源在重启。

六、JavaSE
1)什么是多线程&多线程的优点

多线程是指程序中包含多个执行流,即一个程序中可以同时运行多个不同的线程来执行不同的任务。

优点:可以提高cpu的利用率。多线程中,一个线程必须等待的时候,cpu可以运行其它的线程而不是等待,这样大大提高了程序的效率。

2)如何创建多线程

Java3种常见创建多线程的方式

(1)继承Thread类,**重写run()**方法

(2)实现Runnable接口,**重写run()**方法

(3)通过创建线程池实现

3)如何创建线程池

Executors提供了线程工厂方法用于创建线程池,返回的线程池都实现了ExecutorServer接口。

newSingleThreadExecutor:创建一个只有一个线程的线程池,用于顺序执行任务。

newFixedThreadExecutor:创建一个固定大小的线程池,其中包含指定数量的线程。

newCachedThreadPool:创建一个可根据需要创建新线程的线程池

newScheduledThreadPool:创建一个可调度的线程池,用于执行定时任务和周期性任务

《阿里巴巴Java开发手册》中强制线程池不允许使用以上方法创建,而是通过ThreadPoolExecutor的方式,这样处理可以更加明确线程池运行规则,规避资源耗尽的风险。

4)ThreadPoolExecutor 构造函数参数解析

(1)corePoolSize:创建线程池的线程数量

(2)maximunPoolSize:线程池的最大线程数

(3)keepAliveTime:当线程数量大于corePoolSize,空闲的线程当空闲时间超过keepAliveTime时被回收

(4)unit{keepAliveTime}:时间单位

(5)workQueue:保留任务的队列

----说明:什么是线程安全?

线程安全是指在多线程环境下,当多个线程同时访问某个共享资源时,能够确保该资源的操作不会导致数据的不一致或损坏,并且能够正确地处理并发访问的情况。

在多线程编程中,由于多个线程可以同时访问共享资源,可能会出现以下问题:

  1. 竞态条件:多个线程同时访问共享资源,导致结果的不确定性或错误的执行顺序。
  2. 数据竞争:多个线程同时读写共享的可变数据,可能会导致数据的不一致性或损坏。
  3. 死锁:多个线程因为互相等待对方释放资源而无法继续执行的状态。
  4. 活锁:多个线程在相互响应对方的操作而无法继续执行的状态。

线程安全的设计和实现能够有效地避免或解决上述问题,确保在多线程环境下程序能够正确、可靠地执行。常见的实现线程安全的方法包括使用同步机制(如锁)、使用线程安全的数据结构、采用无锁编程技术等。

5)列举线程安全的Map集合

SynchronizedMap:适用于单线程或低并发环境下提供线程安全的 Map 实现

ConcurrentHashMap:适用于高并发环境下提供高效的并发访问支持

6)StringBuffer和StringBuilder的区别

(1)StringBuffer中的方法大都采用synchronized关键字修饰,是线程安全的,但效率低。

synchronized关键字修饰提供了对共享资源的排它性访问。当一个线程执行进入了被 synchronized 关键字修饰的代码块或方法时,会尝试获取对象的锁。如果该对象的锁已经被其他线程获取,则当前线程会被阻塞,直到获取到锁才能继续执行。而其他线程在此期间无法获取相同对象的锁,因此也无法同时执行该 synchronized 代码块或方法,从而保证了对共享资源的排它性访问。

(2)StringBuilder 是线程不安全的,效率高。

7)ArrayList和LinkedList的区别

(1)ArrayList 基于动态数据实现,LinkedList基于链表实现,两者都是线程不安全

(2)ArrayList 基于数组,查询快;linkedList 基于链表,新增和删除更快

(3)LinkedList 不支持高效的随机访问

8) HashMap 和 HashTable 的区别

(1)继承的父类不同

HashMap 继承AbstractMap 类

HashTable 继承 Dictionary 类(已经废弃的类),用比较少

(2)是否线程安全

HashMap 是线程不安全的效率高,HashTable是线程安全的,效率低

(3)key和value是否允许null值

Hashtable 中,key 和 value 都不允许出现null值。HashMap中,都可出现null

9)HashMap 的底层原理

(1)HashMap的实现原理(JDK1.7:数组+链表 JDK1.8:数组+红黑树)

HashMap 实际上是一个数组和链表的结合体,HashMap基于Hash算法实现的;

(1)当我们向HashMap中Put元素时,利用key的hashCode重新计算出当前对象的元素在数组中的下标

(2)写入时,如果出现Hash值相同的key,此时分类,如果key相同,则覆盖原始值; 如果key不同,value则放入链表中

(3)读取时,直接找到hash值对应的下标,在进一步判断key是否相同,进而找到对应值

(2)HashMap的扩容

HashMap 中的键值对大于阈值或者初始化时,就调用resize()进行扩容。 每次扩展的时候都是扩展2倍

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值