Flume使用入门

news2024/9/23 17:20:22

目录

一. Flume简单介绍

1. Agent

2. Source 

3. Sink 

4. Channel 

5. Event

二. 环境安装

1. 创建日志目录

2. 修改日志配置文件

3.修改运行堆内存

4. 确定日志打印的位置

5. 修改flume使用内存 内存调大

三. 校验flume

1. 安装netcat工具和net-tools工具

2. 判断44444端口是否被占用,选择一个没有被占用的端口用于数据接收

3. 在配置conf目录下创建数据采集的配置文件nc_to_log.conf文件

4. 修改配置内容

5. 启动Flume

6.发送数据验证

四 .各种常用的场景配置

1.组件

2. source配置

2.1. 文件

2.2 Avro

3. channel配置

3.2. 文件 File Channel

4. sink配置

4.1. HDFS

4.2. 网路端口Avro

4.3. 文件File Roll

4.4. 控制台

4.5. 自定义Sink

5. 组装

5.1. 最简 一对一组装

5.2. 一对多组装

5.3. 路由

五. 自定义开发

1.source开发

2.sink开发

六. 完整示例

1. 采集端口数据到控制台

2. 采集端口数据将部分数据发送到控制台,另一部分发送到其他端口 

七. Flume监控工具Ganglia (web  gmetad gmod)

1. 部署Flume节点

2. 部署监控节点

2.1. 修改配置文件ganglia.conf

2.2. 修改配置文件gmetad

2.3. 修改配置文件config

2.4. 重启selinux 本次生效关闭必须重启

2.5. 赋值ganglia使用权限

3. 启动监控

3.1. 在所有节点上启动gmond

3.2.  在web监控节点上启动httpd和gmetad

4.发送数据监控结果

八. 数据传输截断bug

1.创建类org.apache.flume.serialization.LineDeserializer

2.编译成class文件

3.覆盖LineDeserializer.class文件

4.覆盖flume-ng-core


一. Flume简单介绍

        Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单,由java源码编写,可通过java自定义扩展

Flume     官网地址    各个版本点击下载           下面安装用的是版本1.9.0

        Flume由三部分组成,SourceChannelSink

1. Agent

        Agent是一个由Flume启动的JVM进程,它以事件的形式将数据从源头送至目的地。Agent主要有3个部分组成,SourceChannelSink

2. Source 

        负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据

3. Sink 

        不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent

4. Channel 

        Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作

5. Event

        传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event由HeaderBody两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组

二. 环境安装

解压后修改配置文件

1. 创建日志目录

mkdir <flume_home>/logs

2. 修改日志配置文件

vim <flume_hme>/conf/log4j.properties

3.修改运行堆内存

mv <flume_hme>/conf/flume-env.sh.template <flume_hme>/conf/flume-env.sh
vim<flume_hme>/conf/flume-env.sh

 增加缓存Channel 的堆内存

export JAVA_OPTS="-Xms4000m -Xmx4000m -Dcom.sun.management.jmxremote"

4. 确定日志打印的位置

#flume.root.logger=DEBUG,console  console表示输出到控制台
flume.root.logger=INFO,LOGFILE
flume.log.dir=/home/tools/flume/flume-1.9.0/logs
flume.log.file=flume.log

5. 修改flume使用内存 内存调大

vim <flume_home>/bin/flume-ng
JAVA_OPTS="-Xms4096m -Xmx4096m -Dcom.sun.management.jmxremote"

安装完成

三. 校验flume

        使用Flume监听一个端口,收集该端口数据,并打印到控制台

1. 安装netcat工具和net-tools工具

yum install -y nc
yum install net-tools -y

2. 判断44444端口是否被占用,选择一个没有被占用的端口用于数据接收

netstat -nlp | grep 44444

3. 在配置conf目录下创建数据采集的配置文件nc_to_log.conf文件

vim conf/nc_to_log.conf

4. 修改配置内容

# 组件定义
a1.sources = r1
a1.channels = c1
a1.sinks = k1

# sources配置
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

# sink配置
a1.sinks.k1.type = logger

