5、flink任务中可以使用哪些转换算子(Transformation)

1、什么是Flink中的转换算子

        在使用 Flink DataStream API 开发流式计算任务时,可以将一个或多个 DataStream 转换成新的 DataStream,在应用程序中可以将多个数据转换算子合并成一个复杂的数据流拓扑图。


2、常用的转换算子 

        Flink提供了功能各异的转换算子,Map,FlatMap,Filter,KeyBy,Reduce,Window,WindowAll...
通过操作各种转换算子,来获取新的DataStream及子类的实例,来完成计算需求。

Tips: 下面测试用例基于 Flink1.17.0、java1.8 编写


3、基本转换算子(map/ filter/ flatMap)

3.1 Map

功能说明:

DataStream[T] → DataStream[R]
输入一个元素同时输出一个元素,可以对元素的数据类型和内容做转换,好比SQL中的UDF函数

代码示例:

package com.baidu.datastream.transform;import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Map {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2.使用 Map 算子// 方式1:使用 Lambda表达式env.fromElements("刘备", "张飞", "关羽", "赵云", "马超", "黄忠").map(value -> value + "_").print();// 方式2:使用 MapFunction实现类/**  TODO MapFunction<T, O>*   功能说明:*      对元素做1:1映射转换*   泛型说明:*      @T : 输入数据类型*      @O : 输出数据类型* */MapFunction<String, Integer> mapFunction = new MapFunction<String, Integer>() {@Overridepublic Integer map(String value) throws Exception {return value.length();}};env.fromElements("刘备", "张飞", "关羽", "赵云", "马超", "黄忠").map(mapFunction).print();// 3.触发程序执行env.execute();}
}

执行结果:


 3.2 FlatMap 

功能说明:

DataStream[T] → DataStream[R]
输入一个元素同时产生零个、一个或多个元素,好比SQL中的UDTF(1对多)函数

 代码示例:

package com.baidu.datastream.transform;import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;public class FlatMap {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2.使用 FlatMap 算子// 方式:使用 flatMapFunction实现类/**  TODO flatMapFunction<T, O>*   功能说明:*      对输入元素做1:多的转换(好比SQL中的UDTF函数)*   泛型说明:*      @T : 输入数据类型*      @O : 输出数据类型* */FlatMapFunction<String, String> flatMapFunction = new FlatMapFunction<String, String>() {@Overridepublic void flatMap(String value, Collector<String> out) throws Exception {for (String s : value.split("_")) {out.collect(s);}}};env.fromElements("刘_备", "张_飞", "关_羽", "赵_云", "马_超", "黄_忠").flatMap(flatMapFunction).print();// 3.触发程序执行env.execute();}
}

执行结果:


3.3 Filter

功能说明:

DataStream[T] → DataStream[T]
为每个元素执行一个逻辑判断,并保留那些判断为 true 的元素,好比SQL中的where

代码示例:

package com.baidu.datastream.transform;import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Filter {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2.使用 Filter 算子// 方式1:使用 Lambda表达式env.fromElements("刘备", "张飞", "关羽", "赵云", "马超", "黄忠").filter(value -> value.equals("刘备")).print();// 方式2:使用 FilterFunction实现类/**  TODO FilterFunction<T, O>*   功能说明:*      对元素过滤处理*   泛型说明:*      @T : 输入数据类型* */FilterFunction<String> filterFunction = new FilterFunction<String>() {@Overridepublic boolean filter(String value) throws Exception {return value.equals("张飞");}};env.fromElements("刘备", "张飞", "关羽", "赵云", "马超", "黄忠").filter(filterFunction).print();// 3.触发程序执行env.execute();}
}

执行结果:


4、聚合算子

4.1 KeyBy(按键分区)

功能说明:

DataStream[T] → KeyedStream[T,K]
根据指定的字段(key),将数据划分到不相交的分区中。相同key的元素会被分到同一个分区中。

分区规则:
          分区编号 =  指定字段(key) 的哈希值 % 分区个数(并行度)   

思考:

        1、哪些 数据类型 不能作为分区的key?

                  数组类型不能作为key     

                  当key的类型为bean类型时,bean类必须要重写hashCode方法

 代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class KeyBy {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);// 2.使用 KeyBy 算子// 方式1:使用 Lambda表达式// TODO key的类型为 StringKeyedStream<String, String> stringKeyedStream = env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策").keyBy(value -> value.split("_")[0]);stringKeyedStream.print();// TODO key的类型为 bean (需重写hashCode方法)KeyedStream<FlinkUser, FlinkUser> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L), new FlinkUser(2L, "x", 110L), new FlinkUser(3L, "y", 120L), new FlinkUser(4L, "y", 130L), new FlinkUser(5L, "z", 140L)).keyBy(user -> user);// TODO key的类型为 数组(不支持)
