<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[darkness0604的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/darkness0604</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; darkness0604]]></copyright><item><title><![CDATA[clickhouse小结]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/124468474</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/124468474</guid><author>darkness0604</author><pubDate>Thu, 28 Apr 2022 10:41:25 +0800</pubDate><description><![CDATA[ClickHouse
特征
列式存储

可以读取很快

数据压缩

基于列式存储的特征,数据都是特征相似连续存储的,因此可以使得压缩去重效果较好,从而减少数据传输的IO开销

向量化执行

支持CPU寄存器层面的并行,向量化执行简单理解就是基于CPU指令集的并行执行,实现单条指令来操作多条数据,通过SSE4.2指令集实现向量化执行

多线程与分布式

1、数据表有分区的概念,因此可以基于分区做并行操作
2、纵向扩展：一份数据可以分成不同的分片存储在不同的机器上,可实现数据的分布式存储扩展与并行计算。
3、横]]></description><category></category></item><item><title><![CDATA[Flink源码剖析之JobGraph的生成]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/123690495</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/123690495</guid><author>darkness0604</author><pubDate>Wed, 23 Mar 2022 16:56:15 +0800</pubDate><description><![CDATA[背景
其实，以前编写flink代码的时候，模式比较固定，不管你中间过程如何花里胡哨，开头总要有一个获取上下文环境，最后总要有一个：env.execute()，之前只是知道这个方法，会在job提交的时候，用于获取job的计算流程图，但是我一直很好奇，到底是什么时机生成的呢？
源码剖析
创建JobGraph
我们知道，提交任务的时候，是要有一步获取Job的JobGraph的：
   /**
     * Creates a {@link JobGraph} with a specified {@link Job]]></description><category></category></item><item><title><![CDATA[FlinkSQL平台化之路-StreamX提交源码剖析]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/123690218</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/123690218</guid><author>darkness0604</author><pubDate>Wed, 23 Mar 2022 16:52:03 +0800</pubDate><description><![CDATA[前言背景
在公司里做实时计算开发,之前大部分job都采用的是基于java的streaming编程方式进行的,这样的好处很明显:足够灵活,可以应对各种复杂的实时分析场景,但缺点也很明显:上手存在门槛,需要懂code,如果是一个逻辑简单的计算需求,用code整体编写起来的方式,会让整个流程也略显笨重…
于是我开始想,目前的公司流式开发的流程也趋于稳定了,而对于后续接近来的需求,如果可以用SQL解决,就尽可能用SQL解决,这样无论是从开发成本或者是未来如果版本升级造成的迁移成本都会有一个明显的降低。
而如果单纯通]]></description><category></category></item><item><title><![CDATA[云原生之K8S-01-简介与基本概念]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/123178278</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/123178278</guid><author>darkness0604</author><pubDate>Mon, 28 Feb 2022 11:23:22 +0800</pubDate><description><![CDATA[集群编排的困难

现代服务大多数都不是单点的，更多的是各种微服务，充斥着各种分布式的分布特点，对应docker的容器的话，一个服务实例就是一个容器，但随着节点一直增多，docker对于这些容器的部署难度也变得棘手了起来。
容器编排工具比较


docker-compose是docker官方提供的对docker多容器进行编排管理，但存在局限性，只能对单机内的多容器进行编排。Docker-Compose 是用来管理你的容器的，有点像一个容器的管家，想象一下当你的Docker中有成百上千的容器需要启动，如果一个一]]></description><category></category></item><item><title><![CDATA[算法小记-SegmentTree]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/122712730</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/122712730</guid><author>darkness0604</author><pubDate>Thu, 27 Jan 2022 10:01:02 +0800</pubDate><description><![CDATA[线段树（区间修改树）
内部结构是一个数组。
对外提供三个接口：

add(L,R,V):在LR范围上的位置上的所有的数都加上某个V值
update(L,R,V):在LR范围上的位置上的所有的数都更新成某个V值
getsum(L,R):获取LR范围上的所有的数的累加和
如何比较快的实现上述方法？假设数据规模是N，使其每个方法的操作时间复杂度都达到O（logN）的级别。
暴力常规实现
public static class Right {
   public int[] arr;

   public Righ]]></description><category></category></item><item><title><![CDATA[算法小记-IndexTree]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/122435887</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/122435887</guid><author>darkness0604</author><pubDate>Tue, 11 Jan 2022 16:45:02 +0800</pubDate><description><![CDATA[前言
在对一个数据集进行一些例如区间【L,R】求和的问题的时候，想通过一个比较快的数据结构来完成，可以使用indexTree，它可以达到O（logN）的时间复杂度。
时间复杂度
O（logN）
算法思想
构建一个help数组

作为一个help数组，有如下特点：
1、help数组的有效位置从1位置开始
2、采用“配对”的方式在位置上存放值，因此以图上为例，我们来描述一个这个过程：
1：1位置上只有自己，因此只存放1位置的值
2：之前有一个1位置，所以与2位置配对，组成一对，所以此位置存放1,2位置的值
3:]]></description><category></category></item><item><title><![CDATA[一次TOPN需求带来的历险-与Flink SQL的爱恨情仇]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/121854789</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/121854789</guid><author>darkness0604</author><pubDate>Fri, 10 Dec 2021 15:05:07 +0800</pubDate><description><![CDATA[背景
最近接到一个需求，算是一个比较常见的需求，我们公司的业务会涉及到直播，因此直播自然避免不了高并发的房间内发消息，因此业务端给出的需求就是：实时得为业务端提供近10s内的每个房间的消息总数TOP20， 业务端会根据TOP前几进行相应的限流的一系列操作。
思考
其实接到这个需求，我的思考实现方式是这样的：
1、先求出每个房间的近10s的消息总数
2、将第一步得到的每个房间的近10s的消息总数进行汇总，排序，从而得出最终结果： 近10s内，消息数TOP10的房间是哪些
可以看到上面的每一步，都对应一个时间范]]></description><category></category></item><item><title><![CDATA[基于Prometheus的flink性能监控小坑记录]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/121562991</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/121562991</guid><author>darkness0604</author><pubDate>Fri, 26 Nov 2021 16:33:50 +0800</pubDate><description><![CDATA[背景
公司内的flink集群跑了挺长一段时间了，一直也没有对其进行一个比较完整的监控，最近打算着手做这件事情，经过网上的调研，目前公司采用的部署模式是per-job模式，最终选用了基于prometheus，把job指标推送到中间网关的pushgateway上面，然后prometheus去抓取pushgateway上面的信息，从而实现对flink做性能监控，最后通过Grafana进行展示。
问题
在接入过程中，发现了一个问题： 我感觉prometheus的机制有点蠢！！！
为啥这么说？
pushgateway]]></description><category></category></item><item><title><![CDATA[java中的lambda可以序列化吗？]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/121272011</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/121272011</guid><author>darkness0604</author><pubDate>Thu, 11 Nov 2021 17:25:07 +0800</pubDate><description><![CDATA[java中的lambda可以序列化吗？
这个问题之前一直也没想过，其实主要也是之前从来没有遇到过需要序列化它的情景，直到。。。

我在开发flink作业的时候，因为一些需求，需要传入一个自定义的过滤器，而自然而然就直接使用这种lambda写一通函数式编程又爽又好用，但启动后确是：

直接一手序列化报错给我整懵逼了， 恩？ 原来lambda是不能序列化的吗，一般来说，一个普通的实体类，只需要给类实现一个Serializable的接口标明，就可以参与序列化了，但这种lambda怎么给接口呀？
但是我脑海中突然闪]]></description><category></category></item><item><title><![CDATA[设计模式之代理模式静态代理，动态代理以及源码分析，CGLIB]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/120967714</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/120967714</guid><author>darkness0604</author><pubDate>Tue, 26 Oct 2021 10:55:46 +0800</pubDate><description><![CDATA[最近在系统的啃一啃设计模式相关的东西， 其中对代理模式尤为感兴趣（主要也觉得它很神奇），而且代理模式的用途实在是太广泛了
说代理之前，从一个需求入手：
有一个tank类，作为一个坦克，肯定可以移动，也就是肯定会有一个移动的方法，我想记录一下它的move方法的执行时间，该怎么做？
interface Movable {
    void move();
}

public class Tank implements Movable {

    /**
     * 模拟坦克移动了一段儿时间
     */
]]></description><category></category></item><item><title><![CDATA[KAFKA那些事-07-从KAFKA总结分布式下的发送和连接]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/120967214</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/120967214</guid><author>darkness0604</author><pubDate>Tue, 26 Oct 2021 10:32:51 +0800</pubDate><description><![CDATA[分布式模型下的客户端应用运行的关键？
分布式下，通常有多个角色进行互相协调。因此作为一个分布式角色来说，首先要解决的就是如何和其他分布式角色进行通信。
对于客户端而言，首先需要明确集群的信息，以及如何进行连接，因此也涉及到具体使用到的IO模型是什么？
如下是kafka producer发送一条消息需要进行的操作：
1、拉取集群元数据
2、底层利用NIO建立sokcet连接进行向指定节点进行发送信息。

分布式模型下的服务端应用运行的关键？
作为服务端来说，更关心的是如何更好的接收和管理众多的连接，以及对连接]]></description><category></category></item><item><title><![CDATA[工作杂记-关于IOS通过Safari使用https域名访问的坑]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/120283343</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/120283343</guid><author>darkness0604</author><pubDate>Tue, 14 Sep 2021 11:14:09 +0800</pubDate><description><![CDATA[1、背景
为了测试环境与线上环境前端代码的接口访问地址编写统一，我们公司不直接使用ip进行访问，而是统一使用域名进行访问， 在本地开发测试时，通过内网DNS服务器解析到测试环境，当线上环境时，则解析到公网环境。
其他端都没有什么问题，但维度使用iphone通过safari访问时，然后Safari上就一直无法访问网站，Chrome没问题。
Safari上报错内容就是：…连接服务器中断…
2、查找过程
首先根据Safari报错内容找，什么都找不到
然后看Nginx的报错日志error.log，发现报
worke]]></description><category></category></item><item><title><![CDATA[KAFKA那些事-06-KAFKA Producer基于源码分析的参数配置调优]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/119775018</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/119775018</guid><author>darkness0604</author><pubDate>Wed, 18 Aug 2021 10:46:38 +0800</pubDate><description><![CDATA[Producer配置分析
Properties conf = new Properties();

//设置ACK级别： 0,1，-1
conf.setProperty(ProducerConfig.ACKS_CONFIG,"0");

//Key序列化器
conf.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

//Value序列化器
conf.setProperty(P]]></description><category></category></item><item><title><![CDATA[KAFKA那些事-05-KAFKA的索引文件分析、ACK不同级别的现象、基于时间戳的索引]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/118966895</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/118966895</guid><author>darkness0604</author><pubDate>Wed, 21 Jul 2021 15:11:04 +0800</pubDate><description><![CDATA[KAFKA中的索引与数据文件的分析
创建topic

来到KAFKA存储目录，发现已经有了两个分区的数据：

进到0号分区的文件夹：

发现有.log结尾的数据文件，.index结尾的偏移量索引文件，.timeindex结尾的时间戳二级索引文件
但我们发现，我们现在还没有写入消息，但两个索引文件就已经有了10M的大小，这是为何？
这是因为kafka对索引文件使用的是mmap映射，已经预分配好了10M的磁盘块大小的空间，通过lsof查看kafka进程号观察这个细节：

可以看到SIZE/OFF的位置上，确实已]]></description><category></category></item><item><title><![CDATA[KAFKA那些事-04-KAFKA的元数据细节、消息存放机制、零拷贝发送、分布式集群副本同步]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/117919274</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/117919274</guid><author>darkness0604</author><pubDate>Tue, 15 Jun 2021 10:19:21 +0800</pubDate><description><![CDATA[KAFKA的元数据与zookeeper

kafka的元数据是交给zookeeper来管理的。
假设我们有topic ：ooxx， 副本数为2，主副本在id为3的broker上，另一个副本在id为1的上面。 此时，只有主副本有读写能力，从副本只能备着。
前面我们说过，kafka集群会选出一个broker作为controller，这个选举是借助zookeeper来完成的，zookeeper本质是通过让它们抢占一个临时节点，谁抢到谁就是controller。
如图下：

通过zookeeper的kafka路径中]]></description><category></category></item><item><title><![CDATA[KAFKA那些事-03-JAVA API实操（生产者、消费者属性配置，偏移量提交方式）]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/117919158</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/117919158</guid><author>darkness0604</author><pubDate>Tue, 15 Jun 2021 10:11:50 +0800</pubDate><description><![CDATA[Producer
producer是面向broker的，然后向指定的toopic进行发送数据，相同key去到同一分区。
初始化配置
String topic = "msb-items";
Properties p = new Properties();
p.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "node02:9092,node03:9092,node01:9092");
//kafka  持久化数据的MQ  数据-&gt; byte[]，]]></description><category></category></item><item><title><![CDATA[KAFKA那些事-02-KAFKA搭建、消息拉取和offset更新策略]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/117437920</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/117437920</guid><author>darkness0604</author><pubDate>Tue, 01 Jun 2021 10:53:02 +0800</pubDate><description><![CDATA[1、准备zookeeper环境
2、搭建KAFKA环境
编辑server.properties，注意填写zk地址的时候，比较好的做法是在zookeeper地址后加上一个路径：
zookeeper.connect=node02:2181, node02:2181, node03:2181/kafka

以及要保证每个broker.id保证不同。
3、启动kafka
/opt/bigdata/kafka_2.11-2.2.0/bin//kafka-server-start.sh   -daemon 
/opt/]]></description><category></category></item><item><title><![CDATA[KAFKA那些事-01-概述]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/117437613</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/117437613</guid><author>darkness0604</author><pubDate>Tue, 01 Jun 2021 10:44:47 +0800</pubDate><description><![CDATA[消息队列的缘由
kafka是一种消息队列。
在说kafka之前，我们先来聊一下消息队列的出现缘由。

两个服务之间想要进行数据通信，如果直接点对点传输，会在数据的可靠性、一致性等方面让人头疼，因此为了解耦，人们的常用做法是在中间加一层东西进行服务之间解耦，而这个东西，就是消息队列。
分布式消息队列与KAFKA的诞生
但作为一个单机版的消息队列应用，势必存在单点问题和性能问题，因此必然需要发展成为一个分布式应用。
按照分布式的老三样AKF原则，在X轴（可靠性横向副本扩展），Y轴（业务切分），Z轴（数据分区）上]]></description><category></category></item><item><title><![CDATA[IO那些事15-RPC调用的组合方式]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/115957959</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/115957959</guid><author>darkness0604</author><pubDate>Wed, 21 Apr 2021 15:38:42 +0800</pubDate><description><![CDATA[RPC
RPC，远程服务调用，只是一种调用行为的名称，而进行连接的双方使用的协议是不受限定的，可以是自定义的某种协议（自定义消息头和消息体，自行对传输消息的格式进行约定），也可以是比较公知的例如http协议（但其本质，应该说HTTP协议也是一种比较公认的自定义协议），但这无非就是调用协议层面的事情，整体来说，都是一种RPC的表现，所谓的通信有无状态，完全是看协议的实现是如何约定的。
HTTP协议

消费端，可以使用第三方HTTP类库，也可以使用netty支持的http协议客户端形式进行调用。
服务端，既可以]]></description><category></category></item><item><title><![CDATA[IO那些事14-RPC优化点]]></title><link>https://blog.youkuaiyun.com/darkness0604/article/details/115957686</link><guid>https://blog.youkuaiyun.com/darkness0604/article/details/115957686</guid><author>darkness0604</author><pubDate>Wed, 21 Apr 2021 15:36:32 +0800</pubDate><description><![CDATA[RPC的层次感

作为RPC调用来说，更多的还需要考虑用户体验度，对于用户来说，就是面向接口调用。
然而实际上一个RPC的端点，可能既需要作为consumer去调用远程的provider的服务，而自身也作为一个provider提供着一些服务，作为这个端点来说，它对外提供的服务，对它自身肯定是一些本地的方法调用。
所以我们在设计RPC通信时，调用的时候，不单单需要考虑只有远程调用，而应该首先去判断一下这个服务的实现方法在本地有没有，如果有的话，没必要再走RPC最终再调到自己身上来。
 public stati]]></description><category></category></item></channel></rss>