# channels配置
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 连接组件
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

5. 启动Flume

bin/flume-ng agent -c conf/ -n a1 -f conf/nc_to_log.conf -Dflume.root.logger=console

        启动命令中 a1是采集数据配置文件中定义的agent的名称

        启动参数解释

--conf/-c

配置文件存储在conf/目录  系统会去这个目录下

读取系统配置 例如:日志配置 脚本等

--name/-n表示给agent起名为a1
--conf-file/-f

flume本次启动读取的agent配置文件

是在conf文件夹下的nc-flume-log.conf文件

-Dflume.root.logger=console-D表示flume运行时动态修改参数属性值打印控制台

6.发送数据验证

nc localhost 44444

四 .各种常用的场景配置

        官方文档 点击官

1.组件

# 组件定义 agent为a1 sources为r1,sinks为k1,hannels为c1,可以配置多个例如 sources = r1 r2,使用逗号隔开
a1.sources = r1
a1.channels = c1
a1.sinks = k1

2. source配置

2.1. 文件

# 必选 指定类型为文件采集
a1.sources.r1.type = TAILDIR
# 必选 指定采集的多个组,每个组个可以对应一个路径
a1.sources.r1.filegroups = f1 f2
# 必选 指定组采集的文件路径,必须精确到文件,可以写匹配表达式匹配多个文件
a1.sources.r1.filegroups.f1 = /home/myuser/data/2022/2022.*.log
a1.sources.r1.filegroups.f2 = /home/myuser/data/2023/2023.*.log
# 可选 断点续传配置
a1.sources.r1.positionFile = /home/myuser/data/tmp/taildir.json

2.2 Avro

# 必选 类型向avro网络端口接收
a1.sources.r1.type = avro
# 必选 发送主机
a1.sources.r1.bind = localhost
# 必选 发送端口
a1.sources.r1.port = 4444
# 可选 数据发送线程数
a1.sources.r1.threads = 4

3. channel配置

3.1. 内存 Memory Channel

#必选 channels配置类型为内存
a1.channels.c1.type = memory
#可选 缓存中存储的最大数据量
a1.channels.c1.capacity = 1000
#可选 通道在每个事务中从源获取或提供给接收器的最大事件数
a1.channels.c1.transactionCapacity = 100

3.2. 文件 File Channel

# 必选 channels配置类型为文件
a1.channels.c1.type = file
# 可选 缓存位置
a1.channels.c1.checkpointDir = /home/myuser/data/channel/checkpoint
# 可选 是否备份检查点,如果不备份,不用配置备份目录
a1.channels.c1.useDualCheckpoints = true
# 可选 检查点备份的目录
a1.channels.c1.backupCheckpointDir = /home/myuser/data/channel/backup
# 可选 存储日志文件的目录列表
a1.channels.c1.dataDirs = /home/myuser/data/channel/data
# 可选 传输最大支持的事物大小
a1.channels.c1.transactionCapacity = 10000
# 可选 检查点时间间隔 毫秒
a1.channels.c1.checkpointInterval = 30000
# 可选 单个日志文件最大容量
a1.channels.c1.maxFileSize = 2146435071

3.3. 自定义Source