//        KeyedStream<String, String[]> arrayKeyedStream = env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策")
//                .keyBy(value -> value.split("_"));// 方式2:使用 KeySelector实现类/** TODO KeySelector<IN, KEY>*   功能说明:*       从输入的数据中提取key,然后根据 `key的hashcode%并行度` 进行分区*       注意:这里的分区是逻辑分区*   泛型说明:*       @IN  : 输入数据类型*       @KEY : key的数据类型*   重要提示:*       什么类型的数据不能作为key呢?*          1.当 POJO 类且没有重写 hashCode() 方法而是依赖依赖于 Object.hashCode() 实现时*          2.任意类型的数组* */KeySelector<FlinkUser, String> keySelector = new KeySelector<FlinkUser, String>() {@Overridepublic String getKey(FlinkUser value) throws Exception {return value.name;}};KeyedStream<FlinkUser, String> userNameKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L), new FlinkUser(2L, "x", 110L), new FlinkUser(3L, "y", 120L), new FlinkUser(4L, "y", 130L), new FlinkUser(5L, "z", 140L)).keyBy(keySelector);// max("字段名称") pojo类一定要含有空参构造//userNameKeyedStream.sum("id").print();// 3.触发程序执行env.execute();}
}

执行结果:


4.2 Reduce

功能说明:

KeyedStream[T,K] → DataStream[T]
在相同key的数据流上`滚动`执行聚合操作。将当前元素与上次一次聚合后得到的值(保存的状态值)组合然后输出新值,并将这个值作为状态进行保存。

Reduce函数的弊端:
        聚合前数据类型 = 聚合后数据类型,不能修改数据类型
        不能提供初始值进行聚合操作,当只有一个元素时,不会触发reduce函数

代码示例:

package com.baidu.datastream.transform;import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Reduce {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(4);// 2.使用 Reduce 算子/** TODO ReduceFunction<T>*   功能说明:*       对相同key中的元素进行聚合操作(依次聚合)*   泛型说明:*       输入数据和输出数据的类型*   重要说明:*       这种聚合方式不能修改value的数据类型** */ReduceFunction<Tuple2<String, Integer>> reduceFunction = new ReduceFunction<Tuple2<String, Integer>>() {@Overridepublic Tuple2<String, Integer> reduce(Tuple2<String, Integer> value1, Tuple2<String, Integer> value2) throws Exception {return new Tuple2(value1.f0, value1.f1 + value2.f1);}};// 统计每个国家出现的次数env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策").map(new MapFunction<String, Tuple2<String, Integer>>() {@Overridepublic Tuple2<String, Integer> map(String value) throws Exception {return new Tuple2(value.split("_")[0], 1);}}).keyBy(new KeySelector<Tuple2<String, Integer>, String>() {@Overridepublic String getKey(Tuple2<String, Integer> value) throws Exception {return value.f0;}}).reduce(reduceFunction).print();// 3.触发程序执行env.execute();}
}

运行结果:


 4.3 sum、min、max、minBy、maxBy

功能说明:

KeyedStream[T,K] → DataStream[T]
在相同key的数据流上`滚动`执行相应聚合操作。

min、minBy的区别:
             min:聚合状态中保存的是第一个元素的非聚合字段
         minBy:聚合状态中保存的是当前元素的非聚合字段

代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class SumMinMaxMinByMaxBy {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(1);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "y", 140L)).keyBy(user -> user.name);/** TODO max("")、max(num)*   功能说明:*      根据指定的字段,做聚合操作*   怎样指定聚合字段:*      当 value类型为 pojo时,通过 max("字段名称") 来指定字段*      当 value类型为 tuple时,通过 max(num) 来指定字段*   重点说明:*      当 value类型为pojo时,必须实现空参构造方法,才能提取字段* *///userKeyedStream.max("id").print();//userKeyedStream.min("id").print();//userKeyedStream.sum("id").print();//userKeyedStream.maxBy("id").print();userKeyedStream.minBy("id").print();env.execute();}
}

5、物理分区算子

Flink提供了将数据重新分区的方法,当任务发生数据倾斜时,这个算子会很有用。

5.1 shuffle - 随机分区

功能说明:

        DataStream[T] → DataStream[T]
        将元素随机地均匀分配到下游分区

Tips:
        因为是完全随机,当输入相同时,每次执行的结果可能会不同

