【Hadoop大数据技术】——Flume日志采集系统(学习笔记)

news2024/11/25 5:04:24

📖 前言:在大数据系统的开发中,数据收集工作无疑是开发者首要解决的一个难题,但由于生产数据的源头丰富多样,其中包含网站日志数据、后台监控数据、用户浏览网页数据等,数据工程师要想将它们分门别类的采集到HDFS系统中,就可以使用Apache Flume(数据采集)系统。

在这里插入图片描述


目录

  • 🕒 1. Flume概述
  • 🕒 2. Flume运行机制
  • 🕒 3. Flume日志采集系统结构
  • 🕒 4. Flume的部署
    • 🕘 4.1 安装与配置
    • 🕘 4.2 Flume信息采集实例
  • 🕒 5. Flume的采集方案
    • 🕘 5.1 Flume Sources
    • 🕘 5.2 Flume Channels
    • 🕘 5.3 Flume Sinks
  • 🕒 6. Flume的可靠性保证
    • 🕘 6.1 负载均衡
    • 🕘 6.2 故障转移
  • 🕒 7. Flume拦截器

🕒 1. Flume概述

Flume原是Cloudera公司提供的一个高可用的、高可靠的、分布式海量日志采集、聚合和传输系统,而后纳入到了Apache旗下,作为一个顶级开源项目。Apache Flume不仅只限于日志数据的采集,由于Flume采集的数据源是可定制的,因此Flume还可用于传输大量事件数据,包括但不限于网络流量数据、社交媒体生成的数据、电子邮件消息以及几乎任何可能的数据源。

