实训笔记7.19

实训笔记7.19

  • 7.19
    • 一、座右铭
    • 二、Hadoop的HDFS分布式文件存储系统的相关原理性内容
      • 2.1 HDFS上传数据的流程
      • 2.2 HDFS下载数据的流程
      • 2.3 HDFS中NameNode和SecondaryNameNode工作机制(涉及到HDFS的元数据管理操作)
      • 2.4 HDFS中NameNode和DataNode的工作机制(涉及到HDFS的集群管理操作)
    • 三、Hadoop的新的从节点服役和旧的从节点退役(HDFS-DataNode、YARN-NodeManager)--HDFS、YARN的运行中的操作
    • 四、Hadoop的MapReduce分布式计算框架
      • 4.1 基本概念
        • 4.1.1 MapReduce的分布式计算思想
        • 4.1.2 MapReduce运行过程中相关的一些进程
        • 4.1.3 MapReduce编程规范
      • 4.2 MapReduce的工作流程原理(简单版本)
      • 4.3 MapReduce的中序列化机制问题
      • 4.4 MR程序运行的核心阶段的细节性知识
        • 4.4.1 MR程序在运行过程中,涉及到的阶段和作用:
        • 4.4.2 MR程序运行的的第一个阶段:InputFormat阶段
    • 五、MR程序运行的问题总结
    • 六、代码示例

7.19

一、座右铭

我的故事你说,我的文字我落,我值几两你定,我去何方我挑。

二、Hadoop的HDFS分布式文件存储系统的相关原理性内容

2.1 HDFS上传数据的流程

2.2 HDFS下载数据的流程

2.1~2.2:客户端Client 主节点NameNode 从节点DataNode

2.3 HDFS中NameNode和SecondaryNameNode工作机制(涉及到HDFS的元数据管理操作)

  1. 一个概念和两个文件:元数据、edits编辑日志文件、fsimage镜像文件(元数据的持久点检查文件)
  2. SNN的检查点机制:每间隔一段时间或者记录数到达一定的数量,HDFS就会把edits文件和fsimage文件合并
  3. NameNode如果元数据丢失的恢复机制
    1. 把SNN的拷贝过来的edits文件和fismage文件复制到NN的所在目录下(可能会造成元数据的丢失)
    2. 设置NameNode的多目录存储(可以百分百恢复元数据,但是多目录只能在同一个节点上配置)
    3. 使用HA高可用安装模式
  4. HDFS的集群安全模式的问题
    1. HDFS启动之后到能正常对外提供访问的这一段时间成为集群的安全模式
    2. 元数据加载成功,同时整个HDFS集群99.9%的block数据块满足最小备份数的时候

2.4 HDFS中NameNode和DataNode的工作机制(涉及到HDFS的集群管理操作)

  1. DataNode存储的block数据块除了包含数据本身以外,还包含数据块的校验和(保证block块的完整性的)。。。
  2. NameNode和DataNode的心跳机制 每隔3秒
  3. NameNode认为DataNode死亡的掉线时限时长:2*掉线的检测时间(5分钟)+10*心跳时间

三、Hadoop的新的从节点服役和旧的从节点退役(HDFS-DataNode、YARN-NodeManager)–HDFS、YARN的运行中的操作

  1. 新节点的服役:dfs.hosts

  2. 旧节点的退役:dfs.hosts.exclude|

退役的时候,HDFS会把退役节点上的block块迁移到没有退役的节点上

四、Hadoop的MapReduce分布式计算框架

4.1 基本概念

4.1.1 MapReduce的分布式计算思想

  1. Mapper阶段
    1. mapper阶段是用来分数据的
    2. Mapper阶段处理数据之前,数据文件会按照指定的规则划分为不同的切片(数据块),然后Mapper阶段启动多个MapTask去处理每一个切片的数据 MapTask的数量是自动确定的,是和切片的数量一一对应的
  2. Reducer阶段
    1. Reducer阶段是用来合数据的
    2. Reducer阶段是Mapper阶段之后执行的,处理的数据是Mapper处理完成的数据,Reducer会启动多个ReduceTask,每一个ReduceTask负责处理Mapper阶段输出的一部分数据 ReduceTask的数量不是自动确定的,而是我们手动指定,一般ReduceTask的数量在手动指定的时候需要和分区数保持一致

