【Flink】DataStream API使用之源算子(Source)

news2024/9/23 5:33:22

源算子

在这里插入图片描述

创建环境之后,就可以构建数据的业务处理逻辑了,Flink可以从各种来源获取数据,然后构建DataStream进项转换。一般将数据的输入来源称为数据源(data source),而读取数据的算子就叫做源算子(source operator)。所以,Source就是整个程序的输入端。
Flink中添加source的方式,是调用执行环境的 addSource()方法:

DataStreamSource<String> stringDataStreamSource = env.addSource(...);
DataStreamSource<String> stringDataStreamSource = env.fromSource(...);

参数是一个泛型接口SourceFunction<OUT>,需要实现 SourceFunction 接口;返回 DataStreamSource。这里的
DataStreamSource 类继承自 SingleOutputStreamOperator 类,又进一步继承自 DataStream。所以
很明显,读取数据的 source 操作是一个算子,得到的是一个数据流(DataStream)。阿萨德
Flink提供了很多种已经实现好的source function,一般情况下我们只需要找到对应的实现类就可以了。
以下介绍5种读取数据的源算子示例。

1. 从集合中读取

最简单的读取数据的方式,就是在代码创建一个集合通过调用执行环境的fromCollection 或者其他方法进行读取。这相当于将数据读取到内存中,形成特殊的数据结构后,作为数据源使用,一般用于测试。

1.1 fromCollection

基于集合构建输入数据,集合中的所有元素必须是同一种类型。

方法名示例
public <OUT> DataStreamSource<OUT> fromCollection(Collection<OUT> data) env.fromCollection(list)
public <OUT> DataStreamSource<OUT> fromCollection(Collection<OUT> data, TypeInformation<OUT> typeInfo) env.fromCollection(list, BasicTypeInfo.STRING_TYPE_INFO)
public <OUT> DataStreamSource<OUT> fromCollection(Iterator<OUT> data, Class<OUT> type)env.fromCollection(new CustomIterator(), String.class)
public <OUT> DataStreamSource<OUT> fromCollection(Iterator<OUT> data, TypeInformation<OUT> typeInfo)env.fromCollection(new CustomIterator(), BasicTypeInfo.STRING_TYPE_INFO)

参数说明:

  • Collection<OUT> data 集合对象,例如List,Set
  • Iterator<OUT> data 迭代器对象或者自定义迭代器,CustomIterator
  • Class<OUT> type type 集合数据元素类型 ,例如:BasicTypeInfo.STRING_TYPE_INFO.getTypeClass()
  • TypeInformation<OUT> typeInfo 集合数据类型对象,例如:BasicTypeInfo.STRING_TYPE_INFO

其中 CustomIterator 为自定义的迭代器,自定义迭代器除了要实现 Iterator 接口外,还必须实现序列化接口 Serializable ,否则会抛出序列化失败的异常,示例代码如下:

public class CustomIterator implements Iterator<Integer>, Serializable {
    private int i = 0;

    @Override
    public boolean hasNext() {
        return i < 100;
    }

    @Override
    public Integer next() {
        i++;
        return i;
    }
}

1.2 fromElements

基于元素创建,所有元素必须是同一种类型。

方法名示例
public final <OUT> DataStreamSource<OUT> fromElements(OUT... data) env.fromElements("one1", "two2", "three3");
public final <OUT> DataStreamSource<OUT> fromElements(Class<OUT> type, OUT... data) env.fromElements(String.class, "one1", "two2", "three3");

参数说明:

  • OUT... data 多参数元素
  • Class<OUT> type 元素类型 例如:BasicTypeInfo.STRING_TYPE_INFO.getTypeClass()

1.3 fromSequence

基于给定的序列区间进行构建。

方法名示例
public DataStreamSource<Long> fromSequence(long from, long to)env.fromSequence(1, 10);
返回1-10之间的所有数字。

1.4 fromParallelCollection

从一个迭代器中创建并行数据流。Class 指定了该迭代器返回元素的类型。

