快速入门Flink

Flink是新一代实时计算平台,采用原生的流处理系统,保证了低延迟性,在API和容错上也是做的相当完善,本文将从架构、组件栈、安装、入门程序等进行基础知识的分析,帮助大家快速对Flink有一个了解。

一.简介

1.是什么

Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,提供支持流处理和批处理两种类型应用的功能。

2.来历

Apache Flink 的前身是柏林理工大学一个研究性项目,在 2014 被Apache 孵化器所接受,然后迅速地成为了Apache SoftwareFoundation的顶级项目之一。

3.特点

(1)现有的开源计算方案,会把流处理和批处理作为两种不同的应用类型:流处理一般需要支持低延迟、Exactly-once保证,而批处理需要支持高吞吐、高效处理

(2)Flink是完全支持流处理,也就是说作为流处理看待时输入数据流是无界的,批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的

二.组件栈

Flink系统本身是一个分成的架构,如下图所示: 

1.Deployment层

部署层,主要涉及了Flink的部署模式,Flink支持多种部署模式:本地、集群Standalone/Yarn)、云(GCE/EC2),一般生成环境中常使用Yarn模式

1)什么是yarn?

Apache Hadoop YARN(Yet AnotherResource Negotiator,另一种资源协调者),是一种新的 Hadoop 资源管理器,它是个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。

2)Flink&Yarn简图如下:

Flink yarn Client直接与Yarn Resource Manager进行通讯,Yarn Resource Manager是用来向Flink集群申请资源,从而启动应用服务,当Yarn Resource Manager申请好了资源后,Flink可以直接提交Job在Yarn上面运行,也就是说资源调用这个工作完全交给Yarn去处理。

2.Runtime层

核心层,Runtime层提供了支持Flink计算的全部核心实现,比如:支持分布式Stream处理、JobGraph到ExecutionGraph的映射、调度等等为上层API层提供基础服务。

3.API层

API层,主要实现了面向无界Stream的流处理和面向Batch的批处理API,其中面向流处理对应DataStream API,面向批处理对应DataSet API,API层对于开发者开说只最核心的,开发者都是通过调用Flink暴露出来的API进行代码编写;

4.Libaries层

在API层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理两类。

1)流处理:

a.CEP(Event Processing):提供事件处理模型;

b.Table(Relational):提供类似于SQL的操作。

2)批处理:

a.FlinkML(Machine Learning):提供机器学习库;

b.Gelly(Graph Processing):提供图处理模型;

c.Table(Relational):提供类似于SQL的操作。

三.自身优势

1.优点

1)支持高吞吐(通过测算,跑同样的业务代码,Flink比spark和SparkStreaming的吞吐量都要高)、低延迟(支持毫秒级延迟)、高性能的流处理

2)支持高度灵活的窗口(Window)操作(窗口操作是流处理的核心,Flink支持多种窗口操作,比如滑动窗口、滚动窗口、会话窗口等);

3)支持有状态计算的Exactly-once语义(什么是有状态?假如说代码是搜索特定的事件,比如用户的点击或购买行为,那么状态就会保存截至到目前为止遇到的所有事件的顺序;再比如说程序计算每一分钟事件的聚合,那么状态会保存已经挂起的聚合;再比如说程序是训练机器模型,状态就可以保存当前模型的一些版本参数等);

4)提供DataStream API和DataSet API。

2.区别

(1)Flink本身没有实现exactly-once,需要开发者去实现这个功能;

(2)Flink和SparkStreaming都支持流式计算,Fink是一行一行处理,是基于操作符的连续流模型,而SparkStreaming是基于数据片集合(RDD)进行小批量处理,所以SparkStreaming在流式处理方面会增加一些延迟;

(3)Flink可以支持毫秒级计算,而Spark则只能支持秒级计算,如果是要求对实时性要求非常高的场景(如高频实时交易),Spark是难以满足的,可以考虑Flink或Storm。

四.基本概念&编程模型

1.基本概念

(1)Flink程序的基础构建模块是(streams)与转换(transformations);

(2)每一个数据流起始于一个或多个 source,并终止于一个或多个sink

一个典型的Flink程序映射成Streaming Dataflow的示意图:

Soure:通过Flink消费Kafka作为我们的数据输入;

Transformation:将输入的数据转换为程序中的需要的实体类或者结果;

Sink:将处理完的数据进行落地,比如写入Redis、Mysql、Hbase等。

并行流示意图如下:

Flink中所有的Soure、Transformation、Sink都是可以并行进行的,Soure是可以进行分区的,对每个分区进行map(),map()完以后再进行其他逻辑处理,最后再及进行Sink。

2.编程模型

时间窗口:

(1)流上的聚合需要由 窗口 来划定范围,比如“计算过去的5分钟!或者“最后100个元素的和';

(2)窗口通常被区分为不同的类型,比如滚动窗口(没有重叠 )、滑动窗口(有重叠),以及会话窗口(由不活动的间隙所打断)。

典型的Flink支持的窗口示意图如下:

1)滚动时间窗口:按固定时间设置窗口,如图就是1分钟设置为一个窗口,窗口大小就是1分钟。

2)滑动时间窗口:需要指定一个sliding size,举个例子:如果要计算过去30秒钟出现的数字,对它进行求和运算,每个30秒之间希望停顿5秒,这个就是slinging size,这就代表同一个数字可能属于上一个窗口,也属于下一个窗口,会出现数据的重复。

3)滚动数量窗口:每个窗口涉及到的数量是需要自己指定的,上图表示一个滚动窗口中需要三条数据,每当一个窗口的三条数据达到以后,就需要进行下一次的计算;

4)会话窗口:需要指定空档期时间,比如可以规定用户访问,10秒钟不操作,任务一次操作结束。

五.分布式运行环境

1.基本架构

(1)Flink是基于Master-Slave风格的架构;

(2)Flink集群启动时,会启动一个JobManager进程、至少一个TaskManager进程。

2.架构示意图

详细架构图:

简略架构图:

(1)JobManager

1)Flink系统的协调者,它负责接收FlinkJob,调度组成Job的多个Task的执行;

2)收集Job的状态信息,并管理Flink集群中从节点TaskManager。

(2)TaskManager

1)实际负责执行计算的Worker,在其上执行FlinkJob的一组Task;

2)TaskManager负责管理其所在节点上的资源信息,如内存、磁盘网络,在启动的时候将资源的状态向JobManager汇报。

(3)Client

1)用户提交一个Flink程序时,会首先创建一个Client,该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群(代码由客户端获取并做转换,之后提交给JobManger);

3)Client会将用户提交的Flink程序组装一个JobGraph,并且是以JobGraph的形式提交的。

六.下载和安装

注意:Flink是一个非常灵活的处理框架,它支持多种不同的部署场景,还可以和不同的资源管理平台方便地集成,由于本文只做入门,所以按照最基本的集群方式部署,该部署方式完全可以用于开发测试。

1.准备环境

(1)Vmware安装三台Centos7.5的服务器,并且安装JDK1.8的环境。

IPHOSTNAME性质
192.168.100.101flink001master
192.168.100.102flink002slave
192.168.100.103flink003slave

三台服务器均需要修改hosts:vi /etc/hosts

192.168.100.101  flink001
192.168.100.102  flink002
192.168.100.103  flink003

(2)下载Flink1.20版本:https://dlcdn.apache.org/flink/flink-1.20.0/flink-1.20.0-bin-scala_2.12.tgz,并且上传到三台服务器/home目录下,并解压:tar -zxvf flink-1.20.0-bin-scala_2.12.tgz

2.修改配置

1)hadoop001配置

a.config.yaml

env:
  java:
    opts:
      all: --add-exports=java.base/sun.net.util=ALL-UNNAMED --add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-exports=java.security.jgss/sun.security.krb5=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.locks=ALL-UNNAMED

jobmanager:
  bind-host: 0.0.0.0
  rpc:
    address: flink001
    port: 6123
  memory:
    process:
      size: 1600m
  execution:
    failover-strategy: region

taskmanager:
  bind-host: 0.0.0.0
  host: flink001
  numberOfTaskSlots: 1
  memory:
    process:
      size: 1728m

parallelism:
  default: 1

rest:
  address: flink001
  bind-address: 0.0.0.0

b.masters

flink001:8081

c.workers

flink001
flink002
flink003

2)hadoop002配置

a.config.yaml

env:
  java:
    opts:
      all: --add-exports=java.base/sun.net.util=ALL-UNNAMED --add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-exports=java.security.jgss/sun.security.krb5=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.locks=ALL-UNNAMED


jobmanager:
  bind-host: 0.0.0.0
  rpc:
    address: flink001
    port: 6123
  memory:
    process:
      size: 1600m
  execution:
    failover-strategy: region