4.1.2 MapReduce运行过程中相关的一些进程

  1. MRAPPMaster
  2. MapTask
  3. ReduceTask

4.1.3 MapReduce编程规范

  1. 编写Mapper阶段的计算逻辑:MapTask的计算逻辑
  2. 编写Reduce阶段的计算逻辑:ReduceTask的计算逻辑
  3. 编写Driver驱动程序:整合MR程序,输入路径、Mapper阶段、Reducer阶段、输出路径

4.2 MapReduce的工作流程原理(简单版本)

在这里插入图片描述

4.3 MapReduce的中序列化机制问题

  1. MR程序的Map阶段和Reduce阶段都是要求输入的数据和输出的数据必须得是key-value键值对类型的数据,而且key-value必须得是序列化类型的数据
    1. 序列化:将Java中的某种数据类型转成二进制数据
    2. 反序列化:将二进制数据转换成某种数据类型
  2. MR程序之所以要求输入和输出的数据是K-V类型的,是因为MR程序是一个分布式计算程序,MR程序可以在多个节点上同时运行的,而且多个计算程序计算出来的结果可能跨节点,跨网络进行数据传输的。如果数据要跨节点跨网络传输,要求数据必须是二进制数据。
  3. Hadoop在进行Key-Value的序列化的时候,没有采用Java的序列化机制(Serializable、Externalizable),因为Java的序列化机制非常的笨重的,因此Hadoop基于Java的序列化机制方式提供了一种全新的专门适用于MR程序的轻量级的序列化机制。
  4. Hadoop中提供了两个接口:Writable、WritableComparable,Hadoop提供的两个序列化机制
    1. Writable
      1. 只有序列化和反序列化的效果,如果我们自定义的一个数据类型(Java类)要想当MR程序的K-V使用的话,Java必须实现Writable接口,重写两个方法,通过这两个方法规定序列化和反序列化的内容
      2. Writable的使用方式类似于Java中Externalizable序列化机制
    2. WritableComparable
      1. 接口除了具备序列化和反序列化的能力以外,还具备一个比较大小关系的方法
      2. 如果自定义的数据类型(Java类),想当MR程序中的key值来使用,必须实现此接口,让自定义数据类型既可以进行序列化反序列化还可以进行大小的比较判断 如果自定义的数据类型只想当作MR程序中的value来使用,只需要实现Writable接口即可,不需要比较大小。
  5. Hadoop常见的序列化类型(Hadoop把Java中包装类和String类型已经给我们封装好了对应的Hadoop序列化类型)—实现了WritableComparable接口
类型方法名
booleanBooleanWritable
byteByteWritable
intIntWritable
floatFloatWritable
longLongWritable
doubleDoubleWritable
stringText
mapMapWritable
arrayArrayWritable
  • 【注意】 1、如果以后MR程序运行没有报错,但是输出目录没有任何的内容,一般可能是因为输入和输出的key-value的自定义类型没有实现序列化 2、如果自定义的JavaBean充当Reducer阶段输出key-value时,最好把toString方法给重写了,否则Reducer最后输出的结果是JavaBean的地址值

4.4 MR程序运行的核心阶段的细节性知识

4.4.1 MR程序在运行过程中,涉及到的阶段和作用:

  1. InputFormat阶段:两个作用
    1. 负责对输入的数据进行切片,切片的数据和Mapper阶段的MapTask的数量是相对应的
    2. 负责MapTask读取切片数据时,如果将切片的数据转换成为Key-value类型的数据,包括key-value的数据类型的定义
  2. Mapper阶段——作用处理每一个切片数据的计算逻辑
  3. Partitioner阶段——map阶段处理完成的数据输出到缓冲区溢写磁盘的时候必须进行分区
  4. Combiner阶段:可以存在可以不存在——相当于是一个Reducer,只不过这个reducer是针对于当前的MapTask有效
  5. Reducer阶段———作用就是用来聚合所有MapTask的数据,聚合起来之后计算逻辑的编写
  6. OutputFormat阶段———作用就是Reducer阶段输出的数据如何以key-value的形式输出到最终的目的地