package com.filtrer.flume;
import org.apache.flume.Context;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.PollableSource;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.SimpleEvent;
import org.apache.flume.source.AbstractSource;
import java.util.HashMap;
import java.util.UUID;
public class MySource extends AbstractSource implements Configurable, PollableSource {
    //定义配置文件将来要读取的字段
    private String param;
    //初始化配置信息
    @Override
    public void configure(Context context) {param = context.getString("param", "msg");}
    @Override
    public Status process() throws EventDeliveryException {
        try {
            HashMap<String, String> header = new HashMap<>();//创建事件头信息
            SimpleEvent event = new SimpleEvent();//创建事件
            //循环封装事件
            for (int i = 0; i < 100; i++) {
                event.setHeaders(header);//给事件设置头信息
                event.setBody((param + UUID.randomUUID()).getBytes());//给事件设置内容
                getChannelProcessor().processEvent(event);//将事件写入 channel,循环量推荐与transactionCapacity保持一直,默认100
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Status.BACKOFF;
        }
        return Status.READY;
    }
    @Override
    public long getBackOffSleepIncrement() {return 0;}

    @Override
    public long getMaxBackOffSleepInterval() {return 0;}
}

4. sink配置

4.1. HDFS

# 必选 类型为HDFS
a1.sinks.k1.type = hdfs
# 必选 HDFS存储路径目录,hdfs的HA模式 可以使用hdfs-site.xml文件的dfs.nameservices的名称替换ip:端口需要hdfs的配置目录文件
a1.sinks.k1.hdfs.path = hdfs://node2:8020/flume/%Y%m%d/%H_%M
#a1.sinks.k1.hdfs.path = hdfs://mycluster/flume/%Y%m%d/%H_%M
# 可选 存储文件前缀后缀配置
a1.sinks.k1.hdfs.filePrefix =
a1.sinks.k1.hdfs.fileSuffix = .log
# 可选 临时文件前缀后缀配置
a1.sinks.k1.hdfs.inUsePrefix =
a1.sinks.k1.hdfs.inUseSuffix = .tmp
# 可选 压缩格式 gzip, bzip2, lzo, lzop, snappy
a1.sinks.k1.hdfs.codeC =
# 文件类型 分为二进制文件SequenceFile 文本文件DataStream(不能压缩) CompressedStream(可以压缩)
a1.sinks.k1.hdfs.fileType = DataStream
# 可选 是否将时间记录为sink写入hdfs的时刻
a1.sinks.k1.hdfs.useLocalTimeStamp = true
# 可选 临时文件等待多少秒后滚动文件  (滚动含义:将临时文件转化为存储文件,并重新创建临时文件)
a1.sinks.k1.hdfs.rollInterval = 30
# 可选 临时文件大小达到多少字节后滚动,推荐配置一个hdfs块大小
a1.sinks.k1.hdfs.rollSize = 67108864
# 可选 临时文件数据量达到多少条后滚动,0表示与数据量无关
a1.sinks.k1.hdfs.rollCount = 10

flume1.9.0连接hadop3.1.3会报错 报错信息为

ERROR - org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:459)] process failed
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

这是因为flume内依赖的guava.jar和hadoop内的版本不一致造成的。
查看hadoop安装目录下share/hadoop/common/lib内guava.jar版本与flume安装目录下lib内guava.jar的版本,如果两者不一致,删除版本低的,并拷贝高版本过去。

4.2. 网路端口Avro

# 必选 类型为向avro网络端口传输数据
a1.sinks.k1.type = avro
# 必选 传输主机
a1.sinks.k1.hostname = localhost
# 必选 传输端口
a1.sinks.k1.port = 4444
# 可选 批处理数据量
a1.sinks.k1.batch-size = 100
# 可选 第一次连接超时时间(毫秒)
a1.sinks.k1.connect-timeout = 20000
# 可选 传输数据超时时间(毫秒)
a1.sinks.k1.request-timeout = 20000

4.3. 文件File Roll

# 必选 类型为写入本地目录(会生成空文件 不适用)
a1.sinks.k1.type = file_roll
# 必选 写入目录配置
a1.sinks.k1.sink.directory = /home/myuser/data
# 可选 滚动时间间隔
a1.sinks.k1.sink.rollInterval = 30
# 可选 批处理数据量大小
a1.sinks.k1.sink.batchSize = 100

4.4. 控制台

# 必选 直接打印到控制台
a1.sinks.k1.type = logger

4.5. 自定义Sink

# 必选 实现AbstractSink接口,通过getChannel方法获取数据
a1.sinks.k1.type = com.filtrer.flume.MySink
# 配置的param参数,可以在自定义实现类中获取
a1.sinks.k1.param = message

5. 组装

5.1. 最简 一对一组装

#sources r1
#channel c1
#sinks   k1
# 连接组件 r1-> c1  k1 <- c1 即 r1-> c1 -> k1
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

5.2. 一对多组装

