Storm-实时计算系统
Storm-实时计算系统
作者 | WenasWei
1.1 Storm简介
Storm 最早是由 BackType 公司开发的实时处理系统,底层由 Clojure 实现。Clojure 也是一门基于 JVM 的高级面向函数式的编程语言。2011年 Twitter 公司收购了 BackType 公司,便使用 Storm 帮助企业解决了实时海量数据处理的问题。阿里巴巴在 Storm 基础上,使用 Java 代替 Clojure 实现了核心,并在性能上进行了优化,产生了JStorm。目前 Storm 和 JStorm 都由 Apache 基金会组织管理。
Storm-实时计算系统:
1.2 Storm特性
- 简单的编程模型: 类似于 MapReduce 降低了并行批处理复杂性,Storm降低了进行实时处理的复杂性,主要通过 Tuple 元组在各个组件之间传递数据。
- 支持多种编程语言: 默认支持 Clojure、Java、Ruby 和 Python,要增加对其他语言的支持,只需实现一个简单的 Storm 通信协议即可
- 容错性: Storm 会管理工作进程和节点的故障
- 水平扩展: 计算是在多个线程、进程和服务器之间并行进行的
- 可靠的消息处理: Storm 提供了 Ack 机制,保证每个消息至少能得到一次完整处理。任务失败时, 它会负责从消息源重试消息
- 高性能与低延迟: 系统的设计保证了消息能得到快速的处理,使用 ØMQ1 作为其底层消息队列
- 本地模式: Storm 有一个“本地模式”, 可以在处理过程中完全模拟 Storm 集群
1.3 Storm使用场景
Apache Storm 有许多用例:实时分析,在线机器学习,连续计算,分布式 RPC,ETL 等。Apache Storm 速度很快:基准测试表明它每秒可处理每个节点超过一百万个元组。它具有可扩展性,容错性,可确保您的数据将得到处理,并且易于设置和操作。
- (1)信息流处理 Stream Processing
处理源源不断产生的消息,并将处理之后的结果存储到某个存储系统中去,典型的架构是 Kafka + Storm + HBase(或redis)。 - (2)连续计算 Continuous Computation
Storm可进行连续查询并把结果即时反馈给客户端,比如把微博上的热门话题发送到浏览器上。 - (3)分布式远程过程调用 Distributed RPC
用来处理并行密集查询,客户端向Storm提交一个查询请求和查询参数,Storm 运行 Topology 并行处理,并将结果同步返回给客户端。 - (4)在线机器学习。
- (5)日志分析: 在线实时分析业务系统或者网站产生的日志数据。
- (6)管道传输: 能够使数据在不同系统之间进行传输。
- (7)统计分析: 实时获取日志或者消息,对待定得到字段进行统计计数或累加计算。
2.1 Storm的核心组件
Storm 的核心组件分为:
- Topology: 计算拓扑
- Nimbus: Storm 的 Master
- Supervisor: Storm 的 Slave
- Worker: 工作进程
- Task: 运行于Spout或Bolt中的线程
- Stream: 数据流
- Spout: 数据源
- Bolt: 处理数据
- Reliability: 可靠性
- Tuple: 消息传递的基本单元
- Executor: Worker进程中的具体的物理线程
- Stream grouping: 每个 Bolt 的确定输入数据流
1、Topology
计算拓扑, Storm 的拓扑是对实时计算应用逻辑的封装,它的作用与 MapReduce 的任务(Job)很相似,区别在于 MapReduce 的一个 Job 在得到结果之后总会结束,而拓扑会一直在集群中运行,直到你手动去终止它;拓扑还可以理解成由一系列通过数据流(Stream Grouping)相互关联的 Spout 和 Bolt 组成的的拓扑结构, 一个完整的运行任务被称为一个 Topology;监听集群状态,当 Supervisor 节点挂掉,由 Nimbus 将该节点上正在运行着的任务重新分配给其他 Supervisor 执行。
2、Nimbus
即 Storm 的 Master,本身无状态,负责资源分配和任务调度;一个 Storm 集群只有一个 Nimbus,分配工作给从节点 supervisor,注意不是直接分配,而是将任务发布到 zookeeper 上,由 supervisor 到 zookeeper上领取任务。
3、Supervisor
即 Storm 的 Slave,负责接收 Nimbus 分配的任务,管理所有 Worker,一个 Supervisor 节点中包含多个 Worker 进程。
4、Worker
工作进程,每个工作进程中都有多个 Task。
5、Task
任务,Storm中最小的处理单元,在 Storm 集群中每个 Spout 和 Bolt 都由若干个任务(tasks)来执行;每个任务都与一个执行线程相对应。
6、Stream
数据流(Streams)是 Storm 中最核心的抽象概念。一个数据流指的是在分布式环境中并行创建、处理的一组元组(tuple)的无界序列。
7、Spout
数据源(Spout)是拓扑中数据流的来源。一般 Spout 会从一个外部的数据源读取元组然后将他们发送到拓扑中。根据需求的不同,Spout 既可以定义为可靠的数据源,也可以定义为不可靠的数据源。一个可靠的 - Spout 能够在它发送的元组处理失败时重新发送该元组,以确保所有的元组都能得到正确的处理;相对应的,不可靠的 Spout 就不会在元组发送之后对元组进行任何其他的处理。一个 Spout 可以发送多个数据流。
8、Bolt
拓扑中所有的数据处理均是由 Bolt 完成的。通过数据过滤(filtering)、函数处理(functions)、聚合(aggregations)、联结(joins)、数据库交互等功能,Bolt 几乎能够完成任何一种数据处理需求。一个 Bolt 可以实现简单的数据流转换,而更复杂的数据流变换通常需要使用多个 Bolt 并通过多个步骤完成。
9、Reliability
可靠性。Storm 可以通过拓扑来确保每个发送的元组都能得到正确处理;通过跟踪由 Spout 发出的每个元组构成的元组树可以确定元组是否已经完成处理。每个拓扑都有一个“消息延时”参数,如果 Storm 在延时时间内没有检测到元组是否处理完成,就会将该元组标记为处理失败,并会在稍后重新发送该元组。
10、Tuple
消息传递的基本单元
11、Executor
Storm0.8之后, Executor为 Worker进程中的具体的物理线程,同一个 Spout、Bolt的Task可能会共享一个物理线程,一个 Executor中只能运行隶属于同一个 Spout/ Bolt 的 Task
12、Stream grouping
Stream grouping 为拓扑中的每个 Bolt 的确定输入数据流是定义一个拓扑的重要环节;数据流分组定义了在 Bolt 的不同任务(tasks)中划分数据流的方式。
2.2 Storm集群架构
Storm 的集群也是采用主从架构,Storm 的 Topology 相比于 Hadoop 中的 MapReduceJob 关键区别是: 一个 Topology 在启动后,会永远运行; 而一个 MapReduceJob 会有启动、运行到最终会结束的过程。
在 Storm 的集群里面有两种节点: 控制节点 (Nimbus) 和工作节点(Supervisor), Nimbus 负责在集群里面分发执行代码,分配工作给工作节点,并且监控任务的执行状态。每一个工作节点上面运行一个叫作 Supervisor 的守护进程。Supervisor 会监听分配给自己所在机器的工作,根据需要启动/关闭工作进程。每一个工作进程执行一个 Topology 的一个子集,一个运行的 Topology 由运行在很多机器上的很多工作进程组成。
Storm 集群可以使用 Apache Zookeeper 集群来作为自己的协调系统,Storm 集群的组织架构:
Nimbus 节点和 Supervisor 节点之间的数据通信和协调依靠 Zookeeper 框架完成, Storm被设计成无状态的,Nimbus 节点和 Supervisor 节点中不会保存任何状态信息,所有的状态信息会被保存在 Zookeeper 或者磁盘中。这样,当 Nimbus 节点或者 Supervisor 节点宕机,或者直接使用 kill -9
命令杀死 Nimbus 进程和 Supervisor 进程时,重启就可以继续工作,使 Storm 具有高度的稳定性和可靠性。
Storm任务分配流程图:
- (1) 客户端提交拓扑到 nimbus;
- (2) Nimbus 针对该拓扑建立本地的目录根据 Topology 的配置计算 Task,分配 Task,在 Zookeeper 上建立 Assignments 节点存储 Task 和 Supervisor 机器节点中 Woker 的对应关系;
- (3) 在 Zookeeper 上创建 Task beats 节点来监控 Task 的心跳;启动 topology。
- (4) Supervisor 去 Zookeeper 上获取分配的 Tasks,启动多个 Woker 进行,每个 Woker 启动一个或者多个 Executors,线程中执行 Task;
- (5) 根据 Topology 信息初始化建立 Task 之间的连接; Task 和 Task 之间是通过 ZeroMQ、NettyRPC 管理的通信;
在 Storm 中有八种内置的数据流分组方式,还有一种自定义分组策略。
3.1 随机分组(Shuffle grouping)
这种方式下元组会被尽可能随机地分配到 Bolt 的不同任务(tasks)中,使得每个任务所处理元组数量能够能够保持基本一致,以确保集群的负载均衡。
Shuffle Grouping 简单代码示例:
TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("mySpout",new MySpout(),1); builder.setBolt("myBolt",new myBolt(),2).shuffleGrouping("mySpout");
3.2 域分组(Fields grouping)
数据流根据定义的“域”来进行分组, 按 Tuple 中的字段分组,相同字段的 Tuple 会被分发到同一个 Task 中,这样便于数据的跟踪和处理。例如,如果某个数据流是基于一个名为 “user-id” 的域进行分组的,那么所有包含相同的 “user-id” 的元组都会被分配到同一个任务中,这样就可以确保消息处理的一致性。
Fields grouping 简单代码示例:
TopologyBuilder builder = new TopologyBuilder();builder.setSpout("mySpout",new MySpout(),1);// 按照 myFieId 字段进行分区builder.setBolt("myBolt",new myBolt(),2).fieldsGrouping("mySpout", new Fields("myFieId")).fieldsGrouping(ConstData.CACHE_BOLT, ConstData.PROCESSOR_STREAM, new Fields(AlarmAttrName.ME));
3.3 部分关键字分组(Partial Key grouping)
这种方式与域分组很相似,根据定义的域来对数据流进行分组,不同的是,这种方式会考虑下游 Bolt 数据处理的均衡性问题,在输入数据源关键字不平衡时会有更好的性能1。感兴趣的读者可以参考这篇论文,其中详细解释了这种分组方式的工作原理以及它的优点。
Partial Key grouping 简单代码示例:
TopologyBuilder builder = new TopologyBuilder();builder.setSpout("spout", new PartialKeyGroupingSpout(), 2).setNumTasks(3);builder.setBolt("bolt", new PartialKeyGroupingBolt(), 3).setNumTasks(5).partialKeyGrouping("spout", new Fields("flag"));
3.4 完全分组(All grouping)
数据流会被同时发送到 Bolt 的所有任务中(同一个元组会被复制多份然后被所有的任务处理), 也就是说所有的 Tuple 都会被广播发送到所有的 Bolt,常被用于向 Bolt 发送的信号,使用这种分组方式要特别小心。
All grouping 简单代码示例:
TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("mySpout",new MySpout(),1);builder.setBolt("myBolt",new MyBolt(),2).allGrouping("mySpout");
3.5 全局分组(Global grouping)
这种方式下所有的数据流都会被发送到 Bolt 的同一个任务中,也就是 id 最小的那个任务。
Global grouping 简单代码示例:
TopologyBuilder builder = new TopologyBuilder();// 拓扑名、数据源、并行度builder.setSpout("mySpout", new MySpout(), 1);builder.setBolt("bolt", new MyBolt(), 2).globalGrouping("mySpout");
3.6 非分组(None grouping)
使用这种方式说明你不关心数据流如何分组。目前这种方式的结果与随机分组完全等效,不过未来 Storm 社区可能会考虑通过非分组方式来让 Bolt 和它所订阅的 Spout 或 Bolt 在同一个线程中执行。
None grouping 简单代码示例:
TopologyBuilder builder = new TopologyBuilder();// 拓扑名、数据源、并行度builder.setSpout("mySpout", new MySpout(), 1);// 等于 shuffleGroupingbuilder.setBolt("myBolt", new MyBolt(), 2).noneGrouping("mySpout");
3.7 直接分组(Direct grouping)
这是一种特殊的分组方式。使用这种方式意味着元组的发送者可以指定下游的哪个任务可以接收这个元组。只有在数据流被声明为直接数据流时才能够使用直接分组方式。使用直接数据流发送元组需要使用 OutputCollector 的其中一个 emitDirect 方法。Bolt 可以通过 TopologyContext 来获取它的下游消费者的任务 id,也可以通过跟踪 OutputCollector 的 emit 方法(该方法会返回它所发送元组的目标任务的 id)的数据来获取任务 id。
Direct grouping 简单代码示例:
TopologyBuilder builder = new TopologyBuilder();// 设置 Spoutbuilder.setSpout("mySpout", new Myspout()).setNumTasks(2);//设置 creator-Boltbuilder.setBolt("myBolt", new MyBolt(), 2).directGrouping("mySpout").setNumTasks(2);
3.8 本地或随机分组(Local or shuffle grouping)
如果在源组件的 worker 进程里目标 Bolt 有一个或更多的任务线程,元组会被随机分配到那些同进程的任务中。换句话说,这与随机分组的方式具有相似的效果。
Local or shuffle grouping 简单代码示例:
TopologyBuilder builder = new TopologyBuilder();builder.setSpout("mySpout", new MySpout(), 1);builder.setBolt("myBolt", new myBolt(), 2).local0rShuffleGrouping("mySpout");
3.9 自定义分组策略(Custom Grouping)
当 Storm 内置的7种分组策略无法满足需求时, 还可以使用自定义分组策略:
Custom Grouping
实现自定义分组策略需要实现 CustomStreamGrouping 接口。自定义分组策略类 MyCustomGrouping 的代码如下所示:
public class Mycustomgrouping implements CustomStreamGrouping {@Overridepublic void prepare(WorkerTopologyContext workerTopologyContext, GlobalStreamId globalStreamId, List<Integer> list) {}@Overridepublic List<Integer> chooseTasks(int i, List<Object> list) {return null;}
}
使用示例代码如下所示:
TopologyBuilder builder = new TopologyBuilder();// 拓扑名、数据源、并行度builder.setSpout("mySpout", new MySpout(), 1);builder.setBolt("myBolt", new MyBolt(), 2).customGrouping("mySpout", new Mycustomgrouping());
4.1 Storm的可靠性机制
在 Storm 中运行着一类特殊的 Task,称为 acker 。acker 能够监控每个从 Spout 发送的 tuple 产生的消息树。当 acker 发现一个 tuple 产生的消息树被完整地处理后,会向产生该 tuple 的 Task 发送一条通知消息,表示该消息已经执行完成。用户可以通过配置 Config.TOPOLOGY_ACKERS 的值来设置一个 Topology 中acker 的数量,默认值为1。如果一个 Topology 中 tuple 的数量较多,就可以将 acker 的数量设置得大一些,以此提高整个 Topology 运行时的性能。
Storm Ack 机制的简易流程:
- (1) Spout 进行初始化,会产生一个全局唯一的 taskId。
- (2) Spout 创建一个 Tuple,并为 Tuple 指定一个 tupleld,在各个组件之间进行数据传输
- (3) Spout 将创建的 Tuple 发送出去, 并根据指定的 tupleld 开启跟踪,同时将消息发送到 Acker,Acker对消息进行跟踪。
- (4) Spout 发送的 Tuple 会经过一系列 Bolt 的处理,产生一个 Tuple 跟踪列表
- (5) Bolt 调用 collectorack() 方法进行一系列的异或操作,如果得出的最终结果是0,则表示成功;如果得出的最终结果不是0,则表示失败。
- (6) 根据第(1)步生成的 taskId,回调 Spout 中的 ack()方法或者 fail()方法
注意:
用户如果不关心可靠性的问题,可以使用如下方式进行设置:
- (1) 在定义 Topology 时设置 Acker 的数量为 0。代码如下所示:
conf.setNumAckers(0);
- (2) 在 Spout 发送 Tuple 时不指定 messageld, Storm不会开启跟踪,这样就不会开启 Acker 确认机制。
- (3) 在 Bolt 中使用以 RichBolt 结尾的 Bolt 类,不手动调用 collector.ack() 方法和 collector.fail() 方法,即不进行数据锚定 来发送新的 Tuple 数据, 因为以 RichBolt 结尾的 Bolt 类没有提供可靠性机制, 而以 BasicBolt 为结尾的 Bolt 封装了可靠性机制。
4.2 Storm的容错性
Storm 的容错分为如下类型:
- (1)工作进程 worker 失效
如果一个节点的工作进程 worker “死掉”,supervisor 进程会尝试重启该 worker。如果连续重启 worker 失败或者 worker 不能定期向 Nimbus 报告“心跳”,Nimbus 会分配该任务到集群其他的节点上执行。
- (2)集群节点失效
如果集群中某个节点失效,分配给该节点的所有任务会因超时而失败,Nimbus 会将分配给该节点的所有任务重新分配给集群中的其他节点。
- (3)Nimbus 或者supervisor 守护进程失败
Nimbus 和supervisor 都被设计成快速失败(遇到未知错误时迅速自我失败)和无状态的(所有的状态信息都保存在 Zookeeper 上或者是磁盘上)。Nimbus 和supervisor 守护进程必须在一些监控工具(例如,daemontools 或者 monitor )的辅助下运行,一旦 Nimbus 或者 supervisor 失败,可以立刻重启它们,整个集群就好像什么事情也没发生。最重要的是,没有工作进程 worker 会因为Nimbus 或 supervisor 的失败而受到影响,Storm 的这个特性和 Hadoop 形成了鲜明的对比,如果 JobTracker 失效,所有的任务都会失败。
- (4)Nimbus 所在的节点失效
如果 Nimbus 守护进程驻留的节点失败,工作节点上的工作进程 worker 会继续执行计算任务,而且,如果 worker 进程失败,supervisor 进程会在该节点上重启失败的worker 任务。但是,没有 Nimbus 的影响时,所有 worker 任务不会分配到其他的工作节点机器上,即使该 worker 所在的机器失效。
5.1 Storm 组件回顾:
5.2 Storm API
(1) 首先编写数据源类: Spout
- a. 继承 BaseRichSpout类
- b. 实现 IRichSpout接口
- c. 重点需要几个方法进行重写或实现:open、nextTuple 和 DeclareOutputFields 方法
(2) 继续编写数据处理类:Bolt
- a. 继承 BaseBasicBolt类
- b. 实现 IRichBolt接口
- c. 重点需要几个方法进行重写或实现: execute、 declareOutputFields方法
(3) 最后编写主函数( Topology)去进行提交一个任务
- a. TopologyBuilder 组件Topology
- b. 在使用 Topology时候, Storm框架为我们提供了俩种模式:本地模式和集群模式
本地模式:(无需Storm集群,直接在java中即可运行,一般用于测试和开发阶段)执行运行main函数即可。
LocalCluster localCluster = new LocalCluster();
localCluster.submitTopology(topologyName, config, topologyBuilder.createTopology());
localCluster.killTopology(topologyName);
localCluster.shutdown();
集群模式:(需要 Storm集群,把实现的java程序打包,然后 Topology进行提交)需要把应用打成jar,使用storm命令把 Topology提交到集群中去。
StormSubmitter.submitTopology(topologyName, config, topologyBuilder.createTopology());
6.1 Storm与Hadoop的区别
Storm 只是一个实时分布式计算框架,但可以读取 hdfs 上的文件进行批量计算,另外 Storm 可以运行在 Yarn 上。Hadoop 的 hdfs 是分布式文件存储系统,mapreduce + Yarn 批量离线计算。
Storm 的计算任务为 Topology,提交到 Storm 集群上运行,除非手动执行 kill 命令,否则会一直运行下去。MapReduce 数据处理完毕,就会停止。
原理角度来讲:
-
Hadoop M/R基于 HDFS,需要切分输入数据、产生中间数据文件、排序、数据压缩、多份复制等,效率较低。
-
Storm 基于 ZeroMQ 这个高性能的消息通讯库,不持久化数据。
6.2 Storm与SparkStreaming的区别
Storm是真正的实时处理框架,针对数据,来一条记录就处理一次,是一种流式数据处理技术框架,运行级别达到毫秒级别。
SparkStreaming是一种微批数据处理框架,运行级别达到秒级。
6.3 Storm与Flink的区别
比较项 | Storm | Flink |
---|---|---|
状态管理 | 无状态,需用户自行进行状态管理 | 有状态 |
窗口支持 | 对事件窗口支持较弱,缓存整个窗口的所有数据,窗口结束时一起计算 | 窗口支持较为完善,自带一些窗口聚合方法,并且会自动管理窗口状态。 |
消息投递 | At Most Once At Least Once | At Most Once At Least Once Exactly Once |
容错方式 | ACK机制 :对每个消息进行全链路跟踪,失败或超时进行重发。 | 检查点机制 :通过分布式一致性快照机制,对数据流和算子状态进行保存。在发生错误时,使系统能够进行回滚。 |
应用现状 | 在美团点评实时计算业务中已有较为成熟的运用,有管理平台、常用 API 和相应的文档,大量实时作业基于 Storm 构建。 | 在美团点评实时计算业务中已有一定应用,但是管理平台、API 及文档等仍需进一步完善。 |
单线程的吞吐量:
(图片参考来自美团技术团队)
- 上图中蓝色柱形为单线程 Storm 作业的吞吐,橙色柱形为单线程 Flink 作业的吞吐。
- Identity 逻辑下,Storm 单线程吞吐为 8.7 万条/秒,Flink 单线程吞吐可达 35 万条/秒。
- 当 Kafka Data 的 Partition 数为 1 时,Flink 的吞吐约为 Storm 的 3.2 倍;当其 Partition 数为 8 时,Flink 的吞吐约为 Storm 的 4.6 倍。
- 由此可以看出,Flink 吞吐约为 Storm 的 3-5 倍。
flink 是一个设计良好的框架,它不但功能强大,而且性能出色。此外它还有一些比较好设计,比如优秀的内存管理和流控。但是,flink 目前成熟度较低,还存在着不少问题,比如 SQL 支持比较初级;无法像 storm 一样在不停止任务的情况下动态调整资源;不能像 spark 一样提供很好的 streaming 和 static data 的交互操作等。
参考文档:
- [1] apache.storm官网: http://storm.apache.org/index.html
- [2] GitHub地址: https://github.com/apache/storm
- [3] 冰河 . 海量数据处理与大数据技术实战 [M] . 第1版 . 北京: 北京大学出版社 , 2020-09
- [4] netcobol
. Storm 从入门到精通 . CSDN . https://blog.csdn.net/netcobol/category_9273336.html?spm=1001.2014.3001.5482 , 2018-04-03 - [5] fct2001140269 . Storm与Flink的比较 . CSDN . https://blog.csdn.net/fct2001140269/article/details/84479740 , 2018-11-25
ØMQ: ZeroMQ(也称为ØMQ, 0mq或zmq)看起来像一个嵌入式的网络库(an embeddable networking library) ↩︎
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 代理ARP(Proxy ARP)实验
1、测试R2 ping R3,观察ARP表。 配置命令: R2#configure terminal R2(config)#no ip routing //关闭路由 R2(config)#interface fastEthernet 0/0 R2(config-if)#ip address 12.12.12.2 255.255.255.0 R2(config-if)#no shutdown R2(config-if)#exit R2(con…...
2024/5/8 13:54:18 - 二十一. 用户注册模块 --- 登录 2021-04-18
二十一. 用户注册模块 — 登录 注:该篇文章接上一篇 二十.用户注册 — 实现注册功能 在上一篇文章我们实现了用户注册中的实现注册功能,在这一章实现登录功能 一、功能需求分析 登录退出功能分析 功能 登录页面登录功能退出功能 二、登录页面 1. 接…...
2024/5/8 13:54:17 - acm选修课——贪心技术
acm选修课——贪心技术贪心技术简介案例1:桥案例2:安放雷达案例3:合并果子(相当于哈夫曼树,哈夫曼编码)案例4:判断一个数是否可以分解为阶乘和贪心技术简介 局部解是最终解的一部分 在这个基础…...
2024/5/8 13:54:17 - Selenium3自动化学习(一)
学习笔记- Selenium[səˈliːniəm] 笔记目录:https://blog.csdn.net/weixin_42717928/article/details/114343085 自动化测试了解测试环境搭建一:自动化测试了解 传统的自动化测试可以理解是基于UI层的自动化测试,将黑盒测试转化为由程序…...
2024/5/8 13:54:16 - centos7搭建代理服务器tinyproxy
环境: centos7 tinyproxy 下载tinyproxy yum install tinyproxy -y修改配置 vim /etc/tinyproxy/tinyproxy.conf# 端口 Port 8888 # 允许访问的ip,后面接允许的ip,比如我只需要我阿里云的公网ip能访问就行,于是用阿里云公网ip替…...
2024/5/8 13:54:14 - 谷歌语法总结
**site:**可以限制你搜索范围的域名.例如:学院 site:pku.edu.cn **inurl:**用于搜索网页上包含的URL,这个语法非常的重要,使用的也是最为频繁,我们还可以使用allinurl来更加精确的定位URL地址。比如搜索含有…...
2024/5/8 13:54:13 - windows下运行TCL脚本程序
首先安装环境,ActiveTcl8.3.4.1-9.win32-ix86.exe下载 1:下载windows版本 不方便UNIX/LINUX,所以直接下载windows版本,现在版本已经到8.5了; 下载链接: [url]http://www.activestate.com/Products/Download/Downlo…...
2024/5/8 11:32:52 - 使用MediaInfo.dll获取是媒体文件信息
MediaInfo是一款专门用来分析音视频文件编码和内容信息的开源软件,提供的形式有多种:桌面应用程序,命令行下的使用,动态库。 动态库的下载方式: 官网地址MediaInfo 下载完成之后解压后有一下文件,主要用的东西在Me…...
2024/5/8 13:54:11 - macos mtr
brew install mtrcd /usr/local/Cellar/mtr/0.94/sbincp mtr /usr/local/bin cp mtr-packet /usr/local/binmtr --version mtr 0.94sudo mtr baidu.com参考: MTRmacOS 安装 MTR 教程...
2024/5/8 13:54:11 - Python高级
装饰器多线程生成器、迭代器...
2024/5/8 13:54:10 - Makefile基本用法 一眼懂版
1.基本格式 示例: led.bin:leds.sarm-linux-gnueabihf-gcc -g -c leds.s -o led.oarm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.binarm-linux-gnueabihf-objdump -D led.elf > led.dis clean:rm -…...
2024/5/8 13:54:09 - 【ACWing】1137. 选择最佳线路
题目地址: https://www.acwing.com/problem/content/1139/ 有一天,琪琪想乘坐公交车去拜访她的一位朋友。由于琪琪非常容易晕车,所以她想尽快到达朋友家。现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具…...
2024/5/8 13:54:07 - 学习笔记:GAMES101图形学入门闫令琪(四)光栅化(一)
屏幕: 一个二维数组 数组中每一个元素是个像素 一种典型的光栅成像设备 光栅化: 把东西画在屏幕上的过程 像素 now 像素是一个颜色均匀的小正方形 颜色由RGB表示 屏幕空间: 屏幕上建立一个坐标系 像素中心的位置实际是: 在上…...
2024/5/8 13:54:06 - Mongo DB
Mongo 是 humongous 的中间部分,寓意海量数据库,Mongodb是一款非关系型/NoSQL数据库 集合与文档 集合Collection位于单独的一个数据库MongoDB文档Document集合,它类似关系型数据库(RDBMS)中的表Table。一个集合Collection内的多个…...
2024/5/8 13:54:05 - Apple4.21春季新品发布会
Apple Card Family Apple 播客更新 iPhone 12 12mini新配色 purple 查找功能 AirTag 可以定制 精确查找 借助U1芯片 $29 $99 Apple TV TV首发 Ted Lasso 第二季 Apple TV 4K A12芯片 高帧率HDR视频 色彩平衡功能,调节电视色彩,利用手机传感器 全新Siri…...
2024/5/8 13:54:05 - 简单笔记:记一次 golang 的切片复制
常规情况下 golang 的一维数组复制,可以这样写: func copy(src []int) []int {copy0 : make([]int, len(src))copy(copy0, src)return copy0 } 这样写,会新开辟一块内存空间,对切片副本的任何修改操作,不会影响原切片…...
2024/5/8 13:54:04 - Jupyter Notebook扩展插件安装及插件推荐
Jupyter Notebook扩展插件安装及插件推荐插件安装我安装的插件插件安装 记住安装时一定要以管理员身份运行,否则会因为权限问题,导致安装失败 用conda安装 conda install -c conda-forge jupyter_contrib_nbextensionsconda install -c conda-forge ju…...
2024/5/8 13:54:03 - 拦截器不生效
配置了拦截器,并且把拦截器注入进去。可是拦截器就是不生效 原因:把拦截器放在了common中,这里都是公共资源,并没有被spring管理进入ioc,所以无法生效...
2024/5/8 13:54:01 - 【HTMLCSSJS】02. HTML表格及表单
HTML表格&表单 table表格(实际开发中非常常用的标签) 表格的主要作用 表格主要是用来显示、展示数据,因为它可以让数据显示的非常的完整,可读性非常好,特别是后台展示数据的时候,能够熟练使用表格就显…...
2024/5/5 15:19:33 - ActiveMQ消息中间件开发过程
消息中间件直连的坏处:直接连接的方式不利于异步传送信息和确保消息的准确到达。 消息中间件的好处: ActiveMQ使用过程—一个轻量级消息中间件将想要使用的消息中间件的JMS Provider加入到工程之中。这就相当于JDBC之类的连接特定平台的接口包。只有用特…...
2024/5/8 13:54:02
最新文章
- Java | Leetcode Java题解之第59题螺旋矩阵II
题目: 题解: class Solution {public int[][] generateMatrix(int n) {int num 1;int[][] matrix new int[n][n];int left 0, right n - 1, top 0, bottom n - 1;while (left < right && top < bottom) {for (int column left; co…...
2024/5/9 3:29:16 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - Redis -- 缓存雪崩问题
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 可能原因 : 同一时间大量的key到期 ; 解决方案: 给不同的Key的TTL添加随机值 利用Redis集群提高服务的可用性 给缓存业务添加降…...
2024/5/7 1:08:08 - 一场人生的风险控制,商业社会识人指南
一、资料前言 本套社会识人资料,大小679.94M,共有37个文件。 二、资料目录 识人的终极目的:一整场人生的风险控制.pdf 信任的搭建:更多的时间与维度.pdf 没有搞不定的人!角色人格与全面人格.pdf 政治不正确的正确…...
2024/5/8 14:53:49 - 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/8 19:32:33 - 【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/9 2:44:26 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/8 20:33:13 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/9 3:15:57 - 【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/8 20:58:56 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/9 1:35:21 - 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/8 18:06:50 - 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/9 1:42:21 - --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/8 12:44:41 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/8 9:51:44 - 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