taskmanager:
  bind-host: 0.0.0.0
  host: flink002
  numberOfTaskSlots: 1
  memory:
    process:
      size: 1728m

parallelism:
  default: 1

rest:
  address: flink001
  bind-address: 0.0.0.0

b.masters

flink001:8081

c.workers

flink001
flink002
flink003

3)hadoop003配置

a.config.yaml

env:
  java:
    opts:
      all: --add-exports=java.base/sun.net.util=ALL-UNNAMED --add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-exports=java.security.jgss/sun.security.krb5=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.locks=ALL-UNNAMED


jobmanager:
  bind-host: 0.0.0.0
  rpc:
    address: hadoop001
    port: 6123
  memory:
    process:
      size: 1600m
  execution:
    failover-strategy: region

taskmanager:
  bind-host: 0.0.0.0
  host: haoop003
  numberOfTaskSlots: 1
  memory:
    process:
      size: 1728m

parallelism:
  default: 1

rest:
  address: hadoop001
  bind-address: 0.0.0.0

b.masters

flink001:8081

c.workers

flink001
flink002
flink003

说明:

(1)config.yaml文件中,flink002、flink003的配置,仅taskmanager.host各自填自己的主机名,不修改rest.address,其他与flink001保持一致即可,masters、workers文件全部相同;

(2)三台服务需要配置免密登录,否则后续启动集群的时候需要输入三次密码,本人不做免密登录的说明。

3.启动集群

(1)进入bin目录下:/home/flink-1.20.0/bin;

(2)执行启动脚本:./start-cluster.sh;

(3)输入每台服务器对应的密码,完成启动;

(4)访问WebUI:http://192.168.100.101:8081,出现如下页面即集群启动成功:

七.入门程序

1.环境要求

(1)Maven 3.0+;

(2)Java 1.8;

(3)Flink 1.20.0。

2.创建工程

(1)创建一个普通maven工程;

(2)导入依赖:

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <flink.version>1.20.0</flink.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients</artifactId>
            <version>${flink.version}</version>
        </dependency>
    </dependencies>

(3)数据准备:在工程目录下创建input文件夹,在该文件夹下创建word.txt文件,如下

hello flink
hello java
hello work

3.代码编写

需求:统计每个单词出现的次数

(1)批处理实现WordCount(有界)

/**
 * DataSet ApI 有界 实现 wordcount(过时,不推荐)
 */
public class WordCountBatchDemo {
    public static void main(String[] args) throws Exception {
        // 1.创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        // 2.读取数据:从文件中读服env
        DataSource<String> lineDs = env.readTextFile("input/word.txt");
        // 3.切分、转换(word,1)
        FlatMapOperator<String, Tuple2<String, Integer>> wordAndOne = lineDs.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
                // 3.1 按照空格切分单词
                String[] words = value.split(" ");
                // 3.2 将单词转换为(word,1)
                for (String word : words) {
                    Tuple2<String, Integer> wordTuple2 = Tuple2.of(word, 1);
                    // 3.3 使用collector向下游发送数据
                    out.collect(wordTuple2);
                }
            }
        });
        // 4.按照word分组(参数代表的是位置,按照单词分组,word在0索引位置,表示第一个元素)
        UnsortedGrouping<Tuple2<String, Integer>> wordAndOneGroupby = wordAndOne.groupBy(0);
        // 5.各分组内聚合(参数代表的是位置,1代表数值1,表示第二个元素)
        AggregateOperator<Tuple2<String, Integer>> sum = wordAndOneGroupby.sum(1);
        // 6.输出
        sum.print();
    }
}

// 控制台输出
// (java,1)
// (flink,1)
// (work,1)
// (hello,3)
// 一次性输出所有结果,这就是批处理

注意:此方法在1.17版本以后已经不推荐使用了。

(2)流处理实现WordCount(有界)

/**
 * DataStream ApI 有界 实现 wordcount
 */
