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.rhkb.cn/news/96751.html

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

相关文章

53.Linux day03 文件查看命令,vi/vim常用命令

今天进行了新的学习。 目录 1.cat a.查看单个文件的内容&#xff1a; b.查看多个文件的内容&#xff1a; c.将多个文件的内容连接并输出到一个新文件&#xff1a; d.显示带有行号的文件内容&#xff1a; 2.more 3.less 4.head 5.tail 6.命令模式 7.插入模式 8.图…

H3C交换机如何配置本地端口镜像并在PC上使用Wireshake抓包

环境: H3C S6520-26Q-SI version 7.1.070, Release 6326 Win 10 专业版 Wireshake Version 4.0.3 问题描述: H3C交换机如何配置本地端口镜像并在PC上使用Wireshake抓包 解决方案: 配置交换机本地端口镜像 1.进入系统视图,并创建本地镜像组1 <H3C>system-vie…

Python项目实战:基于napari的3D可视化(点云+slice)

文章目录 一、napari 简介二、napari 安装与更新三、napari【巨巨巨大的一个BUG】四、napari 使用指南4.1、菜单栏&#xff08;File View Plugins Window Help&#xff09;4.2、Window&#xff1a;layer list&#xff08;参数详解&#xff09;4.3、Window&#xff1a;layer…

Linux学习之Telnet明文漏洞

yum install telnet telnet-server xinetd -y安装软件。 systemctl start xinetd.service开启xinetd&#xff0c;systemctl start telnet.socket开启telnet。 xinetd来监控端口&#xff0c;然后把数据传给telnet。 ifconfig eth0看一下eth0网卡信息&#xff0c;。 iptable…

Linux Mint 21.3 计划于 2023 年圣诞节发布

Linux Mint 项目近日公布了基于 Ubuntu 的 Linux Mint 发行版下一个重要版本的一些初步细节&#xff0c;以及备受期待的基于 Debian 的 LMDE 6&#xff08;Linux Mint Debian Edition&#xff09;版本。 近日&#xff0c;Linux Mint 项目负责人克莱门特-勒菲弗&#xff08;Clem…

万字长文·通俗易懂·一篇包掌握——输入/输出·文件操作(c语言超详细系列)(二)

前言&#xff1a;Hello&#xff0c;大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;上一节我们主要学习了格式化输入输出的基本内容&#xff0c;这一节我们对格式化进行更加深入的了解&#xff0c;对文件概念进行介绍&#xff0c;并且对输入、输出与文件读写的基本概念…

基于 KubeSphere 的应用容器化在智能网联汽车领域的实践

公司简介 某国家级智能网联汽车研究中心成立于 2018 年&#xff0c;是担当产业发展咨询与建议、共性技术研发中心、创新成果转化的国家级创新平台&#xff0c;旨在提高我国在智能网联汽车及相关产业在全球价值链中的地位。 目前着力建设基于大数据与云计算的智能汽车云端运营…

[bug] 记录version `GLIBCXX_3.4.29‘ not found 解决方法

在使用mediapipe 这个库的时候&#xff0c;首次使用出现 GLIBCXX_3.4.29’ not found 错误&#xff0c; 看起来是安装mediapipe 的时候自动升级了 matplotlib 这个库&#xff0c;导致依赖的 libstd.so 版本不满足了&#xff0c;GLIBCXX_3.4.29 is an object from libstdc.so.…

Debian10: 安装nut服务器(UPS)

UPS说明&#xff1a; UPS的作用就不必讲了&#xff0c;我选择是SANTAKTGBOX-850&#xff0c;规格为 850VA/510W&#xff0c;可以满足所需&#xff0c;关键是Debian10自带了驱动可以支持&#xff0c;免去安装驱动&#xff0c;将UPS通过USB线连接服务器即可&#xff0c;如下图所示…

【数理知识】向量与基的内积,Matlab 代码验证

序号内容1【数理知识】向量的坐标基表示法&#xff0c;Matlab 代码验证2【数理知识】向量与基的内积&#xff0c;Matlab 代码验证 文章目录 1. 向量与基的内积2. 二维平面向量举例3. 代码验证Ref 1. 向量与基的内积 假设存在一个二维平面内的向量 a ⃗ \vec{a} a &#xff0c…

QT TLS initialization failed问题(已解决) QT基础入门【网络编程】openssl

问题: qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 这个问题的出现主要是使用了https请求:HTTPS ≈ HTTP + SSL,即有了加密层的HTTP 所以Qt 组件库需要OpenSSL dll 文件支持HTTPS 解决: 1.加入以下两行代码获取QT是否支持opensll以…

【学习FreeRTOS】第8章——FreeRTOS列表和列表项

1.列表和列表项的简介 列表是 FreeRTOS 中的一个数据结构&#xff0c;概念上和链表有点类似&#xff0c;列表被用来跟踪 FreeRTOS中的任务。列表项就是存放在列表中的项目。 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS 中的列表是一个双向环形链表列表的…

@Repeatable的作用以及具体如何使用

文章目录 1. 前言2. 先说结论3. 案例演示 1. 前言 最近无意看到某些注解上有Repeatable&#xff0c;出于比较好奇&#xff0c;因此稍微研究并写下此文章。 2. 先说结论 Repeatable的作用&#xff1a;使被他注释的注解可以在同一个地方重复使用。 具体使用如下&#xff1a; T…

.netcore grpc客户端工厂及依赖注入使用

一、客户端工厂概述 gRPC 与 HttpClientFactory 的集成提供了一种创建 gRPC 客户端的集中方式。可以通过依赖包Grpc.Net.ClientFactory中的AddGrpcClient进行gRPC客户端依赖注入AddGrpcClient函数提供了许多配置项用于处理一些其他事项&#xff1b;例如AOP、重试策略等 二、案…

【100天精通python】Day41:python网络爬虫开发_爬虫基础入门

目录 专栏导读 1网络爬虫概述 1.1 工作原理 1.2 应用场景 1.3 爬虫策略 1.4 爬虫的挑战 2 网络爬虫开发 2.1 通用的网络爬虫基本流程 2.2 网络爬虫的常用技术 2.3 网络爬虫常用的第三方库 3 简单爬虫示例 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/…

Databend 开源周报第 106 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 数据脱敏 Data…

APSIM模型参数优化 批量模拟丨气象数据准备、物候发育和光合生产、物质分配与产量模拟、土壤水分平衡算法、土壤碳氮平衡模块、农田管理模块等

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

nginx php-fpm安装配置

nginx php-fpm安装配置 nginx本身不能处理PHP&#xff0c;它只是个web服务器&#xff0c;当接收到请求后&#xff0c;如果是php请求&#xff0c;则发给php解释器处理&#xff0c;并把结果返回给客户端。 nginx一般是把请求发fastcgi管理进程处理&#xff0c;fascgi管理进程选…

6.RocketMQ之索引文件ConsumeQueue

本文着重分析为consumequeue/topic/queueId目录下的索引文件。 1.ConsumeQueueStore public class ConsumeQueueStore {protected final ConcurrentMap<String>, ConcurrentMap<Integer>, ConsumeQueueInterface>> consumeQueueTable;public boolean load(…

Sentinel 规则持久化

文章目录 Sentinel 规则持久化一、修改order-service服务1.引入依赖2.配置nacos地址 第二步修改非常麻烦&#xff0c;可以略过&#xff0c;直接使用已经打好包的来使用二、修改sentinel-dashboard源码1. 解压2. 修改nacos依赖3. 添加nacos支持4. 修改nacos地址5. 配置nacos数据…