# sources r1
# channel c1 c2
# sinks   k1 k2
# 数据存两份分别到c1和c2
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

5.3. 路由

通过代码自定义拦截规则路由分发

pom坐标

<dependencies>
    <dependency>
        <groupId>org.apache.flume</groupId>
        <artifactId>flume-ng-core</artifactId>
        <version>1.9.0</version>
    </dependency>
</dependencies>

拦截器代码打包上传<flume_home>/lib目录下

package com.filtrer.flume;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.List;
import java.util.Map;
public class MyInterceptor implements Interceptor {
    public static class MyBuilder implements Interceptor.Builder{
        @Override
        public Interceptor build() {return new MyInterceptor();}
        @Override
        public void configure(Context context) {}
    }
    @Override
    public void initialize() {}
    @Override
    public Event intercept(Event event) {//配合选择器往header中添加key key的名字叫my_key  value有type_number/default default表示默认
        byte[] body = event.getBody();//获取数据
        Map<String, String> headers = event.getHeaders();//获取header
        if(body[0] >= '0' && body[0] <= '9'){headers.put("my_key","type_number");}
        return event;
    }
    @Override
    public List<Event> intercept(List<Event> list) {
        for (Event event : list) {intercept(event);}return list;
    }
    @Override
    public void close() {}
}
# sources 	r1
# channels	c1 c2
# sinks		k1 k2
# 连接组件
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2
# 可选 对需要发送的channels使用什么分发策略(默认 复制replication)/(路由multiplexing)  配置了路由需要指定路由规则以及规则以及拦截器
a1.sources.r1.selector.type = multiplexing
# 路由规则 my_key 代码中声明了
a1.sources.r1.selector.header = my_key
# 路由1 type_number 代码编写命中规则
a1.sources.r1.selector.mapping.type_number = c1
# 路由2 default 默认未命中的走向
a1.sources.r1.selector.default = c2
# 拦截器名称
a1.sources.r1.interceptors = my_interceptors
# 拦截器对应的class类  将类名中的"."修改为"$"
a1.sources.r1.interceptors.my_interceptors.type = com.filtrer.flume.MyInterceptor$MyBuilder

Flume支持的数据传输形式

 

五. 自定义开发

        导入pom坐标

<dependencies>
    <dependency>
        <groupId>org.apache.flume</groupId>
        <artifactId>flume-ng-core</artifactId>
        <version>1.9.0</version>
    </dependency>
</dependencies>

1.source开发

2.sink开发

package com.filtrer.flume;

import org.apache.flume.*;
import org.apache.flume.conf.Configurable;
import org.apache.flume.sink.AbstractSink;

public class MySink extends AbstractSink implements Configurable {
    private String param;
    @Override
    public void configure(Context context) {
        param= context.getString("param", "msg");//获取配置内容并设置默认值
    }
    @Override
    public Status process() throws EventDeliveryException {
        Channel channel = getChannel();//获取Channel并开启事务
        Transaction transaction = channel.getTransaction();
        transaction.begin();
        try {
            Event event;//抓取数据
            while (true) {
                event = channel.take();
                if (event != null) {break;}
            }
            //处理数据
            System.out.println(String.format("%s %s",param,new String(event.getBody())));
            transaction.commit();//提交事务
            return Status.READY;
        } catch (Exception e) {//异常回滚事物
            transaction.rollback();
            return Status.BACKOFF;
        } finally {
            transaction.close();
        }
    }
}

六. 完整示例

1. 采集端口数据到控制台

# 组件定义
a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = avro
# # 必选 发送主机
a1.sources.r1.bind = node1
# # 必选 发送端口
a1.sources.r1.port = 55555
# # 可选 数据发送线程数

# sink配置
a1.sinks.k1.type = logger

# channels配置
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 连接组件
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

2. 采集端口数据将部分数据发送到控制台,另一部分发送到其他端口 

# 组件定义
a1.sources = r1
a1.channels = c1 c2
a1.sinks = k1 k2

# sources配置
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

a1.channels.c1.type = memory
a1.channels.c2.type = memory