public class WordCountStreamDemo {
    public static void main(String[] args) throws Exception {
        // 1.创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 2.读取数据: 从文件读
        DataStreamSource<String> lineDs = env.readTextFile("input/word.txt");
        // 3.处理数据:切分、转换、分组、聚合
        // 3.1 切分、转换
        SingleOutputStreamOperator<Tuple2<String, Integer>> wordAndOne = lineDs.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
                // 3.1 按照空格切分单词
                String[] words = value.split(" ");
                // 3.2 将单词转换为(word,1)
                for (String word : words) {
                    Tuple2<String, Integer> wordTuple2 = Tuple2.of(word, 1);
                    // 3.3 使用collector向下游发送数据
                    out.collect(wordTuple2);
                }
            }
        });
        // 3.2分组
        KeyedStream<Tuple2<String, Integer>, String> wordAndOneKS = wordAndOne.keyBy(
                new KeySelector<Tuple2<String, Integer>, String>() {
                    @Override
                    public String getKey(Tuple2<String, Integer> value) throws Exception {
                        return value.f0;
                    }
                }
        );
        // 3.3聚合
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = wordAndOneKS.sum(1);
        // 4.输出数据
        sum.print();
        // 5.执行:类似 sparkstreaming最后ssc.start()
        env.execute();
    }
}

// 控制台输出
// 10> (flink,1)
// 2> (java,1)
// 9> (work,1)
// 4> (hello,1)
// 4> (hello,2)
// 4> (hello,3)
// 来一条数据,处理一条数据,这就是流处理,所以hello有1 2 3,这也是"有状态"的体现
// 最前面的编号就是并行度,本机是12线程的,所以这个编码不对大于12,并且每次执行都不一样

区别:

1)执行环境不一样:批处理是ExecutionEnvironment,流处理是StreamExecutionEnvironment;

2)分组操作不一样:批处理是groupBy,流处理是keyBy;

3)流出来必须调用env.execute(),不然不会执行,批处理不需要调用。

(3)流处理实现WordCount(无界)

/**
 * DataStream ApI 无界 实现 wordcount
 */
public class WordCountstreamUnboundedDemo {
    public static void main(String[] args) throws Exception {
        // 1.创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 2.读战数据:socket
        DataStreamSource<String> socketDs = env.socketTextStream("hadoop102", 7777);
        // 3、处理数据:切换、转换、分组、聚合
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = socketDs
                .flatMap((String value, Collector<Tuple2<String, Integer>> out) -> {
                    String[] words = value.split(" ");
                    for (String word : words) {
                        out.collect(Tuple2.of(word, 1));
                    }
                })
                .keyBy(value -> value.f0)
                .sum(1);
        // 4.输出
        sum.print();
        // 5.执行env.execute();
        env.execute();
    }
}

执行报错:

Caused by: org.apache.flink.api.common.functions.InvalidTypesException: The generic type parameters of 'Collector' are missing. In many cases lambda methods don't provide enough information for automatic type extraction when Java generics are involved. An easy workaround is to use an (anonymous) class instead that implements the 'org.apache.flink.api.common.functions.FlatMapFunction' interface. Otherwise the type has to be specified explicitly using type information.
	at org.apache.flink.api.java.typeutils.TypeExtractionUtils.validateLambdaType(TypeExtractionUtils.java:371)
	at org.apache.flink.api.java.typeutils.TypeExtractionUtils.extractTypeFromLambda(TypeExtractionUtils.java:188)
	at org.apache.flink.api.java.typeutils.TypeExtractor.getUnaryOperatorReturnType(TypeExtractor.java:560)
	at org.apache.flink.api.java.typeutils.TypeExtractor.getFlatMapReturnTypes(TypeExtractor.java:177)
	at org.apache.flink.streaming.api.datastream.DataStream.flatMap(DataStream.java:611)
	at com.lsy.WordCountstreamUnboundedDemo.main(WordCountstreamUnboundedDemo.java:18)

说明:

1)Flink 还具有一个类提取系统,可以分析函数的输人和返回类型,自动获取类型信息,从而获得对应的序列化器和反序列化器,但是,由于Java中泛型擦除的存在,在某些特殊情况下(比如 Lambda 表达式中,嵌套的泛型就会出现该问题),自动提取的信息是不够精细的--只告诉 Flink 当前的元素由“船头、船身、船尾”构成,根本无法重建出“大船”的模样,这时就需要显式地提供类型信息,才能使应用程序正常工作或提高其性能。

2)因为对于 fatMap里传入的Lambda表达式,系统只能推断出返回的是 Tuple2 类型,而无法得到 Tuple2<String,Long>,只有显式地告诉系统当前的返回类型,才能正确地解析出完整数据。

修改后代码:

/**
 * DataStream ApI 无界 实现 wordcount
 */