方法名示例
public <OUT> DataStreamSource<OUT> fromParallelCollection(SplittableIterator<OUT> iterator, Class<OUT> type)env.fromParallelCollection(new NumberSequenceIterator(1, 10), BasicTypeInfo.LONG_TYPE_INFO.getTypeClass());
public <OUT> DataStreamSource<OUT> fromParallelCollection(SplittableIterator<OUT> iterator, TypeInformation<OUT> typeInfo)env.fromParallelCollection(new NumberSequenceIterator(1, 10), BasicTypeInfo.LONG_TYPE_INFO);

参数说明:

  • SplittableIterator<OUT> iterator 是迭代器的抽象基类,它用于将原始迭代器的值拆分到多个不相交的迭代器中。
  • Class<OUT> type type 集合数据元素类型 ,例如:BasicTypeInfo.STRING_TYPE_INFO.getTypeClass()
  • TypeInformation<OUT> typeInfo 集合数据类型对象,例如:BasicTypeInfo.STRING_TYPE_INFO

2. 从文件读取数据

真正业务场景中,不会让我们直接把数据写在代码里,通长情况下可能会从存储介质中获取数据,本地文件或者HDFS文件以及OBS存储中等等。

  • 参数可以是目录,也可以是文件;
  • 路径可以是相对路径,也可以是绝对路径;相对路径是从系统属性 user.dir 获取路径: idea 下是 project 的根目录, standalone 模式下是集群节点根目录;
  • 也可以从 hdfs 目录下读取, 使用路径 hdfs://…, 由于 Flink 没有提供 hadoop 相关依赖, 需要 pom 中添加相关依赖:

2.1 readTextFile

按照 TextInputFormat 格式读取文本文件,并将其内容以字符串的形式返回。

方法名示例
public DataStreamSource<String> readTextFile(String filePath)env.readTextFile("doc/demo.txt");
public DataStreamSource<String> readTextFile(String filePath, String charsetName) env.readTextFile("doc/demo.txt", "UTF-8");

参数说明:

  • filePath 文件路径,可以是绝对路径也可以是相对路径
  • charsetName 文件字符串格式,UTF-8或者GBK等

2.2 readFile

根据给定的FileInputFormat读取用户指定的filePath的内容,文本类型的数据通用型方法

方法名示例
public <OUT> DataStreamSource<OUT> readFile(FileInputFormat<OUT> inputFormat, String filePath)env.readFile(new TextInputFormat(new Path("doc/demo.txt")), "doc/demo.txt");
public <OUT> DataStreamSource<OUT> readFile(FileInputFormat<OUT> inputFormat,String filePath,FileProcessingMode watchType, long interval) env.readFile(new TextInputFormat(new Path("doc/demo.txt")), "doc/demo.txt", FileProcessingMode.PROCESS_ONCE , 10);
public <OUT> DataStreamSource<OUT> readFile(FileInputFormat<OUT> inputFormat,String filePath, FileProcessingMode watchType,long interval,TypeInformation<OUT> typeInformation) env.readFile(new TextInputFormat(new Path("doc/demo.txt")), "doc/demo.txt", FileProcessingMode.PROCESS_ONCE , 10, BasicTypeInfo.STRING_TYPE_INFO);

参数说明:

  • FileInputFormat<OUT> inputFormat 数据流的输入格式
  • String filePath 文件路径,可以是本地文件系统上的路径,也可以是 HDFS 上的文件路径
  • FileProcessingMode watchType 读取方式,它有两个可选值,分别是 FileProcessingMode.PROCESS_ONCE 和 FileProcessingMode.PROCESS_CONTINUOUSLY:前者表示对指定路径上的数据只读取一次,然后退出;后者表示对路径进行定期地扫描和读取。需要注意的是如果 watchType 被设置为 PROCESS_CONTINUOUSLY,那么当文件被修改时,其所有的内容 (包含原有的内容和新增的内容) 都将被重新处理,因此这会打破 Flink 的 exactly-once 语义。
  • long interval 定期扫描的时间间隔。
  • TypeInformation<OUT> typeInformation 输入流中元素的类型

