<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[magicpenta的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/magicpenta</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; magicpenta]]></copyright><item><title><![CDATA[Flink Watermark]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/119892511</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/119892511</guid><author>magicpenta</author><pubDate>Tue, 24 Aug 2021 16:17:50 +0800</pubDate><description><![CDATA[Watermark 是什么
在基于 event time 的实时计算中，我们常常会碰到 乱序数据 的场景。
在理想情况下，我们以为我们的数据流会是这样的：

但实际上受网络波动等影响，大多数情况下是这样的：

在这种乱序的场景下，数据丢失是必然的。假设我们有一个大小为 [0, 5) 的窗口（单位为秒），当上述 event time 为 5 的元素输入时，该窗口会触发计算并关闭，导致后续流入的元素（2、3、4）找不到对应窗口而丢失。
为了解决这种乱序数据带来的数据丢失问题，Flink 提供了 Watermar]]></description><category></category></item><item><title><![CDATA[Flink Window]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/119892317</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/119892317</guid><author>magicpenta</author><pubDate>Tue, 24 Aug 2021 16:07:03 +0800</pubDate><description><![CDATA[众所周知，Flink 是流处理计算框架，专为流式数据而生。
流式数据有一个特点，即无界性。在很多场景中，这种无界性会使很多计算指标失去了意义，如结果统计、大小排序等。Window（窗口）的出现，正是为了解决无界性的问题。它可以将无界数据按照某种规则划分成有界数据，并在之上完成业务计算。
本文将重点介绍 Flink 的 Window API，以帮助读者了解 Flink Window 的概念及使用方式。

???? 在 Flink 1.13 版本中，常用的 Window 基本都是基于时间的 TimeWindow]]></description><category></category></item><item><title><![CDATA[Flink DataStream API]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/119564409</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/119564409</guid><author>magicpenta</author><pubDate>Tue, 10 Aug 2021 10:49:32 +0800</pubDate><description><![CDATA[Flink 根据抽象程度分层，提供了三种不同的 API。每一种 API 在简洁性和表达力上有着不同的侧重，并且针对不同的应用场景。

DataStream API 是 Flink 中用于编写流处理作业的 API，为许多通用的流处理操作提供了处理原语。它支持 Java 和 Scala 语言，预先定义了例如 map()、reduce()、aggregate() 等函数。
​
在 DataStream API 中，Flink 应用程序同样包含以下步骤：

获取 execution environment
定义数据]]></description><category></category></item><item><title><![CDATA[Java 多模块持续集成（Maven 示例）]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/119246105</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/119246105</guid><author>magicpenta</author><pubDate>Fri, 30 Jul 2021 14:10:30 +0800</pubDate><description><![CDATA[一、为什么要用 Jenkins？
目前，我们在持续集成上使用的是 GitLab 自带的 gitlab-ci。它支持自动化完成代码编译、镜像构建与镜像推送，减少开发人员在项目构建上的时间开销。
但是，gitlab-ci 有一个明显的缺陷：在遇到多模块项目时（如基于 SpringBoot 搭建的微服务项目），它显得有些无力。具体表现为，gitlab-ci 不支持多管道，每当项目中某个模块的代码有新的提交，gitlab-ci 都会触发全项目的自动构建，而无法仅针对产生变动的子模块进行构建。当项目规模较大时，这种构]]></description><category></category></item><item><title><![CDATA[Flink 快速入门]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/118725690</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/118725690</guid><author>magicpenta</author><pubDate>Wed, 14 Jul 2021 13:50:24 +0800</pubDate><description><![CDATA[什么是 Flink
Apache Flink 是一个分布式计算框架，它能够对有界和无界的数据流进行高效的处理。

有界数据：即批数据（离线数据），具有已定义的起止位置，属于静态数据集
无界数据：即流式数据（实时数据），无已定义的结束位置，属于动态数据集


Flink 特点
在官方的介绍中，Flink 具有以下优势：

Deploy Applications Anywhere：Flink 集成了所有常见的集群资源管理器，例如 Hadoop YARN、Apache Mesos 和 Kubernetes，也可以]]></description><category></category></item><item><title><![CDATA[使用 log4j 输出日志到 Kafka]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/115869956</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/115869956</guid><author>magicpenta</author><pubDate>Mon, 19 Apr 2021 17:34:39 +0800</pubDate><description><![CDATA[一、背景介绍
使用 log4j 自带的 appender，我们可以将日志打印到控制台，也可以将日志打印到本地文件。更深入使用的话，我们可以将日志进行隔离，根据日志级别输出到不同的文件，或者，我们还可以根据日期对日志进行滚动存储。
这些原生功能看起来都很不错，但总感觉缺了点什么。
假设我们部署了具有 10 个节点的集群，使用 log4j 记录日志到节点的本地文件。某一天，运维反馈集群有异常，需要找出故障点。此时，我们只能对 10 个节点的日志文件进行逐一排查，找出其中的 ERROR 日志。这看起来十分僵硬。若]]></description><category></category></item><item><title><![CDATA[Zstd 压缩性能分析]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/107689459</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/107689459</guid><author>magicpenta</author><pubDate>Thu, 30 Jul 2020 14:29:14 +0800</pubDate><description><![CDATA[About Zstd
Zstd，全称 Zstandard，是 Facebook 于 2016 年开源的新无损压缩算法。与 zlib、lz4、xz 等当前流行的压缩算法不同，Zstd 寻求一种压缩性能与压缩率通吃的方案，而实际上它也确实做到了。在由官方所列出的表格中，可以看到，Zstd 不仅具备优秀的压缩性能，在压缩率上也有非常亮眼的表现。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RXOO1Z8l-1596090419061)(https://engineering.fb]]></description><category></category></item><item><title><![CDATA[基于 GitLab+SonarQube 搭建自动化代码检测平台]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/106880267</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/106880267</guid><author>magicpenta</author><pubDate>Sun, 21 Jun 2020 00:19:17 +0800</pubDate><description><![CDATA[一、背景介绍
目前，成熟的代码检测工具有很多，如 SpotBugs（前身为 FindBugs）、PMD、Checkstyle 等，我们可以在本地开发环境，非常便捷地利用这些工具实现代码的扫描与检测。这看上去好像很不错，但实际上，采用这种代码检测方式，我们面临着两个问题：


代码提交前需要手动运行检测工具


检测结果仅对自己可见


那么，有没有什么方案可以规避这些问题呢？答案当然是有的。
我们可以基于 GitLab 和 SonarQube 搭建自动化代码检测平台，并通过该平台实现以下功能：


每次提交]]></description><category></category></item><item><title><![CDATA[基于 Docker 部署 Flume 应用]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/106817731</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/106817731</guid><author>magicpenta</author><pubDate>Wed, 17 Jun 2020 20:35:41 +0800</pubDate><description><![CDATA[前言
本文目的在于通过 flume、zookeeper、kafka、docker 搭建基本的日志采集系统，实现日志的采集并将数据发送至 Kafka。
搭建前，需确保已安装以下组件：

JDK 8
Flume
Zookeeper
Kafka
Docker

同时需确保已掌握以下技能：

能在本地部署并成功启动 Flume，且了解 Flume 的核心概念 source、channel、sink
能基本使用 Zookeeper，了解节点的创建、更新、查看与删除
能基本使用 Kafka，了解 topic 的概念，实]]></description><category></category></item><item><title><![CDATA[记一次ActiveMQ的异常排查]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/103957735</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/103957735</guid><author>magicpenta</author><pubDate>Mon, 13 Jan 2020 16:06:11 +0800</pubDate><description><![CDATA[一、异常背景
做一个小项目时，选择使用 ActiveMQ 作为中间件，负责项目内各组件的通信。
刚部署时，整个项目运行正常。运行 N 天后，发现 ActiveMQ 出乎意料地自动重启，进而导致队列中未来得及消费的数据丢失。
刚开始，以为是配置文件 activemq.xml 的问题，但是仔细核查后，发现没有什么明显的错误配置。然后，怀疑是否是 ActiveMQ 版本的问题，因此另选了一台测试机器进行...]]></description><category></category></item><item><title><![CDATA[SpringBoot 多线程池实现方案]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/97398839</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/97398839</guid><author>magicpenta</author><pubDate>Fri, 26 Jul 2019 17:52:13 +0800</pubDate><description><![CDATA[文章目录一、需求场景二、需要的核心注解三、自定义线程池配置3.1 所需依赖3.2 定义基类 AsyncConstants3.3 定义各线程池配置类PrimaryAsyncConstantsSecondaryAsyncConstants3.4 定义配置文件四、多线程池实现4.1 生成 Executor 对象4.2 声明异步方法4.3 调用示例
一、需求场景
通常情况，在小项目中，业务单一，单个线程池...]]></description><category></category></item><item><title><![CDATA[SpringBoot 实现 MongoDB 多数据源配置]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/96445374</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/96445374</guid><author>magicpenta</author><pubDate>Thu, 18 Jul 2019 19:07:32 +0800</pubDate><description><![CDATA[文章目录一、需求背景二、实现步骤1. 添加依赖2. 修改配置文件3. 重建数据源配置类AbstractMongoConfigurePrimaryMongoConfigureSecondaryMongoConfigure4. 创建实体类与接口UserUserRepository5. 调用示例

一、需求背景
MongoDB 是一个基于分布式存储的数据库，具备开源、高性能等特点，是当前 NoSQL 数...]]></description><category></category></item><item><title><![CDATA[Cloudera 离线安装指南]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/95613146</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/95613146</guid><author>magicpenta</author><pubDate>Fri, 12 Jul 2019 13:52:38 +0800</pubDate><description><![CDATA[一、版本号

system：CentOS 6
Cloudera Manager：5.7.0
CDH：5.7.0

二、环境准备

MySQL 5.6
Java 8
python 2.6

三、安装步骤
1. 进行集群角色划分，指定 server 与 agent
在 Cloudera Manager 中，包含两种角色，server 与 agent，两者间关系如下：

server 负责管理集群内主机...]]></description><category></category></item><item><title><![CDATA[Clickhouse 入门教程（二）—— Java 连接示例]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/89515550</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/89515550</guid><author>magicpenta</author><pubDate>Thu, 25 Apr 2019 14:30:57 +0800</pubDate><description><![CDATA[文章目录一、JDBC 驱动二、代码示例2.1 create table2.2 batch insert2.3 select query2.4 drop table三、解决 Connection refuse 的问题
一、JDBC 驱动
clickhouse 有两种 JDBC 驱动实现。
官方驱动：
&lt;dependency&gt;
    &lt;groupId&gt;ru.yandex.cl...]]></description><category></category></item><item><title><![CDATA[Clickhouse 入门教程（一）—— 安装与启动]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/89193722</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/89193722</guid><author>magicpenta</author><pubDate>Wed, 10 Apr 2019 20:29:25 +0800</pubDate><description><![CDATA[文章目录一、Clickhouse 简介二、Clickhouse 安装2.1 系统要求2.2 安装方式2.2.1 rpm 包下载2.2.2 rpm 包安装三、Clickhouse 启动与验证
一、Clickhouse 简介
Clickhouse 是一个开源的面向联机分析处理（OLAP, On-Line Analytical Processing）的列式存储数据库管理系统。
Clickhouse 的优...]]></description><category></category></item><item><title><![CDATA[显式关闭线程池的正确姿势]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/87185599</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/87185599</guid><author>magicpenta</author><pubDate>Wed, 13 Feb 2019 15:42:39 +0800</pubDate><description><![CDATA[一、shutdown
提到 Java 线程池的关闭，绝大多数人第一时间想到的是 ExecutorService 的 shutdown 方法。
关于 shutdown 方法，注释上是这么说明的。
/**
 * Initiates an orderly shutdown in which previously submitted
 * tasks are executed, but no new ta...]]></description><category></category></item><item><title><![CDATA[Java 移位运算符]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/86627028</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/86627028</guid><author>magicpenta</author><pubDate>Thu, 24 Jan 2019 15:01:11 +0800</pubDate><description><![CDATA[Java 中有三种移位运算符，分别是：

&amp;lt;&amp;lt;：左移运算符
&amp;gt;&amp;gt;：带符号右移
&amp;gt;&amp;gt;&amp;gt;：无符号右移

那么这个移位运算符该怎么理解呢？顾名思义，移位移位，就是移动位置。那么问题来了，既然是移动位置，那么移位运算符移动的是谁的位置，怎么移？我们写个程序测试一下。
public class Main {

    public static void main(...]]></description><category></category></item><item><title><![CDATA[MySQL 数据文件迁移至新硬盘]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/86543543</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/86543543</guid><author>magicpenta</author><pubDate>Fri, 18 Jan 2019 17:18:44 +0800</pubDate><description><![CDATA[文章目录一、SSD 初始化1.1 查看 SSD 信息1.2 分区1.3 格式化1.4 挂载与自动挂载二、迁移MySQL数据文件2.1 停止服务2.2 迁移数据文件目录2.3 修改目录权限2.4 新建软链接2.5 重启服务
最近项目遇到 MySQL 的效率瓶颈，尝试从配置及代码层面进行优化，但是并没有取得比较显著的效果，于是打算将MySQL迁移至固态硬盘，以解决效率瓶颈问题。
在迁移前，有两个要求：...]]></description><category></category></item><item><title><![CDATA[Solr入门学习（三）—— 认识 schema]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/83278468</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/83278468</guid><author>magicpenta</author><pubDate>Mon, 22 Oct 2018 20:34:28 +0800</pubDate><description><![CDATA[Server : Ubuntu 16.04
Java Version : 1.8
Solr Version : 7.4.0

前言
在 《Solr入门学习（一） —— Solr 的安装、启动与关闭》 一文中，有提到每个集合都需要指定一个 configSet，且这个 configSet 至少要包含两个主要的配置文件： schema 文件和 solrconfig.xml 文件。其中的 schema 文...]]></description><category></category></item><item><title><![CDATA[Solr入门学习（二）—— Solr 的基本查询]]></title><link>https://blog.youkuaiyun.com/magicpenta/article/details/82354106</link><guid>https://blog.youkuaiyun.com/magicpenta/article/details/82354106</guid><author>magicpenta</author><pubDate>Mon, 03 Sep 2018 20:13:53 +0800</pubDate><description><![CDATA[Server : Ubuntu 16.04
Java Version : 1.8
Solr Version : 7.4.0



数据准备

Solr 刚刚安装后，是没有任何数据的，所以此时我们无法进行任何查询。幸运的是，官方为用户提供了存储工具以及样本数据，方便新手在 Solr 中快速添加数据。

首先，我们先看一下存储工具和样本数据分别位于哪个位置。


存储工具：/{solr_home}/b...]]></description><category></category></item></channel></rss>