public class WordCountstreamUnboundedDemo {
    public static void main(String[] args) throws Exception {
        // 1.创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 2.读战数据:socket
        DataStreamSource<String> socketDs = env.socketTextStream("hadoop102", 7777);
        // 3、处理数据:切换、转换、分组、聚合
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = socketDs
                .flatMap((String value, Collector<Tuple2<String, Integer>> out) -> {
                    String[] words = value.split(" ");
                    for (String word : words) {
                        out.collect(Tuple2.of(word, 1));
                    }
                })
                // 明确显示类型
                .returns(Types.TUPLE(Types.STRING, Types.INT))
                .keyBy(value -> value.f0)
                .sum(1);
        // 4.输出
        sum.print();
        // 5.执行env.execute();
        env.execute();
    }
}

启动后,程序会一直运行,当socket有数据过来时,控制台就会打印对应的内容,这就是无界的意思,没输入就不打印,输入一条数据就打印一条,没数据就一直等待,这也就是事件驱动型。

有界流执行完后程序就退出了,无界流程序会一直执行,除非手动退出程序,工作中一般会使用无界流的方式。

4.命令行提交作业

在Flink的bin目录下执行:./flink run -m hadoop002 -c com.ls.WordCountstreamUnboundedDemo /home/task/flinkdemo-1.0-SNAPSHOT.jar ,提交成功后如下:

5.WebUI提交任务

上传jar包:

填写相关信息并提交:

八.API简介

下面介绍部分常用API的作用

1.DataSet API

2.DataStream API

3.DataStream API & DataSet API

 这是两者共有的API,唯一的却别是DataStream是一个无线的流,DataSet是一个有限的流。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VOSK实现【离线中文语音】识别

Vosk是一款开源的离线语音识别工具包&#xff0c;具有以下功能&#xff1a; 多语言支持&#xff1a;能够对20多种语言和方言进行语音识别&#xff0c;如中文、英语、德语、法语、西班牙语等&#xff0c;可满足不同用户的语言需求。 模型轻量化&#xff1a;每种语言的模型大小仅…

最新版pycharm如何配置conda环境

首先在conda prompt里创建虚拟环境&#xff0c;比如 conda create --prefix E:/projects/myenv python3.8然后激活 conda activate E:/projects/myenv往里面安装点自己的包&#xff0c;比如 conda install pytorch1.7.1 torchvision0.8.2 -c pytorch打开pycharm 注意&#x…

MySQL用户授权、收回权限与查看权限

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

【vitpress】静态网站添加访问量统计

这里要是用的插件是不蒜子。 1.安装插件 npm i busuanzi.pure.js2.添加VisitorPanel.vue文件 在.vitepress/theme/components文件添加VisitorPanel.vue文件&#xff0c;内容如下&#xff1a; <!-- .vitepress/theme/components/VisitorPanel.vue --> <template>…

Data Filtering Network 论文阅读和理解

目录 一、TL&#xff1b;DR 二、Introduction 2.1 apple的结论 2.2 业界做法&#xff1a; 2.3 我们的做法&#xff08;Apple&#xff09; 2.4 如何获取好的DFN 三、未完待续&#xff08;这周出去购物了&#xff0c;下周继续补充&#xff09; 一、TL&#xff1b;DR 核心…

MATLAB绘图时线段颜色、数据点形状与颜色等设置,介绍

MATLAB在绘图时&#xff0c;设置线段颜色和数据点的形状与颜色是提高图形可读性与美观性的重要手段。本文将详细介绍如何在 MATLAB 中设置这些属性。 文章目录 线段颜色设置单字母颜色表示法RGB 值表示法 数据点的形状与颜色设置设置数据点颜色和形状示例代码 运行结果小结 线段…

部署 Harbor 私有云仓库

参考链接&#xff1a;https://docs.tianshu.org.cn/docs/setup/deploy-harbor-cloud-warehouse 使用

150 Linux 网络编程6 ,从socket 到 epoll整理。listen函数参数再研究

一 . 只能被一个client 链接 socket例子 此例子用于socket 例子&#xff0c; 该例子只能用于一个客户端连接server。 不能用于多个client 连接 server socket_server_support_one_clientconnect.c /* 此例子用于socket 例子&#xff0c; 该例子只能用于一个客户端连接server。…

Java基础 (一)

基础概念及运算符、判断、循环 基础概念 关键字 数据类型 分为两种 基本数据类型 标识符 运算符 运算符 算术运算符 隐式转换 小 ------>>> 大 强制转换 字符串 拼接符号 字符 运算 自增自减运算符 ii赋值运算符 赋值运算符 包括 强制转换 关系运算符 逻辑运算符 …