注意!FileInputFormat是一个抽象类,他的实现类有很多,对应了不同文件类型。
在这里插入图片描述

2.3 createInput

使用InputFormat创建输入数据流的通用方法。

方法名示例
public <OUT> DataStreamSource<OUT> createInput(InputFormat<OUT, ?> inputFormat)env.readFile(new TextInputFormat(new Path("doc/demo.txt")), "doc/demo.txt");
public <OUT> DataStreamSource<OUT> createInput(InputFormat<OUT, ?> inputFormat, TypeInformation<OUT> typeInfo) env.readFile(new TextInputFormat(new Path("doc/demo.txt")), "doc/demo.txt", FileProcessingMode.PROCESS_ONCE , 10);

参数说明:

  • InputFormat<OUT, ?> inputFormat 接受通用输入格式读取数据

实际上FileInputFormat就继承自InputFormat,所以使用readFile就可以了
在这里插入图片描述

3. 从 Socket 读取数据

不论从集合还是文件,我们读取的其实都是有界数据。在流处理的场景中,数据往往是无
界的。Flink 提供了 socketTextStream 方法用于构建基于 Socket 的数据流。

3.1 socketTextStream

方法名示例
public DataStreamSource<String> socketTextStream(String hostname, int port, String delimiter, long maxRetry)env.socketTextStream("127.0.0.1", 9999, "\n", 3);
public DataStreamSource<String> socketTextStream(String hostname, int port, String delimiter) env.socketTextStream("127.0.0.1", 9999, "\n");
public DataStreamSource<String> socketTextStream(String hostname, int port) env.socketTextStream("127.0.0.1", 9999);

参数说明:

  • String hostname IP地址或者域名地址
  • int port 端口号,设置为0表示端口号自动分配
  • String delimiter 定界符
  • long maxRetry 最大重试次数, 当 Socket 临时关闭时,程序的最大重试间隔,单位为秒。设置为 0 时表示不进行重试;设置为负值则表示一直重试。
    创建一个新的数据流,其中包含从套接字无限接收的字符串。接收到的字符串由系统的默认字符集解码,使用“\n”作为分隔符。当套接字关闭时,读取器将立即终止。

4. 从 Kafka 读取数据

一些比较基本的 Source 和 Sink 已经内置在 Flink 里。 预定义 data sources 支持从文件、目录、socket,以及 collections 和 iterators 中读取数据。 预定义 data sinks 支持把数据写入文件、标准输出(stdout)、标准错误输出(stderr)和 socket。
Flink1.17版本已经集成了非常多的连接器,我这里使用的1.12版本。
在这里插入图片描述
Flink 还有些一些额外的连接器通过 Apache Bahir 发布, 包括:
在这里插入图片描述
具体详细的连接器信息,可以看官方文档DataStream Connectors

这里主要介绍下使用Flink读取Kafka数据的连接方式

4.1 导入外部依赖

Flink自身是没有Kafka的连接器的,不过Flink提供了Kafka的连接器的依赖包,

<dependency>
	 <groupId>org.apache.flink</groupId>
	 <artifactId>flink-connector-kafka_${scala.binary.version}</artifactId>
	 <version>${flink.version}</version>
</dependency>

只需要注意相对应的版本就可以了,我这里用的

<flink.version>1.13.0</flink.version>
<scala.binary.version>2.12</scala.binary.version>

然后使用FlinkKafkaConsumer就可以了

4.2 使用FlinkKafkaConsumer开发

在1.17版本,Flink已经推荐使用KafkaSource来构建Kafka的连接器,示例:

KafkaSource<String> source = KafkaSource.<String>builder()
    .setBootstrapServers(brokers)
    .setTopics("input-topic")
    .setGroupId("my-group")
    .setStartingOffsets(OffsetsInitializer.earliest())
    .setValueOnlyDeserializer(new SimpleStringSchema())
    .build();

env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source");

FlinkKafkaConsumer测试代码示例:

public class GetDataSourceFromKafka {
    public static void main(String[] args) throws Exception {
        // 1. 直接调用getExecutionEnvironment 方法,底层源码可以自由判断是本地执行环境还是集群的执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        // 2. 从Kafka中读取数据
        Properties properties = new Properties();
        // 3. 设置Kafka消费者配置参数
        properties.setProperty("bootstrap.servers", "hadoop102:9092");
        properties.setProperty("group.id", "consumer-group");
        properties.setProperty("key.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("value.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("auto.offset.reset", "latest");
        // 4. 指定监听topic, 并定义Flink和Kafka之间对象的转换规则
        DataStreamSource<String> KafkaSource = env.addSource(new FlinkKafkaConsumer<>("topic", new SimpleStringSchema(), properties));
        KafkaSource.print("dd");
        // 5. 执行程序
        env.execute();
    }
}

创建FlinkKafkaConsumer对象需要至少三个参数,这三个参数的说明如下:
public FlinkKafkaConsumer(String topic, DeserializationSchema<T> valueDeserializer, Properties props)

  • topic:定义了从哪些主题中读取数据。
  • valueDeserializer: 是一个 DeserializationSchema 或者 KafkaDeserializationSchema。Kafka 消
    息被存储为原始的字节数据,所以需要反序列化成 Java 或者 Scala 对象。上面代码中
    使用的 SimpleStringSchema,是一个内置的 DeserializationSchema,它只是将字节数
    组简单地反序列化成字符串。DeserializationSchema 和 KafkaDeserializationSchema是
    公共接口,所以我们也可以自定义反序列化逻辑。
  • props: 是一个 Properties 对象,设置了 Kafka 客户端的一些属性。

FlinkKafkaConsumer有很多的构造方法,对应不同场景,你可以使用一个 topic,也可以是 topic
列表,还可以是匹配所有想要读取的 topic 的正则表达式。
在这里插入图片描述
KeyedDeserializationSchema 过期了,所以这里使用的是KafkaDeserializationSchema。当然读取kafka的数据还有更多配置,这里不再详细描写,可以看官网的文档Apache Kafka 连接器

5. 自定义 Source读取数据

除了Flink提供的数据源连接器外,你还可以通过自定义实现 SourceFunction创建数据源连接器,自定义SourceFunction必须要实现重写两个关键方法:run()cancel()

  • run()方法:使用运行时上下文对象(SourceContext)向下游发送数据。
  • cancel()方法:通过标识位控制退出循环,来达到中断数据源的效果。

以下是自定义SourceFunction代码实例:

public class CustomSource  implements SourceFunction<Event> {
    // 声明一个布尔变量,作为控制数据生成的标识位
    private Boolean running = true;

    @Override
    public void run(SourceContext<Event> ctx) throws Exception {
        Random random = new Random(); // 在指定的数据集中随机选取数据
        String[] users = {"Mary", "Alice", "Bob", "Cary"};
        String[] urls = {"./home", "./cart", "./fav", "./prod?id=1", "./prod?id=2"};
        while (running) {
            ctx.collect(new Event(
                    users[random.nextInt(users.length)],
                    urls[random.nextInt(urls.length)],
                    Calendar.getInstance().getTimeInMillis()
            ));
            // 隔 1 秒生成一个点击事件,方便观测
            Thread.sleep(1000);
        }
    }

    @Override
    public void cancel() {
            running = false;
    }
}

使用方式就是直接通过addSource()调用就可以了
DataStreamSource<Event> customSource = env.addSource(new CustomSource());

注意我们实现的SourceFunction并行度只有1,如果数据源设置大于1的并行度,就会抛出异常

Exception in thread "main" java.lang.IllegalArgumentException: The parallelism 
of non parallel operator must be 1.

所以如果我们想要自定义并行的数据源的话,需要使用·ParallelSourceFunction,示例代码如下:

public class CustomSource  implements ParallelSourceFunction<Event> {
    // 声明一个布尔变量,作为控制数据生成的标识位
    private Boolean running = true;