a1.sinks.k1.type = logger

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = node1
a1.sinks.k2.port = 55555

# 连接组件
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

# 拦截器
a1.sources.r1.selector.type = multiplexing
# 路由规则 my_key 代码中声明了
a1.sources.r1.selector.header = my_key
# 路由1 type_number 代码编写命中规则
a1.sources.r1.selector.mapping.type_number = c1
# 路由2 default 默认未命中的走向
a1.sources.r1.selector.default = c2
# 拦截器名称
a1.sources.r1.interceptors = my_interceptors
# 拦截器对应的class类  将类名中的"."修改为"$"
a1.sources.r1.interceptors.my_interceptors.type = com.filtrer.flume.MyInterceptor$MyBuilder

七. Flume监控工具Ganglia (web  gmetad gmod)

        在所有部署flume节点的机器上安装gmod用于采集监控数据,在单独的整体监控节点上安装web  gmetad用于整合信息并web可视化

部署方式

节点名称部署内容host
Flume节点1gmod flumenode1
Flume节点2gmod flumenode2
......gmod flumenode*
Flume节点9gmod flumenode9
Flume监控节点gmod gmetad  web node10

1. 部署Flume节点

先在所有要部署的节点上安装epel-release依赖

yum -y install epel-release

所有节点安装gmond 并修改配置文件gmond.conf

yum -y install ganglia-gmond
vim /etc/ganglia/gmond.conf 

修改所有节点的配置内容如下

cluster {

  name = "web展示节点的host"

  owner = "unspecified"

  latlong = "unspecified"

  url = "unspecified"

}

udp_send_channel {

  #bind_hostname = yes # Highly recommended, soon to be default.

                       # This option tells gmond to use a source address

                       # that resolves to the machine's hostname.  Without

                       # this, the metrics may appear to come from any

                       # interface and the DNS names associated with

                       # those IPs will be used to create the RRDs.

  # mcast_join = 239.2.11.71

  # 数据发送给web展示节点

  host = node10

  port = 8649

  ttl = 1

}

udp_recv_channel {

  # mcast_join = 239.2.11.71

  port = 8649

  # 接收来自任意连接的数据

  bind = 0.0.0.0

  retry_bind = true

  # Size of the UDP buffer. If you are handling lots of metrics you really

  # should bump it up to e.g. 10MB or even higher.

  # buffer = 10485760

}

2. 部署监控节点

安装

yum -y install ganglia-gmetad
yum -y install ganglia-web

2.1. 修改配置文件ganglia.conf

vim /etc/httpd/conf.d/ganglia.conf
Alias /ganglia /usr/share/ganglia
<Location /ganglia>
  Require all granted
</Location> 

2.2. 修改配置文件gmetad

vim /etc/ganglia/gmetad.conf
# 修改为当前节点
data_source "node10" node10

2.3. 修改配置文件config

vim /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

2.4. 重启selinux 本次生效关闭必须重启

setenforce 0

2.5. 赋值ganglia使用权限

chmod -R 777 /var/lib/ganglia

3. 启动监控

3.1. 在所有节点上启动gmond

systemctl  start gmond

3.2.  在web监控节点上启动httpd和gmetad

systemctl start httpd
systemctl start gmetad

 访问 http://node3/gangliahttp://node3/ganglia

4.发送数据监控结果

监控需要flume启动任务的时候指定监控节点,将flume的信息发送到监控节点上 


指定使用什么工具监控
-Dflume.monitoring.type=ganglia
监控数据发往哪一台节点-Dflume.monitoring.hosts=node10:8649
bin/flume-ng agent -c conf/ -n a1 -f conf/nc-flume-log.conf -Dflume.monitoring.type=ganglia -Dflume.monitoring.hosts=node10:8649

八. 数据传输截断bug

        数据传输过程中,一条数据的大小超过默认大下2048字节,这一条数据会被拆成两条数据,导致数据格式异常

处理方法,修改类LineDeserializer

位置  org.apache.flume.serialization.LineDeserializer

