Spark(46) -- SparkStreaming整合kafka数据源
1. 回顾 Kafka
可以看我前面kafka文章
核心概念图解
- Broker : 安装Kafka服务的机器就是一个broker
- Producer :消息的生产者,负责将数据写入到broker中(push)
- Consumer:消息的消费者,负责从kafka中拉取数据(pull),老版本的消费者需要依赖zk,新版本的不需要
- Topic: 主题,相当于是数据的一个分类,不同topic存放不同业务的数据 --主题:区分业务
- Replication:副本,数据保存多少份(保证数据不丢失) --副本:数据安全
- Partition:分区,是一个物理的分区,一个分区就是一个文件,一个Topic可以有1~n个分区,每个分区都有自己的副本 --分区:并发读写
- Consumer Group:消费者组,一个topic可以有多个消费者/组同时消费,多个消费者如果在一个消费者组中,那么他们不能重复消费数据 --消费者组:提高消费者消费速度、方便统一管理
注意:
- 一个Topic可以被多个消费者或者组订阅,一个消费者/组也可以订阅多个主题
- 读数据只能从Leader读, 写数据也只能往Leader写,Follower会从Leader那里同步数据过来做副本!!!
Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用与大数据实时处理领域。
- 消息队列:Kafka 本质上是一个 MQ(Message Queue),使用消息队列的好处?(面试会问):
- 解耦:允许我们独立的扩展或修改队列两边的处理过程;
- 可恢复性:即使一个处理消息的进程挂掉,加入队列中的消息仍可以在系统恢复后被处理;
- 缓冲:有助于解决生产消息和消费消息的处理速度不一致的情况;
- 灵活性&峰值处理能力:不会因为突发的超负荷的请求而完全崩溃,消息队列能够使关键组件顶住突发的访问压力;
- 异步通信:消息队列允许用户把消息放入队列但不立即处理它;
- 发布/订阅模式:
一对多,生产者将消息发布到 Topic 中,有多个消费者订阅该主题,发布到 Topic 的消息会被所有订阅者消费,被消费的数据不会立即从 Topic 清除。
Apache Kafka: 最原始功能【消息队列】,缓冲数据,具有发布订阅功能(类似微信公众号)。
kafka文档
-
Kafka Connect:
connect
connect-jdbc -
Kafka Stream:
streams
streaming-kafka-integration -
kafka monitor:
monitoring
KafkaOffsetMonitor
kafka-manager -
kafka生态圈:
Ecosystem -
SparkStreaming整合Kafka
streaming-kafka-integration
2. 集成方式
Spark Streaming与Kafka集成,有两套API,原因在于Kafka Consumer API有两套,文档:http://spark.apache.org/docs/2.4.5/streaming-kafka-integration.html。
- 方式一:Kafka 0.8.x版本
- 老的Old Kafka Consumer API
- 文档:streaming-kafka-0-8-integration
- 老的Old消费者API,有两种方式:
- 第一种:高级消费API(Consumer High Level API),Receiver接收器接收数据
- 第二种:简单消费者API(Consumer Simple Level API) ,Direct 直接拉取数据
- 方式二:Kafka 0.10.x版本
- 新的 New Kafka Consumer API
- 文档:streaming-kafka-0-10-integration
- 核心API:KafkaConsumer、ConsumerRecorder
3. 两种方式区别
使用Kafka Old Consumer API集成两种方式,虽然实际生产环境使用Direct方式获取数据,但是在面试的时候常常问到两者区别。
文档:http://spark.apache.org/docs/2.4.5/streaming-kafka-0-8-integration.html
- Receiver-based Approach:
- 基于接收器方式,消费Kafka Topic数据,但是企业中基本上不再使用;
- Receiver作为常驻的Task运行在Executor等待数据,但是一个Receiver效率低,需要开启多个,再手动合并数据(union),再进行处理,很麻烦;
- Receiver那台机器挂了,可能会丢失数据,所以需要开启WAL(预写日志)保证数据安全,那么效率又会降低;
- Receiver方式是通过zookeeper来连接kafka队列,调用Kafka高阶API,offset存储在zookeeper,由Receiver维护;
- Spark在消费的时候为了保证数据不丢也会在Checkpoint中存一份offset,可能会出现数据不一致;
- Direct Approach (No Receivers):
- 直接方式,Streaming中每批次的每个job直接调用Simple Consumer API获取对应Topic数据,此种方式使用最多;
- Direct方式是直接连接kafka分区来获取数据,从每个分区直接读取数据大大提高并行能力
- Direct方式调用Kafka低阶API(底层API),offset自己存储和维护,默认由Spark维护在checkpoint中,消除了与zk不一致的情况 ;
- 当然也可以自己手动维护,把offset存在MySQL、Redis和Zookeeper中;
上述两种方式区别,如下图所示:
4. 整合Kafka两种模式说明
开发中我们经常会利用SparkStreaming实时地读取kafka中的数据然后进行处理,在spark1.3版本后,kafkaUtils里面提供了两种创建DStream的方法:
- Receiver接收方式:
KafkaUtils.createDstream(开发中不用,了解即可,但是面试可能会问)
Receiver作为常驻的Task运行在Executor等待数据,但是一个Receiver效率低,需要开启多个,再手动合并数据(union),再进行处理,很麻烦Receiver那台机器挂了,可能会丢失数据,所以需要开启WAL(预写日志)保证数据安全,那么效率又会降低!
Receiver方式是通过zookeeper来连接kafka队列,调用Kafka高阶API,offset存储在zookeeper,由Receiver维护。
spark在消费的时候为了保证数据不丢也会在Checkpoint中存一份offset,可能会出现数据不一致,所以不管从何种角度来说,Receiver模式都不适合在开发中使用了,已经淘汰了 - Direct直连方式:
KafkaUtils.createDirectStream(开发中使用,要求掌握)
Direct方式是直接连接kafka分区来获取数据,从每个分区直接读取数据大大提高了并行能力
Direct方式调用Kafka低阶API(底层API),offset自己存储和维护,默认由Spark维护在checkpoint中,消除了与zk不一致的情况
当然也可以自己手动维护,把offset存在mysql、redis中
所以基于Direct模式可以在开发中使用,且借助Direct模式的特点+手动操作可以保证数据的Exactly once 精准一次
- 扩展:关于消息语义
实现方式 | 消息语义 | 存在的问题 |
---|---|---|
Receiver | at most once 最多被处理一次 | 会丢失数据 |
Receiver+WAL | at least once 最少被处理一次 | 不会丢失数据,但可能会重复消费,且效率低 |
Direct+手动操作 | exactly once 只被处理一次/精准一次 | 不会丢失数据,也不会重复消费,且效率高 |
- 注意:
开发中SparkStreaming和kafka集成有两个版本:0.8及0.10+
0.8版本有Receiver(zookeeper)和Direct(topic)模式(但是0.8版本生产环境问题较多,在Spark2.3之后不支持0.8版本了)
0.10以后只保留了direct模式(Reveiver模式不适合生产环境),并且0.10版本API有变化(更加强大)
streaming-kafka-integration
5. [了解]Apache Kafka数据源0.8版本对接方式
kafka作为一个实时的分布式消息队列,实时的生产和消费消息,这里我们可以利用SparkStreaming实时地读取kafka中的数据,然后进行相关计算。
在Spark1.3版本后,KafkaUtils里面提供了两个创建dstream的方法,一种为KafkaUtils.createDstream,另一种为KafkaUtils.createDirectStream。
官方文档说明
streaming-kafka-integration
5.1 回顾kafka的安装与使用
参考前面kafka安装部署
5.1.1 三台机器安装zookeeper
5.1.2 三台机器安装kafka集群
5.1.2.1 下载kafka安装压缩包
kafka
5.1.2.2 上传压缩包并解压
将kafka的安装包上传到第一台服务器的/export/softwares路径下面去,然后解压到/export/servers
这里统一使用kafka_2.11-1.0.0.tgz 这个版本
5.1.2.3 修改kafka配置文件
第一台机器修改kafka配置文件server.properties
broker.id=0
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/export/server/kafka/kafka-logs
num.partitions=2
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.flush.interval.messages=10000
log.flush.interval.ms=1000
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=node1:2181,node2:2181,node3:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
delete.topic.enable=true
host.name=node1
第二台机器修改kafka配置文件server.properties
broker.id=1
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/export/server/kafka/kafka-logs
num.partitions=2
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.flush.interval.messages=10000
log.flush.interval.ms=1000
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=node1:2181,node2:2181,node3:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
delete.topic.enable=true
host.name=node2
第三台机器修改kafka配置文件server.properties
broker.id=2
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/export/server/kafka/kafka-logs
num.partitions=2
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.flush.interval.messages=10000
log.flush.interval.ms=1000
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=node1:2181,node2:2181,node3:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
delete.topic.enable=true
host.name=node3
5.1.2.4 启动kafka集群
三台机器启动kafka服务
bin/kafka-server-start.sh config/server.properties > /dev/null 2>&1 &
后台启动命令
5.1.3 kafka的命令行的管理使用
#查看topic信息
kafka-topics.sh --list --zookeeper node1:2181,node2:2181,node3:2181
#创建topic
kafka-topics.sh --create --partitions 3 --replication-factor 2 --topic kafkatopic --zookeeper node1:2181,node2:2181,node3:2181
#模拟生产者
kafka-console-producer.sh --broker-list node1:2181,node2:2181,node3:2181 --topic kafkatopic
#模拟消费者
kafka-console-consumer.sh --from-beginning --topic kafkatopic --zookeeper node1:2181,node2:2181,node3:2181
5.2 第一种方式对接kafka之CreateDstream方式
KafkaUtils.createDstream(ssc, [zk], [group id], [per-topic,partitions] ) 使用了receivers接收器来接收数据,利用的是Kafka高层次的消费者api,对于所有的receivers接收到的数据将会保存在Spark executors中,然后通过Spark Streaming启动job来处理这些数据,默认会丢失,可启用WAL日志,它同步将接受到数据保存到分布式文件系统上比如HDFS。 所以数据在出错的情况下可以恢复出来 。
A、创建一个receiver接收器来对kafka进行定时拉取数据,这里产生的dstream中rdd分区和kafka的topic分区不是一个概念,故如果增加特定topic的分区数仅仅是增加一个receiver中消费topic的线程数,并没有增加spark的并行处理的数据量。
B、对于不同的group和topic可以使用多个receivers创建不同的DStream
C、如果启用了WAL(spark.streaming.receiver.writeAheadLog.enable=true)
同时需要设置存储级别(默认StorageLevel.MEMORY_AND_DISK_SER_2)
5.2.1 第一步:导入jar包
<dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming-kafka-0-8_2.11</artifactId><version>2.4.5</version>
</dependency>
5.2.2 第二步:创建kafka的topic
node01服务器执行以下命令创建kafka的topic sparkafka
# 1.启动Zookeeper 服务
zookeeper-daemon.sh start
# 2.启动Kafka 服务
kafka-daemon.sh start
# 3.Create Topic
cd /export/servers/kafka/
bin/kafka-topics.sh --create --topic sparkafka \
--partitions 3 --replication-factor 1 --zookeeper node1:2181/kafka200
5.2.3 第三步:使用脚本启动kafka生产者
node01服务器执行以下命令通过脚本模拟kafka生产者
#4 Producer
cd /export/servers/kafka_2.11-1.0.0/
bin/kafka-console-producer.sh --topic sparkafka --broker-list node1:9092
开启消费者
#5 Consumer
kafka-console-consumer.sh --topic wc-topic \
--bootstrap-server node1:9092 --from-beginning
5.2.4 第四步:开发SparkStreaming对接kafka代码
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.kafka.KafkaUtils
import scala.collection.immutableobject StreamKafkaReceiver {def main(args: Array[String]): Unit = {//1、创建sparkConfval sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingKafka_Receiver").setMaster("local[4]").set("spark.streaming.receiver.writeAheadLog.enable", "true") //开启wal预写日志,保存数据源的可靠性//2、创建sparkContextval sc = new SparkContext(sparkConf)sc.setLogLevel("WARN")//3、创建StreamingContextval ssc = new StreamingContext(sc, Seconds(5))//设置checkpointssc.checkpoint("./Kafka_Receiver")//4、定义zk地址val zkQuorum = "node01:2181,node02:2181,node03:2181"//5、定义消费者组val groupId = "sparkafka_group"//6、定义topic相关信息 Map[String, Int]// 指定消费的topic的名称和消费topic的线程数val topics = Map("sparkafka" -> 3)//7、通过KafkaUtils.createDStream对接kafka//这个时候相当于同时开启3个receiver接受数据val receiverDstream: immutable.IndexedSeq[ReceiverInputDStream[(String, String)]] = (1 to 3).map(x => {val stream: ReceiverInputDStream[(String, String)] = KafkaUtils.createStream(ssc, zkQuorum, groupId, topics)stream})//使用ssc.union方法合并所有的receiver中的数据val unionDStream: DStream[(String, String)] = ssc.union(receiverDstream)//8、获取topic中的数据val topicData: DStream[String] = unionDStream.map(_._2)//9、切分每一行,每个单词计为1val wordAndOne: DStream[(String, Int)] = topicData.flatMap(_.split(" ")).map((_, 1))//10、相同单词出现的次数累加val result: DStream[(String, Int)] = wordAndOne.reduceByKey(_ + _)//11、打印输出result.print()//开启计算ssc.start()ssc.awaitTermination()}
}
5.3 第二种方式对接kafka之CreateDirectStream方式
使用kafka的低阶API进行消费,消费数据的offset全部维护在kafka当中的一个topic当中,会自动提交offset,同时也可以手动提交维护offset更加安全
import kafka.serializer.StringDecoder
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.dstream.{DStream, InputDStream}
import org.apache.spark.streaming.kafka.KafkaUtils//todo:利用sparkStreaming对接kafka实现单词计数----采用Direct(低级API)
object SparkStreamingKafka_Direct {def main(args: Array[String]): Unit = {//1、创建sparkConfval sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingKafka_Direct").setMaster("local[2]")//2、创建sparkContextval sc = new SparkContext(sparkConf)sc.setLogLevel("WARN")//3、创建StreamingContextval ssc = new StreamingContext(sc, Seconds(5))ssc.checkpoint("./Kafka_Direct")//4、配置kafka相关参数val kafkaParams = Map("metadata.broker.list" -> "node01:9092,node02:9092,node03:9092", "group.id" -> "Kafka_Direct")//5、定义topicval topics = Set("sparkafka")//6、通过 KafkaUtils.createDirectStream接受kafka数据,这里采用是kafka低级api偏移量不受zk管理val dstream: InputDStream[(String, String)] = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics)//7、获取kafka中topic中的数据val topicData: DStream[String] = dstream.map(_._2)//8、切分每一行,每个单词计为1val wordAndOne: DStream[(String, Int)] = topicData.flatMap(_.split(" ")).map((_, 1))//9、相同单词出现的次数累加val result: DStream[(String, Int)] = wordAndOne.reduceByKey(_ + _)//10、打印输出result.print()//开启计算ssc.start()ssc.awaitTermination()}
}
6. [掌握]Apche kafka数据源0.10版本对接
手动提交offset,进行offset的管理维护,保证数据不会丢失,推荐使用
- 说明
spark-streaming-kafka-0-10版本中,API有变化,操作更加灵活,开发中使用 - API
streaming-kafka-0-10-integration
6.1 环境准备
- node01服务器执行以下命令创建kafka的topic sparkafka
# 1.启动Zookeeper 服务
zookeeper-daemon.sh start
# 2.启动Kafka 服务
kafka-daemon.sh start
# 3.Create Topic
cd /export/servers/kafka/
bin/kafka-topics.sh --create --topic sparkafka \
--partitions 3 --replication-factor 1 --zookeeper node1:2181/kafka200
- 使用脚本启动kafka生产者
node01服务器执行以下命令通过脚本模拟kafka生产者
#4 Producer
cd /export/servers/kafka_2.11-1.0.0/
bin/kafka-console-producer.sh --topic sparkafka --broker-list node1:9092
- 开启消费者
#5 Consumer
kafka-console-consumer.sh --topic wc-topic \
--bootstrap-server node1:9092 --from-beginning
6.2 导入对应jar包
<!-- <dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming-kafka-0-8_2.11</artifactId><version>2.4.5</version>
</dependency>-->
<dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming-kafka-0-10_2.11</artifactId><version>2.4.5</version>
</dependency>
6.3 Kafka整合实现WordCount
import java.langimport org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.dstream.{DStream, InputDStream}
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, ConsumerStrategy, KafkaUtils, LocationStrategies, LocationStrategy}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}/*** DESC:* Complete data processing and modeling process steps:*/
object kafka_010_testWordCount {var kafkaParams = Map[String, Object](//这里指的是broker的地址"bootstrap.servers" -> "node01:9092,node02:9092,node03:9092","key.deserializer" -> classOf[StringDeserializer],"value.deserializer" -> classOf[StringDeserializer],"group.id" -> "sparkkafkagroup",//这里的auto.offset.reset代表的是自动重置offset为latest就表示的是最新的偏移量,如果没有偏移从最新的位置开始"auto.offset.reset" -> "latest",//false表示的是手动提交offset,如果为true代表的是自动提交offset//这里如果是false手动提交,默认由SparkStreaming提交到checkpoint中,在这里也可以根据用户或程序员将offset偏移量提交到mysql或redis中"enable.auto.commit" -> (false: lang.Boolean))def main(args: Array[String]): Unit = {// * 1-准备环境val conf: SparkConf = new SparkConf().setAppName("kafka_010_SparkStreaming").setMaster("local[*]")val sc = new SparkContext(conf)sc.setLogLevel("WARN")val streamingContext = new StreamingContext(sc, Seconds(5))// * 2-准备Kafka的各种配置// * 3-使用Kafka的Utils的类实现lowlevelapi的DirectDStream方式// ssc: StreamingContext,// locationStrategy: LocationStrategy,// consumerStrategy: ConsumerStrategy[K, V]val recordStream: InputDStream[ConsumerRecord[String, String]] = KafkaUtils.createDirectStream[String, String](streamingContext,LocationStrategies.PreferConsistent,ConsumerStrategies.Subscribe[String, String](Array("kafkatopic"), kafkaParams))// * 4-数据处理--首先从当前的数据中获取对应的value的值---这里实现基础的wordCount操作---flatMap---map---reduceBykey或updateStateBykey//(topic = kafkatopic, partition = 2, offset = 5, CreateTime = 1585120000150, checksum = 2539994510, serialized key size = -1, serialized value size = 11, key = null, value = hello flink))val value: DStream[String] = recordStream.map(_.value()) //获取当前数据的值,将对应的值取出来在进行对应的wordcount的操作// * 5-打印结果val result: DStream[(String, Int)] = value.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)result.print()// * 6-开启程序streamingContext.start()// * 7-等待用户关闭streamingContext.awaitTermination()}
}
6.4 Kafka整合代码获取偏移量
手动提交offset管理,保证数据消费exactly once
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.kafka010._
import org.apache.spark.{SparkConf, SparkContext, TaskContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}
object StreamingKafka1 {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local[4]").setAppName("NetworkWordCount")val context = new SparkContext(conf)context.setLogLevel("WARN")val ssc = new StreamingContext(context, Seconds(1))//创建topicval brokers= "node01:9092,node02:9092,node03:9092"val sourcetopic="kafkatopic";//创建消费者组var group="sparkafkaGroup"//消费者配置val kafkaParam = Map("bootstrap.servers" -> brokers,//用于初始化链接到集群的地址"key.deserializer" -> classOf[StringDeserializer],"value.deserializer" -> classOf[StringDeserializer],//用于标识这个消费者属于哪个消费团体"group.id" -> group,//如果没有初始化偏移量或者当前的偏移量不存在任何服务器上,可以使用这个配置属性//可以使用这个配置,latest自动重置偏移量为最新的偏移量"auto.offset.reset" -> "latest",//如果是true,则这个消费者的偏移量会在后台自动提交"enable.auto.commit" -> (false: java.lang.Boolean));var stream = KafkaUtils.createDirectStream[String,String](ssc,LocationStrategies.PreferConsistent,ConsumerStrategies.Subscribe[String,String](Array("kafkatopic"),kafkaParam))//循环遍历每个RDD当中的数据stream.foreachRDD(f =>{//判断如果rdd当中有数据,就进行处理,没有数据就不用处理if(f.count() > 0){println("接收kafka当中的数据")//每个分区当中的数据进行循环遍历,遍历每个分区当中每一行的数据f.foreach(f =>{//获取kafka当中的数据内容
print(“record topic is:”,f)val kafkaValue: String = f.value()println(kafkaValue)})//打印offset的信息val offsetRanges: Array[OffsetRange] = f.asInstanceOf[HasOffsetRanges].offsetRangesf.foreachPartition { iter =>val o: OffsetRange = offsetRanges(TaskContext.get.partitionId)println(s"$topic{o.topic} $partition{o.partition} $fromOffset{o.fromOffset} $untilOffset{o.untilOffset}")}println("=============================")// 等输出操作完成后提交offsetstream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)}})ssc.start()ssc.awaitTermination()}
}
结果:
这里面为什么是三个分区是因为创建的时候使用的是3个分区
上述代码提交offset默认到checkpoint中
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 30V转5V,30V转3.3V,30V转3V的5款降压芯片和LDO
30V转6V降压芯片 ,30V转5V降压芯片,30V转3.3V降压芯片,30V转3V降压芯片,30V转1.8V 注意,不管是DC-DC还是LDO芯片,开关导通输入时,直接30V输入时,在通电和接上电时,会产生输入尖峰高…...
2024/4/13 3:02:35 - website_fingerprinting 使用项目
website_fingerprinting 目前本项目支持如下模型: Deep Fingerprinting SDAE LSTM CNN 剩余两个是统计机器学习模型:【 目前这两个模型没有适配好,但是里面的特征提取是有效的】 CUMUL AppScanner 使用方法 数据准备 首先…...
2024/4/8 18:07:14 - python 操作文件、文件夹
1.检查文件、文件夹是否存在 os.path.isfile os.path.isdir 2.创建文件夹 os.mkdir(path) os.makedirs(path) //可以创建多级目录 3.获取当前目录 os.path.getcwd() 4.删除文件夹 import shutil shutil.rmtree(path) //可以删除非空文件夹 os.rmdir(path)//只能删除…...
2024/4/6 7:20:48 - 刷脸支付是当下科技发展的主流旋律
科技发展的初衷是为人民服务,而更快捷便利的为人民服务,则是当下科技发展的主流旋律。就拿超市结账来说,以前是排着队,等收银员一件件扫完商品码之后,再掏出现金进行结账,这样不仅效率慢,而且收…...
2024/4/6 7:20:46 - 作为个人建站需要哪些能力
如果你是个门外汉,个人建站需要的能力还是很多的,基础操作无关技术的,申请的空间域名啦,域名解析,空间绑定了,FTP了,网站备案实名了,这些都是需要会一定的操作,这些相对简…...
2024/4/21 7:05:06 - kubernetes+nacos
Clone 项目 git clone https://github.com/nacos-group/nacos-k8s.git简单例子如果你使用简单方式快速启动,请注意这是没有使用持久化卷的,可能存在数据丢失风险: cd nacos-k8s chmod x quick-startup.sh ./quick-startup.sh测试 服务注册curl -X PUT http://cluster-ip:8848/n…...
2024/5/7 14:00:41 - C++,容器
vector *相当于一个没有大小限制的数组,数组的加强版; 主要的并且常用的操作 以 vector < int >v; 为例; v.begin();v.end();v.push_back();v.pop_back();v.size();v.empty();v.front();v.back();v.at(); 10.v.clear(); v.erase(); …...
2024/4/6 7:20:44 - 变量和数据类型
1.变量的概念 一个数据存储空间的表示 2.描述变量的三元素 1)变量名 2)变量类型 3)变量值 3.变量的命名规则 1)由数字,字母,下划线(_),美元符($)组成 …...
2024/4/6 7:20:43 - Games101 笔记 06光栅化(深度测试与抗锯齿)
反走样 上次课的最后的是三角形有明显的锯齿, 学名是走样 (Aliasing) 视频 就是在时间中的采样 Artifacts(Errors/Mistakes/Inaccuracies)in Computer Graphics 图形中的一切错误,不准确都可以用这个 比如: 高速行走的轮胎会让你感觉又向后的趋势, 原因是人眼是时间上的采样…...
2024/5/8 1:31:41 - 刷脸支付将为人们的日子水平得到质的提高
科技不断进步,付款方法也随之变化。负责人表明:“咱们挑选先在程江加油站这类小额高频消费场所进行刷脸付款使用试点,若用户反应好,今后还将会在更多当地普及刷脸付款使用。”未来,刷脸支付还将在更多的场景得到使用&a…...
2024/4/26 23:14:55 - xshell Hbase shell 输入无法使用退格键删除解决办法
使用Ctrl Backspace...
2024/4/6 7:20:40 - top_23
...
2024/4/6 7:20:39 - 查券机器人微信公众号配置教程分享
查券机器人微信公众号配置教程分享 一、淘宝联盟官方淘宝客私域渠道ID申请 1、登陆淘宝联盟 用需要开通淘宝联盟的手机淘宝扫码授权登陆联盟 地址:https://www.alimama.com 2、填写《私域用户管理功能》申请表(可略过) 地址:ht…...
2024/4/6 7:20:38 - itext7 springboot 集成,基础使用下载导出等
首先放一个自己写的pdfUtil,小伙伴们可以直接拷到项目里,没有代码侵染 package com.cpicdg.util.pdf; import com.itextpdf.io.font.PdfEncodings; import com.itextpdf.io.image.ImageDataFactory; import com.itextpdf.kernel.font.PdfFont; import c…...
2024/4/18 9:36:49 - kotlin入门教程
一、Hello World 按照国际惯例,学习一门新的语言通常都是要从打印 Hello World 开始的 package mainfun main() {val msg: String "Hello World"println(msg) }从这个简单的函数就可以列出 kotlin 和 Java 的几个不同点 函数可以定义在文件的最外层&a…...
2024/4/23 8:33:31 - 使用Sunny-Ngrok进行内网穿透(httpswww.ngrok.cc)
使用Sunny-Ngrok进行内网穿透(https://www.ngrok.cc/) 先进行注册登录 进入使用教程 下载客户端(按照版本下载) 因为我本地是win64,所以直接下win64的版本 填完信息,得到隧道的ID; 启动Sunn…...
2024/4/22 17:45:09 - 出现VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 未能将管道连接到虚拟机: 所有的管道范例都在使用中。
因为虚拟机卡住,故强制关机,导致再次打开虚拟机的时候报错: 出现VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 未能将管道连接到虚拟机: 所有的管道范例都在使用中。…...
2024/4/6 7:20:34 - 从小数据算法说起
说到算法工程师,大家的印象首先是学历要高,工资很高。从事的高端的工作,比如人工智能,比如机器学习什么的。目前流行的是大数据算法工程师,基于大数据的。但生活中往往有些东西没有大数据,只有小数据。基于…...
2024/4/6 7:20:33 - LeetCode:删除排序数组中的重复项(Easy难度)
(做LeetCode笔记的第一天) 题目: 给定一个 排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地…...
2024/4/10 15:28:58 - Java循环结构
1.循环结构特点 1)循环操作 2)循环条件 2.循环的四个步骤 1)初始化循环条件 2)循环条件 3)循环体 4)变更循环条件 3.while循环 while(循环条件){ //循环体 } 3.do-while do{ //循环体 }while(循…...
2024/4/6 7:16:37
最新文章
- 自动语音识别
⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号…...
2024/5/8 4:38:32 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - 17、Lua 文件 I-O
Lua 文件 I/O Lua 文件 I/O简单模式完全模式 Lua 文件 I/O LuaI/O 库用于读取和处理文件。分为简单模式(和C一样)、完全模式。 简单模式(simple model)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件…...
2024/5/8 0:52:46 - FastAPI Web框架教程 第1章 快速上手
1.1 fastapi介绍 简介: FastAPI 是一个高性能,易于学习,高效编码,生产可用的Python Web异步框架 FastAPI 适合来写API,使用 Python 3.6 并基于标准的 Python 类型提示 核心特性: 速度快:可…...
2024/5/5 8:27:14 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/7 19:05:20 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/7 22:31:36 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/8 1:37:40 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/7 14:19:30 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/8 1:37:39 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/7 16:57:02 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/7 14:58:59 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/7 1:54:46 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/7 21:15:55 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/8 1:37:35 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/7 16:05:05 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/7 16:04:58 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/8 1:37:32 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/7 16:05:05 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/8 1:37:31 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/8 1:37:31 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/7 11:08:22 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/7 7:26:29 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/8 1:37:29 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/7 17:09:45 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57