    @Override
    public void run(SourceContext<Event> ctx) throws Exception {
        Random random = new Random(); // 在指定的数据集中随机选取数据
        String[] users = {"Mary", "Alice", "Bob", "Cary"};
        String[] urls = {"./home", "./cart", "./fav", "./prod?id=1", "./prod?id=2"};
        while (running) {
            ctx.collect(new Event(
                    users[random.nextInt(users.length)],
                    urls[random.nextInt(urls.length)],
                    Calendar.getInstance().getTimeInMillis()
            ));
            // 隔 1 秒生成一个点击事件,方便观测
            Thread.sleep(1000);
        }
    }

    @Override
    public void cancel() {
            running = false;
    }
}

使用方式就是直接通过addSource()调用就可以了
DataStreamSource<Event> customSource = env.addSource(new CustomSource()).setParallelism(2);

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

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

相关文章

【vue3】06-vue的组件化开发-脚手架创建项目

文章目录 Vue的组件化组件化开发注册组件的方式vue全局组件vue局部组件 Vue的开发模式Vue CLI脚手架安装Vue CLI使用Vue CLI Vue的组件化 Vue是一款前端框架&#xff0c;在这个框架中&#xff0c;组件化开发是非常重要的。Vue的组件化就是将一个页面划分为多个独立的、可复用的…

LeetCode5. 最长回文子串

写在前面&#xff1a; 题目链接&#xff1a;LeetCode5. 最长回文子串 编程语言&#xff1a;C 题目难度&#xff1a;中等 一、题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例…

算力256TOPS,典型功耗35W,存算一体芯片杀入智能驾驶

作者 | 张祥威 编辑 | 德新 国产智驾芯片有了新玩家 “最高物理算力256 TOPS&#xff0c;典型功耗35W&#xff0c;基于12nm制程工艺。” 5月10日&#xff0c;后摩智能发布首款基于存算一体架构的智驾芯片——鸿途™H30&#xff0c;并公布上述关键指标。 算力、数据和算法&am…

单例模式的饿汉和懒汉写法(基于C++)

目录 单例模式例程饿汉懒汉 对比函数调用线程安全总结 单例模式 单例模式确保一个类只有一个实例&#xff0c;并提供全局访问点。这样可以避免在系统中出现多个相同的对象&#xff0c;从而提高系统的性能和可维护性。 单例模式的实现包括饿汉和懒汉&#xff0c;下面介绍C中这两…

操作系统基础知识之处理器性能方程指标(包含阿达姆定律、CPI、Clock cycle time等)

计算机设计人员通过持续时间或速率来指代时钟周期的时间。程序的 CPU 时间可以用两种方式表示&#xff1a; CPU 时间程序的 CPU 时钟周期 / 时钟频率 除了执行程序所需的时钟周期数外&#xff0c;我们还可以计算执行的指令数。 如果我们知道时钟周期数和指令数&#xff0c;就…

金融学第二版笔记第一章1.1

第1部分 金融和金融体系 第一章金融学 1.1 一、 对金融学进行界定 1.金融 金融是货币流通、信用活动及与之相关的经济行为的总称。 简言之&#xff0c;就是货币资金的融通。一般是指以银行、证券市场等为中心的货币流通和信用调节活动&#xff0c;包括货币的发行和流通、存…

转置卷积(一) 搞懂转置卷积的计算

搞懂转置卷积的计算 0、参考文档1、转置卷积是什么&#xff1f;1.1 定义1.2 需要注意 2、转置卷积的计算2.1 从最简单的开始2.2 考虑stride2.3 考虑padding2.4 考虑dilation 3 转置卷积的加速 文章首发于https://zhaodongyu-ak47.github.io/Transposed_Convolution/ 最近做了一…

数据结构入门-二叉树

树的概念及结构 树的概念 树的一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树&#xff0c;也就是说它树根朝上&#xff0c;而叶子朝下。 有一个特殊的节点&#xff…

Web安全行业:零基础学习网络安全需要掌握哪些知识?(附系统路线+工具笔记)

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 一、网络安全行业特点 行业发展空间大&#xff0c;岗位非常多 网络安全行业产业以来&#xff0c;随即新增加了几十个…

单元测试 - 集成H2 Dao测测试

SpringBoot 2.7、Mybatis plus、H2 1. pom引入h2 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>2.1.214</version> </dependency> 2. 配置h2数据源 & mapper路径 spring:datas…

地狱级的字节跳动面试,6年测开的我被按在地上摩擦.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

( 位运算 ) 260. 只出现一次的数字 III ——【Leetcode每日一题】

❓260. 只出现一次的数字 III 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额…

精炼计算机网络——数据链路层(一)

文章目录 前言3.1 数据链路和帧3.1.1 数据链路和帧3.1.2 三个基本问题 总结 前言 上篇文章&#xff0c;我们一同学完了物理层的全部内容&#xff0c;在本篇文章中&#xff0c;我们初步学习数据链路层&#xff0c;理解数据链路和帧的相应概念&#xff0c;知晓封装成帧&#xff…

信号完整性分析基础知识之传输线和反射(五):较短阻抗不连续的传输线、残桩和末端容性负载引起的反射

首先来一首定场诗&#xff1a;难难难&#xff0c;道德玄&#xff0c;不对知音不可谈。对了知音谈几句&#xff0c;不对知音枉费舌尖。 较短不连续点引起的反射 很多时候&#xff0c;板载走线的宽度必须要收窄&#xff0c;特别是经过PF区域或者拥挤区域。如果传输线的某一小段…

eSIM证书要求-证书验证-EID

SM-DP 和 SM-DS 应该验证 EUM 和 eUICC 证书中限制的 IIN 和 EID 的一致性&#xff08;参见第 4.5.2.1.0.2 和 4.5.2.1.0.3 节&#xff09;&#xff0c;并考虑 SGP.29 [ 89]。 根据 SGP.29 [89] 颁发的 EID 没有 SGP.02 [2] 中定义的 8 位 IIN。 相反&#xff0c;它们具有可变长…

【计算机视觉 | Python】十个 Python 图像处理工具,建议点赞收藏

文章目录 一、前言二、常见的库2.1 scikit-image2.2 NumPy2.3 SciPy2.4 PIL / Pillow2.5 OpenCV-Python2.6 SimpleCV2.7 Mahotas2.8 SimpleITK2.9 pgmagick2.10 Pycairo 一、前言 这些 Python 库提供了一种简单直观的方法来转换图像并理解底层数据。 今天的世界充满了数据&am…

linux【网络编程】之UDP网络程序模拟实现

linux【网络编程】之UDP网络程序模拟实现 一、开发环境二、服务端实现2.1 接口认识2.1.1 socket创建网络通信套接字2.1.2 bind&#xff1a;绑定Ip和端口号2.1.3 sockaddr_in结构体2.1.4 IP地址转换函数&#xff1a;inet_addr、inet_ntoa2.1.5 recvfrom&#xff1a;读取数据 2.2…

大语言模型进化树重磅发布,感慨技术方向选择的残酷,文末有彩蛋

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天说点有深度的内容。五一假期&#xff0c;学习了一篇论文《Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond》。 这篇论文来自 Amazon 以及 Texas A&M University 研究团队&…

【2023 · CANN训练营第一季】应用开发深入讲解——第五章 端到端案例讲解

学习资源 样例介绍 使用DVPP加速预处理网络输入&#xff0c;并通过模型转换使能静态AIPP功能&#xff0c;使能AIPP功能后&#xff0c;YUV420SP_U8格式图片转化为RGB&#xff0c;然后减均值和归一化操作&#xff0c;并将该信息固化到转换后的离线模型中&#xff0c;对ResNet50…

传统IDC服务器迁移上云流程

上云是趋势&#xff0c;越来越多企业的IDC服务器选择迁移上云&#xff0c;迁移上云的方式有很多&#xff0c;阿里云提供服务器迁移中心SMC来帮助用户迁移上云。使用SMC服务器迁移中心&#xff0c;将您的源服务器方便快捷地迁移至阿里云&#xff0c;支持的迁移源类型包括IDC服务…