<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[fengfengzai0101的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/fengfengzai0101</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; fengfengzai0101]]></copyright><item><title><![CDATA[Centos7安装Python3.7]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/124586407</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/124586407</guid><author>fengfengzai0101</author><pubDate>Thu, 05 May 2022 12:54:10 +0800</pubDate><description><![CDATA[Centos7安装Python3.7]]></description><category></category></item><item><title><![CDATA[Netty入门]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/123416986</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/123416986</guid><author>fengfengzai0101</author><pubDate>Fri, 11 Mar 2022 09:42:02 +0800</pubDate><description><![CDATA[介绍
netty是基于Java NIO网络提供客户端/服务端框架，它非常方便开发底层的非阻塞的网络应用。
netty拥有如下特性：

易用性：比Java NIO更易使用，提供针对很多使用场景的示例
最小化依赖：仅仅需要一个依赖即可得到整个框架
高性能：提供比核心Java API更高的吞吐量以及低延迟，由于内部资源池的概念使得它更容易扩展
安全性：提供SSL、TLS、StartTLS支持

Netty构建块
基于Java的网络应用中，核心的组成是类Socket，而Netty提供的Channel接口提供了API]]></description><category></category></item><item><title><![CDATA[Debezium是什么]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/122512492</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/122512492</guid><author>fengfengzai0101</author><pubDate>Sat, 15 Jan 2022 17:51:28 +0800</pubDate><description><![CDATA[Debezium是什么


Debezium是一个用来捕获数据库数据变更的分布式服务，你的应用可以看到这些数据变更，以及处理他们。Debezium以更改事件流的形式记录每张表的行级变更。
然后应用可以以事件流产生的顺序读取事件流变更记录。
目前支持的Source Connectors是Mysql，MongoDB，PostgresSQL、Oracle、SQL Server、Db2、Cassamdra、Vitesss。
目前Cassandra、Vitess处于孵化阶段。
说明：孵化连接器发版用于预览目的，对于孵]]></description><category></category></item><item><title><![CDATA[Fork/Join使用]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121808714</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121808714</guid><author>fengfengzai0101</author><pubDate>Thu, 09 Dec 2021 10:53:46 +0800</pubDate><description><![CDATA[介绍

Fork/join是ExecutorService的扩展。Fork/Join能够好好利用多处理器。
任务能够递归的切割成更小的子任务
Fork/Join框架分配任务到线程池中的工作线程，该框架是特别的，因为它显示了“偷任务”算法，闲置的线程能够从繁忙的线程中获取任务，最大化使用处理器
Fork/Join框架的核心是ForkJoinPool类，这个类是AbstractExecutorService类的框架。ForkJoinPool实现了“偷任务”算法，可以执行ForkJoinTask任务。
ForkJ]]></description><category></category></item><item><title><![CDATA[异步执行基本方法]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121793096</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121793096</guid><author>fengfengzai0101</author><pubDate>Wed, 08 Dec 2021 15:45:51 +0800</pubDate><description><![CDATA[介绍
Java最开始使用Thread进行异步编程，后来产生了Future，尽管Future针对Thread提升了好多，但还是存在好多缺陷。进一步产生了CompletableFuture，解决了Future的一些限制。
例如，解决了如下限制：

真正的非阻塞
能够以编程方式完成Future
可以异常处理
可以链接多个Futures
可以结合多个Futures的结果

方法说明
runAsync方法

用来异步执行一个方法，方法接受一个Runnable接口
方法并不会返回值
支持传递一个Executor作为第二]]></description><category></category></item><item><title><![CDATA[线程的基本方法]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121774266</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121774266</guid><author>fengfengzai0101</author><pubDate>Tue, 07 Dec 2021 17:19:44 +0800</pubDate><description><![CDATA[介绍
这篇文章介绍线程的一些基本方法

join
sleep
yield

join方法

如果在正在运行的线程t1上调用t2的join()方法，那么t1会进行等待状态，直到t2完成它的执行。
如果join方法传递一个时间，那么表示t1只会等待该时间，就会往下继续执行。
我们以例子来说明：

public class ThreadExample implements Runnable {

    public static void main(String[] args) throws Interrupt]]></description><category></category></item><item><title><![CDATA[MappedByteBuffer]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121772090</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121772090</guid><author>fengfengzai0101</author><pubDate>Tue, 07 Dec 2021 16:13:10 +0800</pubDate><description><![CDATA[介绍
ByteBuffer有三种类型

No-Direct
Direct
MappedByteBuffer

其中Bytebuffer可以创建No-Direct和Direct类型，MappedByteBuffer类型是通过ByteBuffer的子类MappedByteBuffer来创建的。
今天简单介绍下MappedByteBuffer类。这个类对于读取文件来说非常高效。
MappedByteBuffer解读
例如，当我们多次读取一个文件内容时，可以加载文件内容到内存中，然后在内存中进行读取，而不需要从磁盘]]></description><category></category></item><item><title><![CDATA[堆外内存例子]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121755993</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121755993</guid><author>fengfengzai0101</author><pubDate>Mon, 06 Dec 2021 21:00:00 +0800</pubDate><description><![CDATA[使用ByteBuffer分配int类型数值(int类型占用4字节)

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(12);
System.out.println("byteBuffer.position: " + byteBuffer.position());
byteBuffer.putInt(3);
System.out.println("byteBuffer.position: " + byteBuffer.position());
byteB.]]></description><category></category></item><item><title><![CDATA[堆内存与堆外内存]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121749621</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/121749621</guid><author>fengfengzai0101</author><pubDate>Mon, 06 Dec 2021 16:17:46 +0800</pubDate><description><![CDATA[1 介绍
作为一名Java开发者，可能会优先考虑到堆内存，因为JVM会自动在堆内存中进行对象分配和释放。但是作为一名优秀的Java开发者，要意识到：基于JVM的应用中，堆内存 可以使用，但同时堆外内存也可以使用。
要根据使用场景，将对象存储在堆内存中或者堆外内存中。
JVM的架构如下：

2. 堆内存
堆内存切割成如下区域：

Heap:

young generation
eden
survival0
survival1
old generation
oil generation

新创建的类实例首先在y]]></description><category></category></item><item><title><![CDATA[Function Currying in Java]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/116756438</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/116756438</guid><author>fengfengzai0101</author><pubDate>Thu, 13 May 2021 16:49:17 +0800</pubDate><description><![CDATA[Function Currying in Java
概念
在Java中定义了一个参数方法(Function)、两个参数方法(BiFunction)，可以将这两种方法以参数形式传递到其他方法中，但是针对太多参数的方法，就需要使用额外的库(Vavr)，另一种选择就是使用Function Currying。
Function Currying表示将多参数的方法切割为单参数的多个方法，输出结果是相同的。
切换成单参数的方法除了最后一个方法返回期望的值之外，其他方法都是返回一个方法。

通过如下代码对比 (used ]]></description><category></category></item><item><title><![CDATA[ThreadLocal变量-Java]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/111700393</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/111700393</guid><author>fengfengzai0101</author><pubDate>Fri, 25 Dec 2020 19:33:55 +0800</pubDate><description><![CDATA[ThreadLocal介绍：

ThreadLLocal变量是为了对象线程安全。是synchronization的另一种选择。
每个线程都会有ThreadLocal变量的副本，所以能够提供线程安全。
一个线程可以全局访问ThreadLocal变量，表示一个线程中的任何方法都可以访问该变量
ThreadLocal变量对于一个线程来说是本地，表示一个线程不能访问、修改另一个线程的ThreadLocal变量。

ThreadLocal简单语法：


创建变量
private static final Thread]]></description><category></category></item><item><title><![CDATA[算法面试题-Java]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108750294</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108750294</guid><author>fengfengzai0101</author><pubDate>Wed, 23 Sep 2020 12:45:00 +0800</pubDate><description><![CDATA[转换一个字符串
循环方法：
public class Example {

    public static void main(String[] args) {
        String origin = "hello world";
        String reverse = "";

        for (int i = origin.length() - 1; i &gt;= 0; i--) {
            reverse += origin.charAt(i);
   ]]></description><category></category></item><item><title><![CDATA[位操作-java]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108746339</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108746339</guid><author>fengfengzai0101</author><pubDate>Wed, 23 Sep 2020 12:04:24 +0800</pubDate><description><![CDATA[列表




操作
描述




|
位或运算


&amp;
位与运算


~
按位补码


^
按位异或运算


&lt;&lt;
左位移


&gt;&gt;
右位移


&gt;&gt;&gt;
无符号右位移


例子
位或运算
位或运算是二元运算，通过|表示，通过比较两个操作数对应的位，如果对应的位有一个是1，那么就是1，如果不是，那么就是0。
public class Example {

    public static void main(String[] args) {
        ]]></description><category></category></item><item><title><![CDATA[Hive debug]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108644783</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108644783</guid><author>fengfengzai0101</author><pubDate>Thu, 17 Sep 2020 15:32:05 +0800</pubDate><description><![CDATA[执行hive cli
hive --debug



将hive源码导入idea开工作，进行编译


配置远程debug



点击idea开发工具中的debug，设置断点


在服务器上执行HiveSQL语句，即可跟踪源码



]]></description><category></category></item><item><title><![CDATA[FlinkSQL连接JDBC]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108642104</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108642104</guid><author>fengfengzai0101</author><pubDate>Thu, 17 Sep 2020 14:30:15 +0800</pubDate><description><![CDATA[运行FlinkSQL
./sql-client.sh embedded --jar /home/&lt;username&gt;/flink-connector-jdbc_2.11-1.11.0.jar --jar /home/&lt;username&gt;/mysql-connector-java-8.0.21.jar

创建表
CREATE TABLE test (
  a string,
  b int,
  c string,
  PRIMARY KEY (a) NOT ENFORCED
) WI]]></description><category></category></item><item><title><![CDATA[FlinkSQL连接Kafka]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108638675</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108638675</guid><author>fengfengzai0101</author><pubDate>Thu, 17 Sep 2020 12:50:06 +0800</pubDate><description><![CDATA[创建kafka topic
kafka-topics --zookeeper test:2181 --topic test --partitions 1 --replication-factor 1 --create

生成测试数据
kafka-console-producer --broker-list test:9092 --topic test

开启FlinkSQL
./sql-client.sh embedded --jar /home/&lt;username&gt;/flink-sql-con]]></description><category></category></item><item><title><![CDATA[创建bucket和sort表]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108527209</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/108527209</guid><author>fengfengzai0101</author><pubDate>Fri, 11 Sep 2020 09:16:48 +0800</pubDate><description><![CDATA[创建bucket和sort表
CREATE TABLE Employee(
	ID BIGINT,
	NAME STRING, 
	AGE INT,
	SALARY BIGINT,
	DEPARTMENT STRING 
)
COMMENT '雇员表'
CLUSTERED BY(ID) SORTED BY(AGE) INTO 5 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

表是通过ID字段进行分桶，在每]]></description><category></category></item><item><title><![CDATA[Implicit，Mixs-Scala]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/107833945</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/107833945</guid><author>fengfengzai0101</author><pubDate>Thu, 06 Aug 2020 10:43:18 +0800</pubDate><description><![CDATA[隐士参数
package Implicit

object ImplicitTest {

  implicit val stringModoId: ModoId[String] = new ModoId[String] {
    override def add(x: String, y: String): String = {
      x.concat(y)
    }

    override def unit: String = {
      ""
    }
  }

  implici]]></description><category></category></item><item><title><![CDATA[Traits-Scala]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/107814472</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/107814472</guid><author>fengfengzai0101</author><pubDate>Wed, 05 Aug 2020 15:22:43 +0800</pubDate><description><![CDATA[创建Traits
package traits

trait DonutShoppingCartDao {

  def add(donut: String): Long

  def update(donut: String): Boolean

  def search(donut: String): String

  def delete(donut: String): Boolean

}


package traits

class DonutShoppingCart extends Donu]]></description><category></category></item><item><title><![CDATA[类的使用-Scala]]></title><link>https://blog.youkuaiyun.com/fengfengzai0101/article/details/107770689</link><guid>https://blog.youkuaiyun.com/fengfengzai0101/article/details/107770689</guid><author>fengfengzai0101</author><pubDate>Mon, 03 Aug 2020 18:45:37 +0800</pubDate><description><![CDATA[定义类
package common

class Donut(donutName: String, productCode: String) {

  def print = {
    println(s"donutName is $donutName, productCode is $productCode")
  }

}


val donut = new Donut("name", "1001")
donut.print

伴侣对象
package common

class Donut(don]]></description><category></category></item></channel></rss>