代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Shuffle {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "x", 140L),new FlinkUser(6L, "x", 150L)).keyBy(user -> user.name);/** TODO 问题:由于 keyBy 算子,导致数据倾斜(key相同,导致数据都被同一个并行子任务处理)*    我们可以使用 shuffle 算子将数据均匀的在分配到其他并行子任务中去* 重点提示:*    shuffle 算子只能操作 DataStream,不能操作 KeyedStream* */userKeyedStream.sum("id").shuffle().print();env.execute();}
}

运行结果:

 5.2 rebalance - 轮询分区

功能说明:

        DataStream[T] → DataStream[T]
        使用Round-Robin负载均衡算法,将输入的数据平均的分配到下游分区中去。   

 代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Rebalance {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "x", 140L),new FlinkUser(6L, "x", 150L)).keyBy(user -> user.name);/** TODO 问题:由于 keyBy 算子,导致数据倾斜(key相同,导致数据都被同一个并行子任务处理)*    我们可以使用 rebalance 算子将数据均匀的在分配到其他并行子任务中去* 重点提示:*    rebalance 算子只能操作 DataStream,不能操作 KeyedStream* */userKeyedStream.sum("id").rebalance().print();env.execute();}
}

运行结果:

5.3 rescale - 重缩分区

功能说明:

        DataStream[T] → DataStream[T]
        使用Round-Robin负载均衡算法,将以分区为单位将输入的数据平均的分配到下游分区中去。

和rebalance的区别:

          rebalance将输入数据作为一个整体,根据数据输入的顺序随机分发到下游分区(涉及到了网络传输)
          rescale将以上游分区为单位,随机的分配到下游分区中去

使用场景:    

         当source算子为可并发数据源时(如kafka,5个分区),设置5个Task来读取分别读取每个分区的数据
    此时,可以使用rescale来分发到下游实现负载均衡,这样可以做到数据只在本地传输而不是网络传输

5.4 global - 全局分区

功能说明:

        DataStream[T] → DataStream[T]
        将元素分发到下游的一个分区中去 

5.5 broadcast - 广播分区

 功能说明:

        DataStream[T] → DataStream[T]
        将元素广播到下游的每个分区 

Tips:
        数据被广播后,会在下游算子的每个分区中都保留一份,可以将数据进行重复处理

代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Broadcast {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "x", 140L),new FlinkUser(6L, "x", 150L)).keyBy(user -> user.name);userKeyedStream.sum("id").broadcast().print();env.execute();}
}

运行结果:

 5.6  自定义分区

功能说明:

        DataStream[T] → DataStream[T]
        使用用户定义的 Partitioner 将元素分发到下游算子的分区中去

代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.api.common.functions.Partitioner;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class PartitionCustom {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "x", 140L),new FlinkUser(6L, "x", 150L)).keyBy(user -> user.name);/**  TODO Partitioner<K>*   功能说明:*       自定义分区器,根据输入的数据获取分区编号*   泛型说明:*       @K : key的数据类型* */Partitioner<Long> partitioner = new Partitioner<Long>() {@Overridepublic int partition(Long key, int numPartitions) {if (key == 1L || key == 2L) {return 0;} else if (key == 3L || key == 4L) {return 1;} else {return 2;}}};/** TODO KeySelector<IN, KEY>*  功能说明:*       key提取器,根据输入的数据,获取key*  泛型说明:*       @IN  : 输入数据类型*       @KEY : 输出数据类型(key)* */KeySelector<FlinkUser, Long> keySelector = new KeySelector<FlinkUser, Long>() {@Overridepublic Long getKey(FlinkUser value) throws Exception {return value.id;}};userKeyedStream.sum("id").partitionCustom(partitioner, keySelector).print();env.execute();}
}

运行结果:


6、分流

        在处理数据的时候,经常会将一条流或者一个表根据某些条件拆分成多条流或者多个表

flink中提供了分流的方式:1、使用filter算子分流   2、使用侧输出流分流

 6.1 使用filter算子分流 - 不推荐

这种分流方式的弊端:

        需要将原始流复制多份,并对每一份做一次判断,效率很低 (多次读取,多次判断)

代码示例:

    // 通过 filter 分流public static void ByFilter() throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 根据国家,将 totalStream 分为三股流DataStreamSource<String> totalStream = env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策");SingleOutputStreamOperator<String> weiStream = totalStream.filter(e -> e.contains("魏"));SingleOutputStreamOperator<String> shuStream = totalStream.filter(e -> e.contains("蜀"));SingleOutputStreamOperator<String> wuStream = totalStream.filter(e -> e.contains("吴"));weiStream.print();shuStream.print();wuStream.print();// 3.触发程序执行env.execute();}