1.创建类org.apache.flume.serialization.LineDeserializer

        复制LineDeserializer之前的代码,并修改MAXLINE_DFLT参数,数值调大,保证数据不断的长度

2.编译成class文件

javac LineDeserializer.java

3.覆盖LineDeserializer.class文件

        将编译完成的class文件放入flume-ng-core-1.9.0.jar包中,替换这个包之前的LineDeserializer类

4.覆盖flume-ng-core

        用这个被修改的core包替换linux服务器中 目录<flume_home>/lib下的flume-ng-core包

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

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

相关文章

MySQL服务端与客户端之间的连接过程

服务器程序和客户端程序本质上是两个进程&#xff0c;所以连接过程的本质就是两个进程直接的通信&#xff0c;MySQL支持下面三种方式来进行通信。一&#xff1a;TCP/IP数据库服务器进程和客户端进程可能运行在不同的主机中&#xff0c;需要通过网络来进行通信二&#xff1a;命名…

初识scrapy

认识scrapyscrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;我们只需实现少量的代码&#xff0c;就能实现数据的快速抓取scrapy使用了Twisted异步网络架构&#xff0c;可以加快下载速度 pip install twisted安装&#xff1a;pip install s…

进程控制(详解)

进程控制上篇文章介绍了进程的相关概念&#xff0c;形如进程的内核数据结构task_struct 、进程是如何被操作系统管理的、进程的查看、进程标识符、进程状态、进程优先级、已经环境变量和进程地址空间等知识点&#xff1b; 本篇文章接着上篇文章继续对进程的控制进行展开&#x…

Spark 内存运用

RDD Cache 当同一个 RDD 被引用多次时&#xff0c;就可以考虑进行 Cache&#xff0c;从而提升作业的执行效率 // 用 cache 对 wordCounts 加缓存 wordCounts.cache // cache 后要用 action 才能触发 RDD 内存物化 wordCounts.count// 自定义 Cache 的存储介质、存储形式、副本…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.04-03.10 #12场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01;更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考&#xff0c;以比赛官网为准目录2023-03-04&…

从100%进口到自主可控,从600块降到10块,中科院攻克重要芯片

前言 2月28日&#xff0c;“20多位中科院专家把芯片价格打到10块”冲上微博热搜&#xff0c;据河南省官媒大象新闻报道&#xff0c;热搜中提到的中科院专家所在企业为全球最大的PLC分路器芯片制造商仕佳光子&#xff0c;坐落于河南鹤壁。 为实现芯片技术自主可控自立自强&#…

根据栅格数据的范围和像元大小生成等比例的矢量数据

为啥会有这么一个需求呢&#xff0c;后面要是继续写的话会详细说&#xff0c;首先是有一个栅格数据&#xff0c;比如这样的&#xff1a;我的目标是这样的&#xff08;矢量&#xff09;&#xff0c;就是这样&#xff0c;上面的栅格数据像大小是2*2的&#xff0c;直接上代码&…

【JAVA程序设计】【C00109】基于SSM(非maven)的员工工资管理系统

基于SSM&#xff08;非maven&#xff09;的员工工资管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架非maven开发的企业工资管理系统共分为二个角色&#xff1a;系统管理员、员工 管理员角色包含以下功能&#xff1a; 系统后台登陆、管理员管理、员工信…

Linux基础命令-nice调整进程的优先级

文章目录 Nice 命令介绍 语法格式 常用参数 参考实例 1 调整bash的优先级为-10 2 调整脚本的优先级为6 3 调整指令的优先级 4 默认使用nice命令调整优先级 命令总结 Nice 命令介绍 nice命令的主要功能是用于调整进程的优先级&#xff0c;合理分配系统资源。Linux系…

torchaudio的I/O函数