4.4.2 MR程序运行的的第一个阶段:InputFormat阶段

  1. InputFormat是一个抽象类,提供了两个抽象方法

    1. getSplits:这个方法是用来进行输入数据文件的切片计算的
    2. createRecordReader:这个方法是MapTask读取切片数据时,是按照行读取还是按照其他规则读取,包括读取时key-value分别代表什么含义,什么类型
  2. 常用的InputFormat的实现类:

    1. FileInputFormat(是InputFormat的默认实现类)FileInputFormat是专门用来读取文件数据时使用的输入格式化类,但是FileInputFormat也是一个抽象类

    2. FileInputFormat抽象类有五个常用的非抽象子类

      1. TextInputFormat(是FileInputFormat默认实现类)

        1. 如何切片

          1. 两个核心参数:MinSplitSize=1LMaxSplitSize=Long.MAX_VALUE

            confguration("mapreduce.input.fileinputformat.split.minsize",xxxL)

            configuration("mapreduce.input.fileinputformat.split.maxsize",xxxL)

          2. 每一个输入文件单独进行切片

          3. 每一个文件先获取它的blockSize,然后计算文件的切片大小splitSize=Math.max(minSize, Math.min(maxSize, blockSize))

          4. 先判断文件是否能被切片,如果文件是一个压缩包(.gz、.zip),单独成为一个切片,如果文件能被切片,判断文件的长度是否大于splitSize的1.1倍,如果不大于 文件单独成为一个切片,如果大于1.1倍,按照splitsize切一片,然后将剩余的大小和splitsize继续比较

          5. 示例

            1. 第一种情况: a.tar.gz 300M blocksize 128M 有一个数据切片300M
            2. 第二种情况:blocksize均为128M a.txt 200M 两个切片:一个切片128M 第二个切片72M b.txt 130M 一个切片:130M
          6. 【注意】

            TextInputFormat是按照SplitSize进行切片的,默认情况下SplitSize=文件的BlockSize

            如果你要让SplitSize大于blockSize,那么我们需要在MR程序调整minsize的大小即可

            如果你要让SplitSize小于BlockSize 那么需要MR程序调整maxSize的大小即可

        2. 如何读取数据成为key-value

      2. KeyValueTextInputFormat

      3. NLineInputFormat

      4. CombineInputFormat

      5. SequenceFileInputFormat

  3. 如何自定义InputFormat实现类

五、MR程序运行的问题总结

  1. MR程序运行需要在控制台输出日志,MR程序控制台输出的日志能清洗看到MR程序切片数量以及MapTask的数量和ReduceTask的数量 但是默认情况下控制台是无法输出日志的,如果要输出日志信息,我们需要对代码进行修改

    1. 需要在项目的resources目录引入log4j.properties文件 日志信息输出文件,文件当中定义了我们如何输出日志信息

    2. 引入一个日志框架的依赖,如果没有这个依赖,那么日志文件不会生效输出 pom.xml

      <dependency>      <groupId>org.slf4j</groupId>     <artifactId>slf4j-log4j12</artifactId>      <version>1.7.21</version>    
      </dependency>
      

六、代码示例