项目集成RabbitMQ

文章目录 1.common-rabbitmq-starter1.创建common-rabbitmq-starter2.pom.xml3.自动配置1.RabbitMQAutoConfiguration.java2.spring.factories 2.测试使用1.创建common-rabbitmq-starter-demo2.目录结构3.pom.xml4.application.yml5.TestConfig.java 配置交换机和队列6.TestCon…

Codeforces Round 1000 (Div. 2) B and C

B. Subsequence Update 链接&#xff1a;Problem - B - Codeforces 题意&#xff1a;给定一个数组 可以选择任意个元素 后对这些元素进行排序 问你给定一个区间 这个区间的最小值 算法&#xff1a;贪心 排序 思路&#xff1a;下标1到r的最小个&#xff08;r-l1&#xff09;…

进程的哪些内存类型容易引起内存泄漏

相信你在平时的工作中&#xff0c;应该遇到过下面这些场景&#xff1a; 伴随着服务器中的后台任务持续地运行&#xff0c;系统中可用内存越来越少&#xff1b; 应用程序正在运行时忽然被 OOM kill 掉了&#xff1b; 进程看起来没有消耗多少内存&#xff0c;但是系统内存就是不够…

如何给自己的域名配置免费的HTTPS How to configure free HTTPS for your domain name

今天有小伙伴给我发私信&#xff0c;你的 https 到期啦 并且随手丢给我一个截图。 还真到期了。 javapub.net.cn 这个网站作为一个用爱发电的编程学习网站&#xff0c;用来存编程知识和面试题等&#xff0c;平时我都用业余时间来维护&#xff0c;并且还自费买了服务器和阿里云…

Glarysoft Malware Hunter 多语检测和删除各种恶意软件和间谍软件 v1.195.0.824

Glarysoft Malware Hunter 是一款专业的安全工具&#xff0c;旨在帮助用户检测和删除各种恶意软件和间谍软件。它可以扫描和删除计算机上的病毒、木马、广告软件和其他安全威胁。 软件功能 病毒扫描&#xff1a;Malware Hunter可以快速而全面地扫描计算机&#xff0c;以查找潜…

通过Ukey或者OTP动态口令实现windows安全登录

通过 安当SLA&#xff08;System Login Agent&#xff09;实现Windows安全登录认证&#xff0c;是一种基于双因素认证&#xff08;2FA&#xff09;的解决方案&#xff0c;旨在提升 Windows 系统的登录安全性。以下是详细的实现方法和步骤&#xff1a; 1. 安当SLA的核心功能 安…

Windows远程连接Docker服务

问题背景 本地开发了一个SpringBoot项目&#xff0c;想通过Docker部署起来&#xff0c;我本地是Window11系统&#xff0c;由于某些原因不能虚拟化并且未安装Docker-Desktop&#xff0c;所以我在想有没有办法本地不需要虚拟化也不需要安装Docker-Desktop来实现支持Docker命令远…

Ubuntu20.04 运行 Cartographer demo bag

官方文档&#xff1a; Running Cartographer ROS on a demo bag — Cartographer ROS documentation Running Cartographer ROS on a demo bag Now that Cartographer and Cartographer’s ROS integration are installed, you can download example bags (e.g. 2D and 3D b…

【R语言】流程控制

一、流程控制 R语言中&#xff0c;常用的流程控制函数有&#xff1a;repeat、while、for、if…else、switch。 1、repeat循环 repeat函数经常与 break 语句或 next 语句一起使用。 repeat ({x <- sample(c(1:7),1)message("x ", x, ",你好吗&#xff1f…

2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程

本文目录 一、查看驱动版本1.1 查看显卡驱动1.2 显卡驱动和CUDA对应版本1.3 Pytorch和Python对应的版本1.4 Pytorch和CUDA对应的版本 二、安装CUDA三、安装cuDANN四、安装pytorch五、验证是否安装成功 一、查看驱动版本 1.1 查看显卡驱动 输入命令nvidia-smi可以查看对应的驱…

Go学习:常量

变量&#xff1a;程序运行期间&#xff0c;可以改变的量&#xff0c;变量声明需要使用 var 常量&#xff1a;程序运行期间&#xff0c;不可以改变的量&#xff0c;常量声明需要使用 const 目录 1. 常量不允许修改 2. 常量赋值不使用 : 3. 常量能够自动推导类型 1. 常量不允许…