info、load、save1.1 infotorchaudio.info(filepath: str, ...)Fetch meta data of an audio file. Refer to torchaudio.backend for the detail.返回音频文件的meta信息这里的meta元信息包括采样率、帧数、通道数、量化位数、音频格式info torchaudio.info(rE:\adins\data\2…

Java使用DFA算法实现敏感词过滤

1 前言敏感词过滤就是你在项目中输入某些字&#xff08;比如输入xxoo相关的文字时&#xff09;时要能检测出来&#xff0c;很多项目中都会有一个敏感词管理模块&#xff0c;在敏感词管理模块中你可以加入敏感词&#xff0c;然后根据加入的敏感词去过滤输入内容中的敏感词并进行…

测试软件5

一 css基础 css定义&#xff1a;可以设置网页中的样式&#xff0c;外观&#xff0c;美化 css中文名字&#xff1a;级联样式表&#xff0c;层叠样式表&#xff0c;样式表 二 css基础语法 1.style标签写在title标签后面 2.选择器{属性名1&#xff1a;属性值1&#xff1b;属性名…

ChatGPT最牛应用,让它帮你更新网站新闻吧!

谁能想到&#xff0c;ChatGPT火了&#xff01;既能对话入流&#xff0c;又能写诗歌论文、出面试题、编代码&#xff0c;甚至还通过了谷歌面试拿到L3工程师offer&#xff0c;放在一年之前&#xff0c;没人相信这是当前AI能够达到的水平。ChatGPT自面世以来&#xff0c;凭借其极为…

【数据结构初阶】手把手带你实现栈

前言 在进入数据结构初阶的学习之后&#xff0c;我们学习了顺序表和链表&#xff0c;当然栈也是一种特殊的数据结构&#xff0c;他的特点是后进先出。 栈的概念及结构 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。限定仅在表尾进行插入和删…

iptables的介绍

iptables简介 1、 什么是iptables&#xff1f; iptables是linux防火墙工作在用户空间的管理工具&#xff0c;是 netfilter/iptables IP信息包过滤系统的一部分&#xff0c;用来设置、维护和检查Linux内核的IP数据包过滤规则 2、 iptables特点 iptables是基于内核的防火墙&…

【pytorch 入门系列】02 手把手多分类从0到1

温故而知新&#xff0c;通过手把手写一个多分类任务来复习之前所学过的知识。 前置知识 factorize的妙用&#xff1a;把文本数据枚举化 labels, uniques pd.factorize([b, b, a, c, b]) labels,uniques(array([0, 0, 1, 2, 0]), array([‘b’, ‘a’, ‘c’], dtypeobject))…

【C++】-- 特殊类设计

对于类的思维境界提升&#xff0c;没有太大的实际意义&#xff0c;但是锻炼思想。 目录 单例模式 饿汉模式 懒汉模式 #&#xff1a;请设计一个类&#xff0c;不能被拷贝。 拷贝只会发生在两个场景中&#xff1a;拷贝构造函数赋值运算符重载因此想要让一个类禁止拷贝&#xf…

对称锥规划:对称锥的增广拉格朗日乘子法(Semi-Smooth Newton Method解无约束优化子问题)

文章目录对称锥规划&#xff1a;对称锥的增广拉格朗日乘子法&#xff08;Semi-Smooth Newton Method解无约束优化子问题&#xff09;对称锥的增广拉格朗日函数Semi-Smooth Newton Method半光滑牛顿法广义雅可比半光滑性半光滑牛顿算法参考文献对称锥规划&#xff1a;对称锥的增…

2023年最新阿里云服务器价格表出炉(精准收费标准及配置价格表)

阿里云在全球率先宣布了基于 Intel Ice Lake 处理器的第七代云服务器ECS&#xff0c;性能提升的同时降低了报价&#xff0c;性价比更高了。进入2023年阿里云服务器价格依然是大家关心的问题&#xff0c;事实上阿里云服务器租用价格和最新收费标准都可以通过官方云服务器计算器来…

【IoT】智能烟雾报警器

设计简介 硬件设计由AT89C51单片机、DS18B20温度传感器、4位共阳数码管、电源模块、报警模块、按键模块、MQ-2烟雾检测模块和ADC0832模数转换模块组成。 烟雾传感器MQ-2检测空气中的烟雾气体&#xff0c;通过ADC0832进行数据转换&#xff0c;经过单片机的运算处理后在数码管上…