package com.sxuek.flow;import org.apache.hadoop.io.Writable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Objects;/*** JavaBean:是Java中一种很干净的类,类中只具备私有化的属性、构造器、getter setter方法  hashCode equals方法 toString方法* 实体类:实体类又是一种特殊的JavaBean,当JavaBean是和数据库中数据表对应的类的时候,JavaBean称之为实体类** JavaBean可以自己手动生成也可以使用lombok的技术基于注解快速的创建JavaBean这个类*    Lombok使用要慎重,Lombok对代码的侵占性是非常大的** 如果自定义的JavaBean要当MR程序的输入和输出的KV值,最好让JavaBean存在一个无参构造器(MR程序底层反射构建这个类的对象)* 如果自定义的JavaBean要充当Reducer阶段的KEY和Value,那也就意味着JavaBean的结果要写到最终的结果文件当中,JavaBean的数据往结果文件写的格式是按照* JavaBean的toString方法去写的。*/
public class FlowBean implements Writable {
//public class FlowBean {private Long upFlow;//上行流量private Long downFlow; //下行流量private Long sumFlow; //总流量public FlowBean() {}public FlowBean(Long upFlow, Long downFlow, Long sumFlow) {this.upFlow = upFlow;this.downFlow = downFlow;this.sumFlow = sumFlow;}public Long getUpFlow() {return upFlow;}public void setUpFlow(Long upFlow) {this.upFlow = upFlow;}public Long getDownFlow() {return downFlow;}public void setDownFlow(Long downFlow) {this.downFlow = downFlow;}public Long getSumFlow() {return sumFlow;}public void setSumFlow(Long sumFlow) {this.sumFlow = sumFlow;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;FlowBean flowBean = (FlowBean) o;return Objects.equals(upFlow, flowBean.upFlow) && Objects.equals(downFlow, flowBean.downFlow) && Objects.equals(sumFlow, flowBean.sumFlow);}@Overridepublic int hashCode() {return Objects.hash(upFlow, downFlow, sumFlow);}@Overridepublic String toString() {return upFlow+"\t"+downFlow+"\t"+sumFlow;}/*** 序列化写的方法* @param out <code>DataOuput</code> to serialize this object into.* @throws IOException*/@Overridepublic void write(DataOutput out) throws IOException {out.writeLong(upFlow);out.writeLong(downFlow);out.writeLong(sumFlow);}/*** 反序列化读取数据的方法* @param in <code>DataInput</code> to deseriablize this object from.* @throws IOException*/@Overridepublic void readFields(DataInput in) throws IOException {upFlow = in.readLong();downFlow = in.readLong();sumFlow = in.readLong();}
}
package com.sxuek.flow;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;/*** 现在有一个文件 phone_data.txt,文件中记录着手机号消耗的流量信息* 文件中每一行数据代表一条手机的流量消耗,每一条数据是以\t制表符分割的多个字段组成的* 使用MR程序统计每一个手机号消耗的总的上行流量、总的下行流量、总流量*/
public class FlowDriver {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException {Configuration configuration = new Configuration();configuration.set("fs.defaultFS","hdfs://192.168.68.101:9000");
//        configuration.set("mapreduce.input.fileinputformat.split.minsize",150*1024*1024+"");//maxsize  100M  minsize  1L  blocksize 128Mconfiguration.set("mapreduce.input.fileinputformat.split.maxsize",100*1024*1024+"");Job job = Job.getInstance(configuration);/*** MR程序封装的时候,按道理需要指定InputFormat类,只有指定了这个实现类,才能实现切片和kv数据的读取* 但是MR程序有个机制,如果没有指定InputFormat的实现类,默认就会实现FileInputFormat的一个实现子类TextInputFormat当作默认的切片机制* 和KV数据读取的InputFormat类*/
//        job.setInputFormatClass(TextInputFormat.class);//封装输入的文件路径 输入路径可以是一个 也可以是多个 输入路径可以是文件也可以是文件夹/*** 默认切片机制 每一个文件单独切片  n个文件 最小有n个文件* splitSize 100M* 文件能否被切割、文件的大小是否大于splitsize的1.1倍* 300M   100M  100M  100M* 120M   100M   20M*/FileInputFormat.setInputPaths(job,new Path("/test1"));//封装Mapper阶段job.setMapperClass(FlowMapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(FlowBean.class);//封装Reducer阶段job.setReducerClass(FlowReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);job.setNumReduceTasks(1);//封装输出结果路径//MR程序要求输出路径不能提前存在 如果提前存在会报错Path path = new Path("/output");//是用来解决输出目录如果存在MR程序报错问题的FileSystem fs = FileSystem.get(new URI("hdfs://192.168.68.101:9000"), configuration, "root");if (fs.exists(path)){fs.delete(path,true);}FileOutputFormat.setOutputPath(job,path);//最后提交程序运行即可boolean b = job.waitForCompletion(true);System.exit(b?0:1);}
}
package com.sxuek.flow;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** 读取切片数据,一行数据读取一次 而且读取的key value  LongWritable  Text* 输出的key value 是Text  FlowBean**/
public class FlowMapper extends Mapper<LongWritable, Text,Text,FlowBean> {@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, FlowBean>.Context context) throws IOException, InterruptedException {String line = value.toString();String[] array = line.split("\t");String phoneNumber = array[1];Long upFlow = Long.parseLong(array[array.length - 3]);Long downFlow = Long.parseLong(array[array.length - 2]);FlowBean flowBean = new FlowBean(upFlow,downFlow,upFlow+downFlow);//需要将这一条数据以手机号为key  以flowbean为value输出给reducecontext.write(new Text(phoneNumber),flowBean);}
}
package com.sxuek.flow;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class FlowReducer extends Reducer<Text,FlowBean,Text,FlowBean> {@Overrideprotected void reduce(Text key, Iterable<FlowBean> values, Reducer<Text, FlowBean, Text, FlowBean>.Context context) throws IOException, InterruptedException {//计算手机号消耗的总的上行 下行 总流量  values中每一条流量的上 下 总累加起来即可long upFlowSum = 0L;long downFlowSum = 0L;long sumFlowSum = 0L;for (FlowBean value : values) {upFlowSum += value.getUpFlow();downFlowSum += value.getDownFlow();sumFlowSum += value.getSumFlow();}//需要以手机号为key  以flowbean为value将结果输出,flowbean需要将我们计算出来总流量信息封装起来FlowBean flowBean = new FlowBean(upFlowSum,downFlowSum,sumFlowSum);context.write(key,flowBean);}
}

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

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

相关文章

小程序自定义步骤条实现

效果展示&#xff1a; 支持背景颜色自定义 <view class"hl_steps"><view class"hl_steps_item" wx:for"{{steps}}" wx:key"id"><view class"hl_steps_item_circle_out" style"background-color: {{col…

【SpringCloud Alibaba】(二)微服务环境搭建

1. 项目流程搭建 整个项目主要分为 用户微服务、商品微服务和订单微服务&#xff0c;整个过程模拟的是用户下单扣减库存的操作。这里&#xff0c;为了简化整个流程&#xff0c;将商品的库存信息保存到了商品数据表&#xff0c;同时&#xff0c;使用商品微服务来扣减库存。小伙…

「苹果安卓」手机搜狗输入法怎么调整字体大小及键盘高度?

手机搜狗输入法怎么调整字体大小及键盘高度&#xff1f; 1、在手机上准备输入文字&#xff0c;调起使用的搜狗输入法手机键盘&#xff1b; 2、点击搜狗输入法键盘左侧的图标&#xff0c;进入更多功能管理&#xff1b; 3、在搜狗输入法更多功能管理内找到定制工具栏&#xff0c…

[数据结构 -- C语言] 二叉树(BinaryTree)

目录 1、树的概念及结构 1.1 树的概念 1.2 树的相关概念&#xff08;很重要&#xff09; 1.3 树的表示 2、二叉树的概念及结构 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质&#xff08;很重要&#xff09; 2.4 练习题 2.5 二叉树的存储结构 2.5.1 顺序存储 2.5.2 链…

Jenkins报警机制的配置与Linux的使用总结

先在钉钉中添加一个机器人 在Configure System中找到机器人选项&#xff0c;并且复制webhook到网络钩子&#xff0c;然后添加机器人的编号、名称和关键词&#xff0c;然后点击测试&#xff0c;如果显示测试成功则表示配置成功&#xff0c;最后保存 再到配置中勾选顶顶机器人的定…

【CMU15-445 FALL 2022】Project #1 - Buffer Pool

About 实验官网 Project #1 - Buffer Pool在线评测网站 gradescope Lab Task #1 - Extendible Hash Table 详见——【CMU15-445 FALL 2022】Project #1 - Extendable Hashing 如果链接失效&#xff0c;请查看当前平台我之前发布的文章。 Task #2 - LRU-K Replacement Polic…

YOLOv5基础知识

定位和检测: 定位是找到检测图像中带有一个给定标签的单个目标 检测是找到图像中带有给定标签的所有目标 图像分割和目标检测的区别&#xff1a; 图像分割即为检测出物体的完整轮廓&#xff0c;而目标检测则是检测出对应的目标。&#xff08;使用框框把物体框出来&#xff…

SAP客制化区域菜单和IMG配置清单

1. 自定义区域菜单 事务代码 SE43&#xff0c;操作如下 添加菜单对象 展示效果 输入区域菜单名称并回车&#xff0c;效果如下 2. 自定义IMG配置 事务代码 SIMGH IMG structure 示例-事务代码入口 示例-表格维护入口 示例-自定义代码控制对象 需要创建dummy表并设置表维护 页面设…

Progressive Dual-Branch Network for Low-Light Image Enhancement 论文阅读笔记

这是22年中科院2区期刊的一篇有监督暗图增强的论文 网络结构如下图所示&#xff1a; ARM模块如下图所示&#xff1a; CAB模块如下图所示&#xff1a; LKA模块其实就是放进去了一些大卷积核&#xff1a; AFB模块如下图所示&#xff1a; 这些网络结构没什么特别的&#xf…

分布式光伏监控系统运维系统实时查看数据分布式光伏电站监控管理

光伏电站是一种利用太阳能发电的设施&#xff0c;随着人们对可再生能源的需求不断增加&#xff0c;光伏电站的建设也越来越普遍。但是&#xff0c;光伏电站的运营和管理需要高质量的监控系统来确保其正常运行。本文将介绍光伏电站监控系统的组成及其原理。 详细软件具体需求可…

【二等奖方案】基于人工智能的漏洞数据分类赛题「道可道,非常道」团队解题思路

2022 CCF BDCI 大赛 数字安全公开赛「基于人工智能的漏洞数据分类」赛题二等奖团队「道可道&#xff0c;非常道」战队获奖方案&#xff0c;赛题地址&#xff1a; http://go.datafountain.cn/s57 团队简介 本团队具有丰富的比赛和项目经验。在AI大赛上多次拿到Top成绩&#xf…

线性表之链表

1、链表概述 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 顺序表的存储位置可以用一个简单直观的公式表示&#xff0c;它可以随机存取表中任意一个元素&#xff0c;但插入和删除需要移动大量元素。链式…

深入理解 PostgreSQL 的架构和内部工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Postman怎么做接口测试-以简单的登录接口为例

我们就以登录某测试系统为例子&#xff0c;实现在Postman上做接口测试 一、首先打开系统首页首页&#xff0c;做一个登录操作&#xff08;目的是获取接口url及参数&#xff09;&#xff1a;一般在公司做接口测试的时候页面还没有出来&#xff0c;我们需要根据接口文档进行接口…

kafka第三课-可视化工具、生产环境问题总结以及性能优化

一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码&#xff1a;el4o 下载解压之后&#xff0c;编辑该文件&#xff0c;修改zookeeper地址&#xff0c;也就是kafka注册的zookeeper的地址&#xff0c;如果是zookeeper集群&#xff0c;以逗号分开 vi conf/application.conf 启…

Python 逻辑回归:理论与实践

文章目录 1. 介绍1.1 什么是逻辑回归&#xff1f;1.2 逻辑回归的应用领域 2. 逻辑回归的原理2.1 Sigmoid 函数2.2 决策边界2.3 损失函数 3. 逻辑回归的实现3.1 数据准备3.2 创建逻辑回归模型3.3 模型训练3.4 模型预测3.5 模型评估 4. 可视化决策边界4.1 绘制散点图4.2 绘制决策…

基于SaaS模式的Java基层卫生健康云HIS系统源码【运维管理+运营管理+综合监管】

云HIS综合管理平台 一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历…

Docker 容器生命周期:创建、启动、暂停与停止----从创建到停止多角度分析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II

#查并集理论知识 并查集用处&#xff1a;解决连通性问题 将两个元素添加到一个集合中。判断两个元素在不在同一个集合 思路&#xff1a;将三个元素A&#xff0c;B&#xff0c;C &#xff08;分别是数字&#xff09;放在同一个集合&#xff0c;其实就是将三个元素连通在一起&a…

Python 算法基础篇:插入排序和希尔排序

Python 算法基础篇&#xff1a;插入排序和希尔排序 引言 1. 插入排序算法概述2. 插入排序算法实现实例1&#xff1a;插入排序 3. 希尔排序算法概述4. 希尔排序算法实现实例2&#xff1a;希尔排序 5. 插入排序与希尔排序的对比总结 引言 插入排序和希尔排序是两种常用的排序算法…