Flume自发展以来,分为两个版本,分别是Flume 0.9x版本,称为Flume-og(original generation,原始一代)和Flume 1.x版本,称为Flume-ng(next generation,下一代)。Flume-og版本由于早期设计时,存在不易扩展、代码臃肿等一系列问题,在被纳入到Apache软件基金会之后,开发人员便对其代码进行了重构,使Flume更易于使用和扩展,于是便出现了Flume-ng版本,采用三层架构,分别为agentcollector``和storage`,每一层均可以水平扩展。Flume-ng版本在实际开发中应用最为广泛,接下来,主要基于Flume-ng版本对Flume进行讲解。

🕒 2. Flume运行机制

Flume的核心是把数据从数据源(例如Web服务器)通过数据采集器(Source)收集过来,再将收集的数据通过缓冲通道(Channel)汇集到指定的接收器(Sink)。
在这里插入图片描述

Flume基本架构中有一个Agent(代理),它是Flume的核心角色,Flume Agent是一个JVM进程,它承载着数据从外部源流向下一个目标的三个核心组件:Source、Channel和Sink

  • Source:用于采集数据源的数据,并将数据写入到Channel。一个Source可以连接一个或多个Channel。
  • Channel:用于缓存Source写入的数据,并将数据写入到Sink,待Sink将数据写入到存储设备或者下一个Source之后,Flume会删除Channel中缓存的数据。
  • Sink:用于接收Channel写入的数据,并将数据写入到存储设备。

在整个数据传输过程,即Source→Channel→Sink,Flume将流动的数据封装到一个事件(Event)中,它是Flume内部数据传输的基本单元。

🕒 3. Flume日志采集系统结构

在实际开发中, Flume需要采集数据的类型多种多样,同时还会进行不同的中间操作,所以根据具体需求,可以将Flume日志采集系统分为简单结构和复杂结构。

简单结构通常应用于采集数据的数据源单一,数据内容简单,并且采集数据的存储设备单一,这时在Flume日志采集系统中,可以直接使用一个Agent来实现。
在这里插入图片描述

Flume复杂结构–多Agent:在某些实际应用场景中,Flume日志采集系统需要采集数据的数据源分布在不同的服务器上,可以再分配一个Agent来采集其他Agent从Web Server采集的日志,对这些日志进行汇总后写入到存储系统。

在这里插入图片描述

🕒 4. Flume的部署

🕘 4.1 安装与配置

在Ubuntu中直接打开网站下载:

🔎 Flume官网

建议下载稳定版本apache-flume-1.9.0-bin.tar.gz
稳定版下载地址:http://archive.apache.org/dist/flume/stable/

在这里插入图片描述

1、打开终端,解压安装包至路径 /opt,命令如下:
sudo tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /opt

2、将解压的文件夹重命名为flume并添加flume的权限

sudo mv apache-flume-1.9.0-bin/ ./flume
sudo chown -R hadoop flume

3、配置环境变量
将flume目录添加到path中,这样,启动flume就无需到/opt/flume目录下,大大的方便了flume的使用。编辑bashrc文件。

vim ~/.bashrc

请在bashrc文件中添加如下内容,如果以前添加过JDK请勿重复添加:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_371
export FLUME_HOME=/opt/flume
export FLUME_CONF_DIR=$FLUME_HOME/conf
export PATH=$FLUME_HOME/bin:$PATH

在这里插入图片描述

4、保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:

source ~/.bashrc

5、启动flume,查看flume版本,确定flume是否安装成功,命令如下:

flume-ng version

在这里插入图片描述

🕘 4.2 Flume信息采集实例

1、使用Flume接收来自AvroSource的信息
AvroSource可以发送一个给定的文件到Flume,Flume接收以后可以进行处理后显示到屏幕上。
1)在/opt/flume/conf目录下创建Agent配置文件avro.conf,命令如下。

sudo vim /opt/flume/conf/avro.conf

2)在avro.conf文件中写入如下内容

a1.sources=r1
a1.sinks=k1
a1.channels=c1
a1.sources.r1.type=avro
a1.sources.r1.channels=c1
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=4141 
a1.sinks.k1.type=logger
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

3)启动Flume Agent a1,执行如下命令启动日志控制台

flume-ng agent -c . -f /opt/flume/conf/avro.conf -n a1 -Dflume.root.logger=INFO,console

在这里插入图片描述
4)打开另外一个Linux终端,在/opt/flume目录下创建一个文件log.01,并在文件中加入一行内容“Hello Flume”,命令如下:

sudo sh -c 'echo "Hello Flume"'> /opt/flume/log.01

5)再打开另外一个Linux终端,执行如下命令:

flume-ng avro-client --conf conf -H localhost -p 4141 -F /opt/flume/log.01

在该命令中,4141是前面文件avro.conf里自定义的端口号。
执行该命令后,AvroSource就向Flume发送了一个文件log.01,切换到第3)步的日志控制台端口,就可以看到Flume已经接收到了信息,如下图所示,通过最后一行可以看出Flume已经成功接收到了“Hello Flume”。

在这里插入图片描述
2、使用Flume接收来自NetSource的信息
NetcatSource可以把用户实时输入的信息持续不断地发给Flume,Flume处理后可以显示到输出屏幕上。
1)执行如下命令,在/opt/flume/conf目录下新建test.conf代理配置文件,并写入如下内容:

sudo vim /opt/flume/conf/test.conf

写入如下内容:

a1.sources=r1
a1.sinks=k1
a1.channels=c1
a1.sources.r1.type=netcat
a1.sources.r1.bind=localhost
a1.sources.r1.port=44444 # 后面会用到该端口号
a1.sinks.k1.type=logger
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)执行如下命令启动Flume Agent a1日志控制台

flume-ng agent --conf /opt/flume/conf --conf-file /opt/flume/conf/test.conf --name a1 -Dflume.root.logger=INFO,console

在这里插入图片描述
3)再打开一个终端,输入如下命令:

telnet localhost 44444

该命令中的44444是前面自定义的test.conf文件中的端口号。执行后,出现如下图所示信息:
在这里插入图片描述

这个终端窗口称为“NetcatSource”终端窗口,在这个终端窗口中可以输入任意字符,该字符会被实时发送到Flume Agent a1,另外一个终端窗口“日志控制台”就会同步显示输入的内容,例如,在“NetcatSource”终端窗口输入“Hello Flume by HinsCoder”,如下图所示。
在这里插入图片描述

4)日志控制台终端窗口就会同步显示输入的内容,如下图所示。
在这里插入图片描述

🕒 5. Flume的采集方案

🕘 5.1 Flume Sources

在编写Flume采集方案时,首先必须明确采集的数据源类型、出处;接着,根据这些信息与Flume已提供支持的Flume Sources进行匹配,选择对应的数据采集器类型(即sources.type);再根据选择的数据采集器类型,配置必要和非必要的数据采集器属性,Flume提供并支持的Flume Sources种类如下所示。

Avro SourceThrift SourceExec Source
JMS SourceSpooling Directory SourceTwitter 1% firehose Source
Kafka SourceNetCat TCP SourceNetCat UDP Source
Sequence Generator SourceSyslog TCP SourceMultiport Syslog TCP Source
Syslog UDP SourceHTTP SourceStress Source
Avro Legacy SourceThrift Legacy SourceCustom Source
Scribe SourceTaildir Source

监听Avro端口并从外部Avro客户端流中接收event数据,当与另一个Flume Agent上的Avro Sink配对时,可创建分层集合拓扑,利用Avro Source可以实现多级流动、扇出流、扇入流等效果,Avro Source常用配置属性如下。

属性名称默认值相关说明
channels
type组件类型名需必须是avro
bind要监听的主机名或IP地址
port要监听的服务端口
threads要生成的工作线程的最大数目
sslFALSE将此设置为true以启用SSL加密,则还必须指定“keystore”和“keystore-password”
keystoreSSL所必需的通往Java秘钥存储路径
keystore-passwordSSL所必需的Java密钥存储的密码

Spooling Directory Source允许对指定磁盘上的文件目录进行监控来提取数据,它将查看文件的指定目录的新增文件,并将文件中的数据读取出来。
Spooling Directory Source常用配置属性如下表所示。

属性名称默认值相关说明
channels
type组件类型名需必须是spooldir
spoolDir从中读取文件的目录
fileSuffix.COMPLETED附加到完全摄取的文件后缀
deletePolicynever何时删除已完成的文件:never或immediate
fileHeaderFALSE是否添加存储绝对路径文件名的标头
includePattern^.*$正则表达式,指定要包含的文件
ignorePattern^$正则表达式指定要忽略的文件

Taildir Source用于观察指定的文件,几乎可以实时监测到添加到每个文件的新行。如果文件正在写入新行,则此采集器将重试采集它们以等待写入完成,Source常用配置属性如下所示。

属性名称默认值相关说明
channels
type组件类型名需必须是TAILDIR
filegroups以空格分隔的文件组列表
filegroups.文件组的绝对路径
idleTimeout120000关闭非活动文件的时间(毫秒)
writePosInterval3000写入位置文件上每个文件的最后位置的间隔时间
batchSize100一次读取和发送到通道的最大行数
backoffSleepIncrement1000当最后一次尝试未找到任何新数据时,每次重新尝试轮询新数据之间的最大时间延迟
fileHeaderFALSE是否添加存储绝对路径文件名的标头
fileHeaderKeyfile将绝对路径文件名附加到event header时使用的header关键字

HTTP Source可以通过HTTP POST和GET请求方式接收event数据,GET通常只能用于测试使用,POST请求发送的所有的events都被认为是一个批次,会在一个事务中插入channel,Taildir Source常用配置属性如下所示。

属性名称默认值相关说明
channels
type组件类型名需必须是http
port采集源要绑定的端口
bind0.0.0.0要监听绑定的主机名或IP地址
handlerorg.apache.flume.source.http.JSONHandlerhandler类的全路径名

🕘 5.2 Flume Channels

Channels通道是event在Agent上暂存的存储库,Source向Channel中添加event,Sink在读取完数据后再删除它。在配置Channels时,需要明确的就是将要传输的sources数据源类型;根据这些信息结合开发中的实际需求,选择Flume已提供的支持的Flume Channels;再根据选择的Channel类型,配置必要和非必要的Channel属性,Flume提供并支持的Flume Channels种类如下所示。

Memory ChannelJDBC ChannelKafka Channel
File ChannelSpillable Memory ChannelPseudo Transaction Channel
Custom Channel

Memory Channel会将event存储在具有可配置最大尺寸的内存队列中,适用于需要更高吞吐量的流量,但在Agent发生故障时会丢失部分阶段数据,下表为Memory Channel常用配置属性。

属性名称默认值相关说明
type组件类型名需必须是memory
capacity100存储在channel中的最大event数
transactionCapacity100channel从source接收或向sink传递的每个事务中最大event数
keep-alive3添加或删除event的超时时间(秒)
byteCapacityBufferPercentage20定义byteCapacity与channel中所有event所占百分比
byteCapacity等于JVM可用的最大内存的80%允许此channel中所有event的的最大内存字节数总和

File Channel是Flume的持久通道,它将所有event写入磁盘,因此不会丢失进程或机器关机、崩溃时的数据。File Channel通过在一次事务中提交多个event来提高吞吐量,做到了只要事务被提交,那么数据就不会有丢失,File Channel常用配置属性如下所示。

属性名称默认值相关说明
type组件类型名需必须是file
checkpointDir1~/.flume/file-channel/checkpoint检测点文件所存储的目录
useDualCheckpointsFALSE备份检测点如果设置为true,backupChec kpointDir必须设置
backupCheckpointDir备份检查点目录。此目录不能与数据目录或检查点目录相同
dataDirs~/.flume/file-channel/data数据存储所在的目录设置
transactionCapacity10000事务容量的最大值设置
checkpointInterval30000检测点之间的时间值设置(单位微秒)
maxFileSize2146435071一个单一日志的最大值设置(以字节为单位)
capacity1000000channel的最大容量
transactionCapacity10000事务容量的最大值设置

🕘 5.3 Flume Sinks

Flume Soures采集的数据通过Channels通道流向Sink中,此时Sink类似一个集结的递进中心,它需要根据需求进行配置,从而最终选择发送目的地。
配置Sinks时,明确将要传输的数据目的地、结果类型;然后根据实际需求信息,选择Flume已提供支持的Flume Sinks;再根据选择的Sinks类型,配置必要和非必要的Sinks属性。Flume提供并支持的Flume Sinks种类如下所示。

HDFS SinkHive SinkLogger Sink
Avro SinkThrift SinkIRC Sink
File Roll SinkNull SinkHBaseSink
AsyncHBase SinkMorphlineSolr SinkElasticSearch Sink
Kite Dataset SinkKafka SinkHTTP Sink
Custom Sink

HDFS Sink将event写入Hadoop分布式文件系统(HDFS),它目前支持创建文本和序列文件,以及两种类型的压缩文件,下表为HDFS Sink常用配置属性。

属性名称默认值相关说明
channel
type组件类型名需必须是hdfs
hdfs.pathHDFS目录路径
hdfs.filePrefixFlumeData为在hdfs目录中由Flume创建的文件指定前缀
hdfs.roundFALSE是否应将时间戳向下舍入
hdfs.roundValue1舍入到此最高倍数,小于当前时间
hdfs.roundUnitsecond舍入值的单位 - 秒、分钟或小时
hdfs.rollInterval30滚动当前文件之前等待的秒数
hdfs.rollSize1024触发滚动的文件大小,以字节为单位
hdfs.rollCount10在滚动之前写入文件的事件数

Logger Sink用于记录INFO级别event,它通常用于调试。Logger Sink接收器的不同之处是它不需要在“记录原始数据”部分中说明额外的配置,Logger Sink常用配置属性如下所示。

属性名称默认值相关说明
channel
type组件类型名需必须是logger
maxBytesToLog16要记录的event body的最大字节数

Avro Sink形成Flume分层收集支持的一半,发送到此接收器的Flume event转换为Avro event,并发送到对应配置的主机名/端口,event将从配置的channel中批量获取配置的批处理大小,Avro Sink常用配置属性如下所示。

属性名称默认值相关说明
channel
type组件类型名需必须是avro
hostname要监听的主机名或IP地址
port要监听的服务端口
batch-size100要一起批量发送的event数
connect-timeout20000允许第一次(握手)请求的时间量(ms)
request-timeout20000在第一个之后允许请求的时间量(ms)

🕒 6. Flume的可靠性保证

🕘 6.1 负载均衡

配置的采集方案是通过唯一一个Sink作为接收器接收后续需要的数据,但会出现当前Sink故障或数据收集请求量较大的情况,这时单一Sink配置可能就无法保证Flume开发的可靠性。因此,Flume 提供Flume Sink Processors解决上述问题。
Sink处理器允许定义Sink groups,将多个sink分组到一个实体中,Sink处理器就可通过组内多个sink为服务提供负载均衡功能。

负载均衡接收器处理器(Load balancing sink processor)提供了在多个sink上进行负载均衡流量的功能,它维护一个活跃的sink索引列表,需在其上分配负载,还支持round_robin(轮询)和random(随机)选择机制进行流量分配,默认选择机制为round_robin。Load balancing sink processor提供的配置属性如下所示。

属性名称默认值相关说明
sinks以空格分隔的参与sink组的sink列表
processor.typedefault组件类型名需必须是load_balance
processor.backoffFALSE设置失败的sink进入黑名单
processor.selectorround_robin选择机制
processor.selector.maxTimeOut30000失败sink放置在黑名单的超时时间

🕘 6.2 故障转移

故障转移接收器处理器(Failover Sink Processor)维护一个具有优先级的sink列表,保证在处理event时,只需有一个可用的sink即可。

故障转移机制工作原理是将故障的sink降级到故障池中,在池中为它们分配一个冷却期,在重试之前冷却时间会增加,当sink成功发送event后,它将恢复到活跃池中。Failover Sink Processor提供的配置属性如下所示。

属性名称默认值相关说明
sinks以空格分隔的参与sink组的sink列表
processor.typedefault组件类型名需必须是failover
processor.priority.设置sink的优先级取值
processor.maxpenalty30000失败sink的最大退避时间

🕒 7. Flume拦截器

Flume Interceptors(拦截器)用于对Flume系统数据流中event的修改操作。使用Flume拦截器时,只需参考官方配置属性在采集方案中选择性的配置即可,当涉及到配置多个拦截器时,拦截器名称间需用空格分隔,且拦截器配置顺序就是拦截顺序。Flume 1.9.0版本中,Flume提供并支持的拦截器有很多,具体如下所示。

Timestamp InterceptorHost InterceptorStatic Interceptor
Remove Header InterceptorUUID InterceptorMorphline Interceptor
Search and Replace InterceptorRegex Filtering InterceptorRegex Extractor Interceptor

Timestamp Interceptor(时间戳拦截器)将流程执行时间插入到event的header头部,此拦截器插入带有timestamp键的标头,其值为对应时间戳。若配置中已存在时间戳时,此拦截器可保留现有时间戳,Timestamp Interceptor提供的常用配置属性如下所示。

属性名称默认值相关说明
type组件类型名需必须是timestamp
headertimestamp用于放置生成的时间戳的标头的名称
preserveExistingFALSE如果时间戳已存在,是否应保留, true或false

Static Interceptor(静态拦截器)允许用户将具有静态值的静态头附加到所有event。当前不支持一次指定多个header头,但是用户可定义多个Static Interceptor来为每一个拦截器都追加一个header,Static Interceptor提供的常用配置属性如下所示。

属性名称默认值相关说明
type组件类型名需必须是static
preserveExistingTRUE如果配置的header已存在,是否应保留
keykey应创建的header的名称
valuevalue应创建的header对应的静态值

OK,以上就是本期知识点“Flume日志采集系统”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
🎉如果觉得收获满满,可以点点赞👍支持一下哟~

❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页

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

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

相关文章

四、SpringBoot3 整合 Druid 数据源

本章概要 创建程序引入依赖启动类配置文件编写编写 Controller启动测试问题解决 4.1 创建程序 4.2 引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://ww…

【03709】24年4月马克思主义基本原理概论考前密卷1

目录 1.选择题 2.简答题 3.论述题(三选二) 1.选择题

PDF转TXT ChatGPT编程

1.目的 在Z-library找到一本书&#xff0c;只不过是PDF格式的&#xff0c;看的时候体验不好&#xff0c;还没有办法保存记录&#xff0c;就想着能不能转成txt格式放到手机自带的小说软件中看。 不想去网上找相关的软件&#xff0c;可以还需要付钱&#xff0c;所以尝试用ChatGP…

CS224N第二课作业--word2vec与skipgram

文章目录 CS224N: 作业2 word2vec (49 Points)1. Math: 理解 word2vec计算 J n a i v e − s o f t m a x ( v c , o , U ) J_{naive-softmax}(v_c, o, U) Jnaive−softmax​(vc​,o,U) 关于 v c v_c vc​ 的偏导数计算 J n a i v e − s o f t m a x ( v c , o , U ) J_{na…

QAT量化 demo

一、QAT量化基本流程 QAT过程可以分解为以下步骤&#xff1a; 定义模型&#xff1a;定义一个浮点模型&#xff0c;就像常规模型一样。定义量化模型&#xff1a;定义一个与原始模型结构相同但增加了量化操作&#xff08;如torch.quantization.QuantStub()&#xff09;和反量化…

Vue3+Ant Design表格排序

最近在公司做有关报表的项目时&#xff0c;遇到最多的问题-表格排序&#xff0c;刚开始看到UI设计图的时候&#xff0c;还有些纳闷这个排序如何做&#xff0c;其实实际上并没有想象中的那么难&#xff0c;如果说单纯的排序的话ant design这个组件里的表格有自带的排序和筛选功能…

知名专业定制线缆源头工厂推荐-精工电联:智能制造线缆的前沿技术探索

优质定制线缆源头厂家推荐-精工电联&#xff1a;智能制造线缆的前沿技术探索 知名专业定制线缆源头工厂推荐-精工电联&#xff1a;智能制造线缆的前沿技 在科技飞速发展的当今时代&#xff0c;智能制造已成为工业4.0的核心驱动力。精工电联&#xff0c;作为智能制造领先的高品质…

基于Python的LSTM网络实现单特征预测回归任务(pytorch版)

一、数据集 自建数据集--【load.xlsx】。包含2列&#xff1a; date列&#xff08;时间列&#xff0c;记录2022年6月2日起始至2023年12月31日为止&#xff0c;日度数据&#xff09;price列&#xff08;价格列&#xff0c;记录日度数据对应的某品牌衣服的价格&#xff0c;浮点数…

【LAMMPS学习】八、基础知识(2.2)类型标签

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

请核对您的姓名、证件号码、有效期和年限是否选择正确,请勿使用挂失过的身份证

问题 请核对您的姓名、证件号码、有效期和年限是否选择正确&#xff0c;请勿使用挂失过的身份证 详细问题 笔者在专利业务办理系统进行新用户注册&#xff0c;注册时间为晚上大概22&#xff1a;00以后。注册时已核对姓名、证件号码、有效期和年限&#xff0c;已确保正确&…

【C++】拆分详解 - 内存管理

文章目录 前言一、C/C内存分布二、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、C内存管理方式  3.1 new/delete操作内置类型  3.2 new和delete操作自定义类型  3.3 operator new与operator delete函数 四、new和delete的实现原理  4.1 内置类型…

【Java集合】面试题汇总

Java 集合Java 集合概览1. List, Set, Queue, Map 四者的区别&#xff1f;2. ArrayList 和 Array&#xff08;数组&#xff09;的区别&#xff1f;3. ArrayList 和 Vector 的区别?4. Vector 和 Stack 的区别?&#xff08;了解即可&#xff09;5. ArrayList 可以添加 null 值吗…

python+appium调@pytest.mark.parametrize返回missing 1 required positional argument:

出错描述&#xff1a; 1、在做pythonappium自动化测试时&#xff0c;使用装饰器pytest.mark.parametrize&#xff08;“参数”&#xff0c;[值1&#xff0c;值2&#xff0c;值3]&#xff09;&#xff0c;测试脚本执行返回test_xx() missing 1 required positional argument:“…

Bitmap OOM

老机器Bitmap预读仍然OOM&#xff0c;无奈增加一段&#xff0c;终于不崩溃了。 if (Build.VERSION.SDK_INT < 21)size 2; 完整代码&#xff1a; Bitmap bitmap; try {//Log.e(Thread.currentThread().getStackTrace()[2] "", surl);URL url new URL(surl);…

通俗易懂HTTP和HTTPS区别

HTTP&#xff1a;超文本传输协议&#xff0c;它是使用一种明文的方式发送我们的内容&#xff0c;没有任何的加密&#xff0c;例如我们要在网页上输入账号密码&#xff0c;如果使用HTTP协议&#xff0c;账号密码就可能会被暴露&#xff0c;默认端口是80. HTTPS&#xff1a;是HT…

动态规划解决背包问题

目录 动态规划步骤&#xff1a; 1.01背包问题 2.完全背包问题 动态规划步骤&#xff1a; step1.分析问题&#xff0c;定义dp数组&#xff08;下标含义&#xff09; step2.初始化dp数组&#xff08;边界&#xff09; step3.写dp状态转换方程&#xff08;明确dp数组遍历顺序…

【Super数据结构】二叉搜索树与二叉树的非递归遍历(含前/中/后序)

&#x1f3e0;关于此专栏&#xff1a;Super数据结构专栏将使用C/C语言介绍顺序表、链表、栈、队列等数据结构&#xff0c;每篇博文会使用尽可能多的代码片段图片的方式。 &#x1f6aa;归属专栏&#xff1a;Super数据结构 &#x1f3af;每日努力一点点&#xff0c;技术累计看得…

【饿了么笔试题汇总】[全网首发]2024-04-12-饿了么春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新饿了么近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x…

.cur 鼠标光标文件读取

备份icon掩码开发代码-CSDN博客 代码改写自 目前bug是高度不足&#xff0c;顶上的几十个像素图片打印需要加常数&#xff0c; i的改写是 i/3,参考上面链接的自简书的代码 #include <stdio.h> #include <windows.h> #pragma warning(disable : 4996) // visu…

[lesson20]初始化列表的使用

初始化列表的使用 类成员的初始化 C中提供了初始化列表对成员变量进行初始化 语法规则 注意事项 成员的初始化顺序与成员的声明顺序相同成员的初始化顺序与初始化列表中的位置无关初始化列表先于构造函数的函数体执行 类中的const成员 类中的const成员会被分配空间的类中…