自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 Maven查看和解决jar包冲突

java

2023-02-16 11:27:29 214

原创 dmp广告系统

dmp广告系统

2022-08-26 14:04:54 1303

原创 Flink故障排查

参考https://www.cnblogs.com/wuchanming/p/7766994.htmlhttps://blog.csdn.net/m0_46449152/article/details/1119364851.查看 Task Heap 是否经常达到 100%2.查看 老年代 Full GC 发生次数解决方法可以使用 G1 垃圾回收器 -yD env.java.opts="-XX:+UseG1GC"问题排查找到 container所在的服务器ps -ef | gre

2022-03-02 15:05:20 1898

原创 FlinkKafkaConsumer源码分析

参考:https://www.jianshu.com/p/f6f135855e42https://www.jianshu.com/p/40c592186502FlinkKafkaConsumer<T> extends FlinkKafkaConsumerBase<T> 1、initializeState 初始化unionOffsetStates 存放offset 数据结构为ListState<Tuple2<KafkaTopicPartition,

2022-01-31 17:08:23 1392

原创 Flink yarn-session模式下延长taskmanager驻留时间

resourcemanager.taskmanager-timeout 默认30000毫秒 taskmanager无任务运行就会被回收,下次提交任务时又会重新向yarn申请container启动taskmanager 耗时很大resourcemanager.taskmanager-timeout 增加为86400000 保留一天SlotManagerConfiguration.fromConfiguration(){ final Time taskManagerTimeout =

2021-12-21 16:36:00 1408

原创 FlinkKafkaConsumer源码分析

https://www.jianshu.com/p/f6f135855e42https://www.cnblogs.com/dongxiao-yang/p/7700600.html补充consumerThread.setOffsetsToCommit(offsetsToCommit, commitCallback);-> consumerThread.run() -> consumer.commitAsync

2021-10-29 15:41:12 239

原创 flink standalone 客户端提交源码分析

启动入口CliFrontend.main -> cli.parseParameters -> ACTION_RUN run(params); -> executeProgram -> invokeInteractiveModeForExecution -> callMainMethod(){ mainMethod = entryClass.getMethod("main", String[].class); mainMethod.invoke(null, (

2021-10-16 18:54:20 357 1

原创 hive SQL实现占比、同比、环比计算(lag函数,lead函数)

https://blog.csdn.net/qq_36039236/article/details/108279397

2021-05-14 10:42:44 603

原创 Flink Checkpoint

在 ExecutionGraphBuilder 构建 ExecutionGraph 的时候,会生成CheckpointCoordinatorConfiguration 对象,来保存成 JobGraph 中的 snapshotSettings 参数,最终该交给ExecutionGraphBuilder.enableCheckpointing();1、解析 ExecutionGraph 中的各种 ExecutionVertex,设置到 tasksToTrigger,tasksToWaitFor,task

2021-04-18 22:47:40 367

原创 StreamTask 执行

TaskExecutor.submitTask Task task = new Task( // TODO taskExecutorServices.createShuffleEnvironment taskExecutorServices.getShuffleEnvironment()创建ShuffleEnvironment T TaskExecutorServices.createShuffleEnvironment -> createShuffleEnvironment

2021-04-17 23:29:42 318

原创 sleep和wait区别

https://blog.csdn.net/u012050154/article/details/50903326

2021-03-23 11:36:39 79

原创 kafka 消费者-comsumer

public class Consumer extends ShutdownableThread { private final KafkaConsumer<Integer, String> consumer; private final String topic; public Consumer(String topic) { super("KafkaConsumerExample", false); Properties props

2021-03-22 23:03:59 475

原创 kafka 集群管理-创建一个topic流程

TopicCommand.createTopic def createTopic(zkUtils: ZkUtils, opts: TopicCommandOptions) { .... try { if (opts.options.has(opts.replicaAssignmentOpt)) { //获取到的分配的方案 /** * topic: * p0: * p0

2021-03-22 22:32:18 566

原创 kafka 集群管理-如何感知新注册进来的broker

KafkaController.onControllerFailover//通过这儿注册了一个监听器,感知到集群里面有新的broker进来了。replicaStateMachine.registerListeners() -> registerBrokerChangeListener // 对/brokers/ids 目录设置了监听器 zkUtils.zkClient.subscribeChildChanges(ZkUtils.BrokerIdsPath, brokerChan

2021-03-22 22:09:51 313

原创 kafka 集群管理-broker注册

KafkaServer.startup()kafkaHealthcheck.startup() -> register() //往zk的某个目录里面写入进去一个注册信息(最重要的注册信息,就是自己的brokerid) zkUtils.registerBrokerInZk(brokerId, plaintextEndpoint.host, plaintextEndpoint.port, updatedEndpoints, jmxPort, rack, interBroke

2021-03-22 21:47:49 416

原创 kafka 集群管理-controller是如何选举的

KafkaServer.startup()kafkaController.startup()controllerElector.startup -> elect def elect: Boolean = { val timestamp = SystemTime.milliseconds.toString //构建一个数据信息 //比如有version //有自己broker id号 //有时间戳 val electString = Json.en

2021-03-22 21:26:59 222

原创 kafka 副本同步-如果follower fetch不到数据怎么办

1、follower发送fetch请求到leader,leader无数据更新时,加入时间轮(100ms)延迟调度 给follower发送空响应 (节约网络资源)2、leader有数据更新时,会唤醒 时间轮马上执行给follower发送空响应follower接收到空响应后会继续向leader 发送fetch请求KafkaApi.handle case ApiKeys.FETCH => handleFetchRequest(request)replicaManager.fetchMessages

2021-03-22 21:02:35 415

原创 kafka 副本同步-ISR定时检查线程

KafkaServer.startup -> replicaManager.startup()定时调度的线程 scheduler.schedule("isr-expiration", maybeShrinkIsr, period = config.replicaLagTimeMaxMs, unit = TimeUnit.MILLISECONDS) -> partition.maybeShrinkIsr private def tryCompleteDelayedReques

2021-03-22 20:38:54 425 1

原创 kafka 副本同步-leader和follower的leo,hw更新流程

1、流程图2、源码详解Leader端:KafkaApi.handleProducerRequest replicaManager.appendMessages-> appendToLocalLog // 把数据写到leader partition里面-> partition.appendMessagesToLeader-> log.append -> segment.append(把数据写入到segment里面去) 2. 更新自己的LEO -> up

2021-03-21 23:58:29 498

原创 kafka 副本同步-Leader处理fetch请求

KafkaApi.handleFetchRequest//拉取数据 replicaManager.fetchMessages // 从本地的磁盘里面去读取日志信息 val logReadResults = readFromLocalLog def readFromLocalLog(fetchOnlyFromLeader: Boolean, readOnlyCommitted: Boolean,

2021-03-21 21:34:52 422

原创 kafka 副本同步-ReplicaFetcher

KafkaServer.startupreplicaManager = new ReplicaManager//follower partition是如何拉取leader partition的数据的? val replicaFetcherManager = new ReplicaFetcherManager ... replicaFetcherManager.addFetcherForPartitions def addFetcherForPartitions(partitionAndO

2021-03-21 16:41:58 398

原创 kafka 存储-Log append

步骤一:校验数据 (Producer -》 Kafka)步骤二: 分配offset步骤三:获取合法的数据步骤四:获取一个可用的segment步骤五:把数据写入到segment里面去步骤六:更新LEO步骤七:根据条件判断,然后把内存里面的数据写到磁盘Partition.appendMessagesToLeader log.append() def append(messages: ByteBufferMessageSet, assignOffsets: Boolean = true): Lo

2021-03-21 14:59:56 531

原创 kafka 存储-LogManager

KafkaServer.startup() //TODO 初始化logManager logManager = createLogManager(zkUtils.zkClient, brokerState) //TODO 启动logManager logManager.startup()-> createLogManager -> new LogManager(){createAndValidateLogDirs(logDir

2021-03-21 13:16:33 144

原创 kafka 存储-replicamanager写数据

入口:处理生产者写入数据请求 KafkaApi.handleProducerRequest -> replicaManager.appendMessages() def appendMessages(timeout: Long, requiredAcks: Short, internalTopicsAllowed: Boolean, messagesPerPartiti

2021-03-21 12:48:16 144

原创 kafka 存储原理

2021-03-21 11:20:17 114

原创 kafka 服务端-网络-服务端处理Request和发送响应给客户端

接上篇处理请求KafkaServer.startuprequestHandlerPool = new KafkaRequestHandlerPool(config.brokerId, socketServer.requestChannel, apis, config.numIoThreads) //默认启动8个线程,一般情况下,生产环境里面我们是要去设置这个参数。 for(i <- 0 until numThreads) { //创建线程 runnables(i) = n

2021-03-21 10:24:53 373

原创 kafka 服务端-网络-processor如何接收和处理请求

Processor.run() override def run() { startupComplete() while (isRunning) { try { // setup any new connections that have been queued up //读取每个SocketChannel,把每个SocketChannel //都往Selector上面注册OP_READ事件。 configure

2021-03-21 00:47:36 502

原创 kafka 服务端-网络-processor 线程如何启动

创建SocketServer.startup(){ //创建了三个Processor的线程 for (i <- processorBeginIndex until processorEndIndex) //TODO -> 说明这个里面会创建3个线程 //默认是3个线程,但是我们一般 搭建kafka集群的时候会去配置这个参数num.network.threads processors(i) = newPr

2021-03-20 22:20:48 348

原创 kafka 服务端 Accept线程如何启动

Core Kafkamain kafkaServerStartable.startup -> server.startup(){ // -> NIO的服务端 socketServer = new SocketServer(config, metrics, kafkaMetricsTime) // TODO socketServer.startup()} def startup() { this.synchroniz

2021-03-20 21:48:15 174

原创 kafka producer 异常处理

1 重试Sender.completeBatchif (error != Errors.NONE && canRetry(batch, error)) { // retry log.warn("Got error produce response with correlation id {} on topic-partition {}, retrying ({} attempts left). Error: {}",

2021-03-20 21:07:25 1458

原创 如何处理响应

Selector.pollSelectionKeysif (channel.ready() && key.isReadable() && !hasStagedReceive(channel)) { NetworkReceive networkReceive; //接受服务端发送回来的响应(请求) //networkReceive 代表的就是一个服务端发送

2021-03-20 20:29:12 291

原创 kafka Sender 发送网络请求

建立好连接 是的逻辑注册OPWRITESender.run -> /** * 步骤七: * 创建发送消息的请求 * * 创建请求 * 我们往partition上面去发送消息的时候,有一些partition他们在同一台服务器上面 * ,如果我们一分区一个分区的发送我们网络请求,那网络请求就会有一些频繁 * 我们要知道,我们集群里面网络资源是非常珍贵的。

2021-03-20 09:54:16 143

原创 kafka sender的NetWorkClient与broker建立连接

初始化Sender.run -> NetWorkClient.ready -> initiateConnect-> selector.connect public void connect(String id, InetSocketAddress address, int sendBufferSize, int receiveBufferSize) throws IOException { if (this.channels.containsKey(id)).

2021-03-20 09:20:39 268

原创 kafka 深入浅出

kafka 零拷贝consumer group coondinator机制coondinator如何选择的? broker里面的其中一台服务器。consumer group:group. id: my_conumser -> my consumer hash -> 求出来就是—个数字数字/50 =>获取到 0-49的这样的一个数。比如数就是8,然后就在找到 __consumer_offets的partition 8 的leader partition在哪台服务器上面。那台就

2021-03-19 10:48:52 290

原创 kafka 网络设计

Sender.run -> client.ready -> initiateConnect -> selector.connect/* TODO 这个selector是kafka主机封装的一个selector * 他是基于java NIO里面的selector去封装的。 */public class Selector implements Selectable { public static final long NO_IDLE_TIMEOUT_MS = -1; .

2021-03-18 19:42:18 208

原创 producer sender 检查与要发送数据的主机的网络是否已经建立好

if (!this.client.ready(node, now)) {-> NetworkClient.ready public boolean ready(Node node, long now) { //如果当前检查的节点为null,就报异常。 if (node.isEmpty()) throw new IllegalArgumentException("Cannot connect to empty node " + node.

2021-03-17 00:07:51 114

原创 Sender发送条件

发送条件:1)full: 如果一个批次写满了(无论时间有没有到)2)expired:时间到了(批次没写满也得发送)3)exhausted:内存不够(消息发送出去以后,就会释放内存)4)closed : kafka producer 关闭前先将缓存的数据发送this.accumulator.ready public ReadyCheckResult ready(Cluster cluster, long nowMs) { Set<Node> readyNode

2021-03-16 23:47:06 171

原创 kafka sender

步骤一: 获取元数据步骤二: 判断哪些partition有消息可以发送步骤三:标识还没有拉取到元数据的topic步骤四:检查与要发送数据的主机的网络是否已经建立好。步骤五:按照broker进行分组,同一个broker的partition为同一组,一个批次就一个请求 -> broker,减少网络传输到次数Map<Integer, List> batches步骤六:对超时的批次是如何处理的?步骤七:创建发送消息的请求步骤八: 真正执行网络操作的都是这个NetWorkClien

2021-03-16 23:25:23 158

原创 kafka producer BufferPool

allocate如果我们这次申请的批次的大小等于 我们设定好的一个批次的大小,并且我们的内存池不为空,那么直接从内存池里面获取一个块内存就可以使用了。还有一种情况就是,我们整个内存池 还剩10k的内存,但是我们这次申请的内存是32k,批次可能就是16k,但是我们的一条消息,就是32K -> max(16,32) = 当前批次 = 32K可能一下子分配不了这么大的内存,但是可以先有点分配一点。如果分配的内存的大小 还是没有要申请的内存大小大。内存池就会一直分配的内存,一点一点的去分配。等着别.

2021-03-16 22:35:34 208

原创 RecordAccumulator (一) getOrCreateDeque

private Deque<RecordBatch> getOrCreateDeque(TopicPartition tp) { /** * CopyonWriteMap: * get * put * */ //直接从batches里面获取当前分区对应的存储队列 Deque<RecordBatch> d = this....

2021-03-16 21:11:57 130

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除