6.2 使用侧输出流分流 - 推荐

        避免了使用filter算子的弊端,指定source读取一次,判断一次即可完成分流操作

代码示例:

    // 通过 侧输入流 分流public static void ByOutputTag() throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 根据国家,将 totalStream 分为三股流DataStreamSource<String> totalStream = env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策");// 初始化侧输出流OutputTag weiOutputTag = new OutputTag("wei", Types.STRING);OutputTag shuOutputTag = new OutputTag("shu", Types.STRING);OutputTag wuOutputTag = new OutputTag("wu", Types.STRING);// 通过 ProcessFunction向 侧输出流发送数据SingleOutputStreamOperator<String> process = totalStream.process(new ProcessFunction<String, String>() {@Overridepublic void processElement(String value, ProcessFunction<String, String>.Context ctx, Collector<String> out) throws Exception {// 往侧输出流中发送数据if (value.contains("魏")) {ctx.output(weiOutputTag, value);} else if (value.contains("蜀")) {ctx.output(shuOutputTag, value);} else if (value.contains("吴")) {ctx.output(wuOutputTag, value);}}});SideOutputDataStream weiStream = process.getSideOutput(weiOutputTag);SideOutputDataStream shuStream = process.getSideOutput(shuOutputTag);SideOutputDataStream wuStream = process.getSideOutput(wuOutputTag);weiStream.print();shuStream.print();wuStream.print();// 3.触发程序执行env.execute();}

7、合并流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

msvcp140.dll丢失的解决方法,如何预防msvcp140.dll丢失

在电脑操作系统中经常会弹出类似msvcp140.dll丢失的错误提示窗口&#xff0c;导致软件无法正常运行。为什么会出现msvcp140.dll丢失的情况呢&#xff1f;出现这种情况应该如何解决呢&#xff1f;小编有三种解决方法分享给大家。 一.msvcp140.dll丢失的原因 1.安装过程中受损:在…

Elasticsearch 查询之Function Score Query

前言 ES 的主查询评分模式分为两种&#xff0c;是信息检索领域的重要算法&#xff1a; TF-IDF 算法 和 BM25 算法。 Elasticsearch 从版本 5.0 开始引入了 BM25 算法作为默认的文档评分&#xff08;relevance scoring&#xff09;算法。在此之前&#xff0c;Elasticsearch 使…

sip网络号角喇叭 sip音柱 POE供电广播音箱 ip网络防水对讲终端 sip网络功放

SV-7042TP网络号角喇叭 一、描述 SV-7042TP是我司的一款SIP网络号角喇叭&#xff0c;具有10/100M以太网接口&#xff0c;内置有一个高品质扬声器&#xff0c;将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率30W。SV-7042TP作为SIP系统的播放终端&#xff0c;可…

【脚踢数据结构】常见树总结(图码结和版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的…

如何构造不包含字母和数字的webshell

利用不含字母与数字进行绕过 1.异或进行绕过 2.取反进行绕过 3.利用php语法绕过 利用不含字母与数字进行绕过 基本代码运行思路理解 <?php echo "A"^""; ?> 运行结果为! 我们可以看到&#xff0c;输出的结果是字符"!"。之所以会…

对比 VPN 与远程桌面软件,为什么远程桌面更优越

数字格局不断演变&#xff0c;我们的工作和连接方式也在不断变化。企业纷纷转向远程运营&#xff0c;有关推进向远程过渡的最佳技术的争论从未停止。争论的焦点通常是虚拟专用网络&#xff08;VPN&#xff09;和远程桌面软件。 长期以来&#xff0c;VPN 一直被用作访问公司网络…

【C++】函数指针

2023年8月18日&#xff0c;周五上午 今天在B站看Qt教学视频的时候遇到了 目录 语法和typedef或using结合我的总结 语法 返回类型 (*指针变量名)(参数列表)以下是一些示例来说明如何声明不同类型的函数指针&#xff1a; 声明一个不接受任何参数且返回void的函数指针&#xf…

【Flink】Flink窗口触发器

数据进入到窗口的时候,窗口是否触发后续的计算由窗口触发器决定,每种类型的窗口都有对应的窗口触发机制。WindowAssigner 默认的 Trigger通常可解决大多数的情况。我们通常使用方式如下,调用trigger()方法把我们想执行触发器传递进去: SingleOutputStreamOperator<Produ…

kubernetes--技术文档--基本概念--《10分钟快速了解》

官网主页&#xff1a; Kubernetes 什么是k8s Kubernetes 也称为 K8s&#xff0c;是用于自动部署、扩缩和管理容器化应用程序的开源系统。 它将组成应用程序的容器组合成逻辑单元&#xff0c;以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验&#xff0c…

《一个操作系统的实现》windows用vm安装CentOS——从bochs环境搭建到第一个demo跑通

vm安装CentOS虚拟机带有桌面的版本。su输入密码123456。更新yum -y update 。一般已经安装好后面这2个工具&#xff1a;yum install -y net-tools wget。看下ip地址ifconfig&#xff0c;然后本地终端连接ssh root192.168.249.132输入密码即可&#xff0c;主要是为了复制网址方便…

Netty+springboot开发即时通讯系统笔记(四)终

实时性 1.线程池多线程&#xff0c;把消息同步给其他端和对方用户&#xff0c;其中数据持久化往往是最浪费时间的操作&#xff0c;可以使用mq异步存储&#xff0c;因为其他业务不需要拿着整条数据&#xff0c;只需要这条数据的id进行操作。 2。消息校验前置&#xff0c;放在t…

Vim的插件管理器之Vundle

1、安装Vundle插件管理器 Vim可以安装插件&#xff0c;但是需要手动安装比较麻烦&#xff0c;Vim本身没有提供插件管理器&#xff0c;所以会有很多的第三方的插件管理器&#xff0c;有一个vim的插件叫做 “vim-easymotion”&#xff0c;在它的github的安装说明里有列出对于不同…

GRPC 学习记录

GRPC 安装 安装 grpcio、grpcio-tools、protobuf、 pip install grpcio -i https://pypi.tuna.tsinghua.edu.cn/simple pip install grpcio-tools -i https://pypi.tuna.tsinghua.edu.cn/simple pip install protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple常用类型 p…

Minio知识点+linux下安装+面试总结

一 Minio简介 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&…

msvcp110.dll是什么意思,msvcp110.dll丢失的解决方法

装好软件或游戏之后&#xff0c;一打开就跳出各种报错信息的情况小伙伴一定见过&#xff0c;其中缺少各种msvcp110.dll文件最常见。小伙伴们一定奇怪&#xff0c;用得好好的电脑&#xff0c;怎么会缺文件呢&#xff1f;为啥其他游戏/应用就没事呢&#xff1f;其实这些“丢失”的…

visual studio 2022配置

前提&#xff1a;我linux c 开发 一直在使用vscode 更新了个版本突然代码中的查找所用引用和变量修改名称不能用了&#xff0c;尝试了重新配置clang vc都不行&#xff0c;估计是插件问题&#xff0c;一怒之下改用visual studio 2022 为了同步2个IDE之间的差别&#xff0c;目前…

QT的核心——信号与槽

目录 回顾C 语言信号 1、信号与槽 2、关联信号与槽 2.1自动关联信号与槽 2.2手动关联信号与槽 2.3断开信号与槽 3、自定义信号 3.1自定义信号使用条件 3.2自定义槽函数使用条件 4、信号与槽参数传递 4.1自定义一个带参的信号 4.2关联带参的信号与槽 4.3发送一个带…

YOLOv5、YOLOv8改进:S2注意力机制

目录 1.简介 2.YOLOv5改进 2.1增加以下S2-MLPv2.yaml文件 2.2common.py配置 2.3yolo.py配置 1.简介 S2-MLPv2注意力机制 最近&#xff0c;出现了基于 MLP 的视觉主干。与 CNN 和视觉Transformer相比&#xff0c;基于 MLP 的视觉架构具有较少的归纳偏差&#xff0c;在图像识…

LVS-DR+keepalived实现高可用负载群集

VRRP 通信原理&#xff1a; VRRP就是虚拟路由冗余协议&#xff0c;它的出现就是为了解决静态路由的单点故障。 VRRP是通过一种竞选的一种协议机制&#xff0c;来将路由交给某台VRRP路由。 VRRP用IP多播的方式&#xff08;多播地址224.0.0.18&#xff09;来实现高可用的通信&…

基于STM32+OneNet设计的物联网智慧路灯

一、前言 近年来&#xff0c;构筑智慧城市、推动城镇发展被国家列入重要工作范畴。发布的《超级智慧城市报告》显示&#xff0c;全球已启动或在建的智慧城市有1000多个&#xff0c;中国在建500个&#xff0c;远超排名第二的欧洲&#xff08;90个&#xff09;。从在建智慧城市的…