Flink的简单学习(kafka)三

news2024/11/17 1:47:43

一 Kafka的介绍

1.kafka是一个高吞吐的分布式消息系统,是一个消息队列。

2.生产者负责生产数据 ,消费者负责消费数据

3.特点:

生存者消费者模型,FIFO

高性能:单节点支持上千个客户端,百MB/s吞吐

持久性:消息直接持久化在普通磁盘上且性能好

分布式:数据副本冗余、流量负载均衡、可扩展

很灵活:消息长时间持久化+Client维护消费状态

4.性能好的原因

kafka写磁盘是顺序的,所以不断的往前产生,不断的往后写

kafka还用了sendFile的0拷贝技术,提高速度

而且还用到了批量读写,一批批往里写,64K为单位

二 Kafka的搭建

2.1 上传解压修改环境变量

# 解压
tar -zxvf kafka_2.11-1.0.0.tgz -C ../
mv kafka_2.11-1.0.0 kafka-1.0.0


# 配置环境变量
vim /etc/profile

export KAFKA_HOME=/usr/local/soft/kafka-1.0.0
export PATH=$PATH:$KAFKA_HOME/bin

source /etc/profile

2.2 修改配置文件

1.修改config目录下的server.properties文件

broker.id=0 每一个节点broker.id 要不一样
zookeeper.connect=master:2181,node1:2181,node2:2181/kafka
log.dirs=/usr/local/soft/kafka-1.0.0/data   数据存放的位置

2.3 同步

# 同步kafka文件
scp -r kafka-1.0.0/ node1:`pwd`
scp -r kafka-1.0.0/ node2:`pwd`

# 将master中的而环境变量同步到node1和node2中
scp /etc/profile node1:/etc/
scp /etc/profile node2:/etc/

#  在ndoe1和node2中执行source
source /etc/profile

2.4 修改其他节点的文件

# node1
broker.id=1
# node2
broker.id=2

2.5 启动kafka

 1、需要启动zookeeper,  kafka使用zk保存元数据
 需要在每隔节点中执行启动的命令
 zkServer.sh start

2.每个节点中都要启动(去中心化的架构)
# -daemon后台启动

/usr/local/soft/kafka-1.0.0/config/server.properties:配置文件的路径要写全
kafka-server-start.sh -daemon /usr/local/soft/kafka-1.0.0/config/server.properties

3.测试 

任意一个节点输入

kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic shujia

topic shujia:只是名字而已可以随便取

另一个节点输入

kafka-console-consumer.sh --bootstrap-server  master:9092,node1:9092,node2:9092 --from-beginning --topic shujia

但是主要最后这个节点后面的取名也跟前面的一样

4.数据存放在data目录下 但是不知道是哪个节点下的 

5.默认生产者产生的数据可以保存7天,消费者可以在这7天内使用这些数据,7天一过,数据自动销毁

三 Kafka的架构

3.1 基本概念

1.producer:消息生存者

2.consumer:消息消费者

3.broker:kafka集群的server:负责处理消息读、写请求,存储消息

4.topic:消息队列/分类

5.broker就是代理,在kafka cluster这一层这里,其实里面是有很多个broker

6.topic就相当于queue

3.2 消息存储和生产消费模型

1.一个topic分成多个partition。一个topic可以看成一张表,被分成多个分区。一个partition可以看作一个并行度。

2.每个partition内部消息强有序,其中的每个消息都有一个序号叫offset。每个分区内部的数据有有序的,先进先出,但是不同的partition里面的数据出来的顺序是随机的。

3.一个partition只对应一个broker,一个broker可以管多个partition。

4.消息不经过内存缓冲,直接写入文件。

5.根据时间策略删除,而不是消费完就删除

6.producer自己决定往哪个partition写消息,可以是轮询的负载均衡,或者是基于hash的partition策略

7.consumer自己维护消费到哪个offset

8.每个consumer都有对应的group

9.group内是queue消费模型 :

        各个consumer消费不同的partition

        因此一个消息在group内只消费一次

10.group间是publish-subscribe消费模型

        各个group各自独立消费,互不影响

        因此一个消息在被每个group消费一次

 

3.3 使用kafka

3.3.1  创建topic

1.输入命令

kafka-topics.sh --create --zookeeper master:2181,node1:2181,node2:2181/kafka --replication-factor 2 --partitions 3 --topic bigdata

--replication-factor  ---每一个分区的副本数量, 同一个分区的副本不能放在同一个节点,副本的数量不能大于kafak集群节点的数量
--partition   --分区数,  根据数据量设置
--zookeeper zk的地址,将topic的元数据保存在zookeeper中

2.在生产和消费数据时,如果topic不存在会自动创建一个分区为1,副本为1的topic

3.3.2 查看topic描述信息

1.输入命令

kafka-topics.sh --describe  --zookeeper master:2181,node1:2181,node2:2181/kafka --topic bigdata

partition的数字是分区编号,leader后面的数字是节点,后面是存储的分区编号,但是不是匹配的,这里的leader0的分区编号是0与1,leader1的分区编号是1与2,leader2的分区是0与2.

3.3.3 获取所有topic

kafka-topics.sh --list  --zookeeper  master:2181,node1:2181,node2:2181/kafka

2.__consumer_offsetsL kafka用于保存消费便宜量的topic

3.3.4 创建控制台生产者

kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic bigdata

3.3.5 创建控制台消费者

kafka-console-consumer.sh --bootstrap-server  master:9092,node1:9092,node2:9092 --from-beginning --topic bigdata

3.3.6 数据保存的方式

# 1、保存的文件
/usr/local/soft/kafka_2.11-1.0.0/data

# 2,每一个分区每一个副本对应一个目录

# 3、每一个分区目录中可以有多个文件, 文件时滚动生成的
00000000000000000000.log
00000000000000000001.log
00000000000000000002.log

# 4、滚动生成文件的策略
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000

# 5、文件删除的策略,默认时7天,以文件为单位删除
log.retention.hours=168

3.3.7 删除topic

1.先在配置文件vim config/server.properties加一行代码delete.topic.enable=true

再执行命令:

kafka-topics.sh --delete --topic students_hash --zookeeper master:2181,node1:2181,node2:2181/kafka

 四 JavaAPI

4.1 producer

1.先需要创建Properties对象,并设置broker列表以及kv的数据类型

Properties properties = new Properties();

        //指定broker列表
        properties.setProperty("bootstrap.servers", "master:9092,node2:9092,node2:9092");

        //指定key和value的数据格式
        properties.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

2.创建KafkaProducer对象,泛型是上面kv的数据类型,里面传入Properties的对象

 Producer<String, String> producer = new KafkaProducer<String, String>(properties);

3.生产数据:使用KafkaProducer对象中的send方法,里面传入ProducerRecord的对象。前面是topic,后面是数据

producer.send(new ProducerRecord<>("words","java"));

4.刷新并关闭

5.查看去命令行查看,相关命令去看使用Kafka

6.全部代码

package com.shujia.kafka;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Properties;

public class Demo2StudentToKafka {
    public static void main(String[] args)throws Exception {

        Properties properties = new Properties();

        //指定broker列表
        properties.setProperty("bootstrap.servers", "master:9092,node2:9092,node2:9092");

        //指定key和value的数据格式
        properties.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        Producer<String, String> producer = new KafkaProducer<String, String>(properties);

        BufferedReader br = new BufferedReader(new FileReader("flink/data/students.csv"));
        String line =null;
        while ((line=br.readLine())!=null){
            producer.send(new ProducerRecord<>("students",line));
            producer.flush();
        }

        br.close();
        producer.close();

    }
}

 7.hash分区代码

这个分区是先在命令行中已经分好的,然后通过某一个字段的哈希值值分组

kafka-topics.sh --create --zookeeper master:2181,node1:2181,node2:2181/kafka --replication-factor 2 --partitions 3 --topic students_hash

package com.shujia.kafka;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Properties;

public class Demo4StudentToKafka {
    public static void main(String[] args)throws Exception {

        Properties properties = new Properties();

        //指定broker列表
        properties.setProperty("bootstrap.servers", "master:9092,node2:9092,node2:9092");

        //指定key和value的数据格式
        properties.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        Producer<String, String> producer = new KafkaProducer<String, String>(properties);

        BufferedReader br = new BufferedReader(new FileReader("flink/data/students.csv"));
        String line =null;
        while ((line=br.readLine())!=null){

            //通过hash分区,hash分区就是将那个字段的hash值对分区数取余
            String clazz = line.split(",")[4];
            int partition = Math.abs(clazz.hashCode()) % 3;
            //kafka-topics.sh --create --zookeeper master:2181,node1:2181,node2:2181/kafka --replication-factor 2 --partitions 3 --topic students_hash


            //ProducerRecord(String topic, Integer partition, K key, V value)
            producer.send(new ProducerRecord<>("students_hash",partition,null,line));
            producer.flush();
        }

        br.close();
        producer.close();

    }
}

4.2 consume

1. 先需要创建Properties对象,并设置broker列表,kv的数据类型,读取的方式,以及指定消费者组

其中的earliest是全局消费,latest是提交一次offset消费一次,如果不指定,默认是latest

Properties properties = new Properties();
        //kafka 集群列表
        properties.setProperty("bootstrap.servers", "master:9092,node2:9092,node2:9092");

        //读取数据的格式
        properties.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        /*
         * earliest
         * 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
         * latest  默认
         * 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产认值生的该分区下的数据
         * none
         * topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
         *
         */
        properties.setProperty("auto.offset.reset", "earliest");
        //指定消费者组,一条数据在一个组内只消费一次
        properties.setProperty("group.id", "asdsada");

2.创建KafkaConsume对象,泛型是上面kv的数据类型,里面传入Properties的对象

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);

3.订阅topic,封装成一个集合。再使用KafkaConsume对象的subscribe方法,里面传入的是集合

        //订阅topic
        ArrayList<String> topics = new ArrayList<>();
        topics.add("students");
        //subscribe方法里面传的是一个集合,所以要把topic封装成一个集合对象
        consumer.subscribe(topics);

4.设置消费的间隔时间,获取一个迭代器

        ConsumerRecords<String, String> consumerRecords = consumer.poll(1000);

5.遍历迭代器获取里面的元素,包括topic,partition,offset,value,timestamp等等

 for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
            String topic = consumerRecord.topic();
            int partition = consumerRecord.partition();
            long offset = consumerRecord.offset();
            String value = consumerRecord.value();
            long timestamp = consumerRecord.timestamp();
            System.out.println(topic + "\t" + offset + "\t" + partition + "\t" + value + "\t" + timestamp);

        }

6.一般一组只能取500个,想获取完要么改分组名,要么改成死循环,让他一直消费,只要有数据产生,就能一直消费

7.一直取的代码

package com.shujia.kafka;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.util.ArrayList;
import java.util.Properties;

public class Demo3Consumer {
    public static void main(String[] args) {
        Properties properties = new Properties();
        //kafka 集群列表
        properties.setProperty("bootstrap.servers", "master:9092,node2:9092,node2:9092");

        //读取数据的格式
        properties.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        /*
         * earliest
         * 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
         * latest  默认
         * 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产认值生的该分区下的数据
         * none
         * topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
         *
         */
        properties.setProperty("auto.offset.reset", "earliest");
        //指定消费者组,一条数据在一个组内只消费一次
        properties.setProperty("group.id", "asdsada");

        //创建消费者
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);

        //订阅topic
        ArrayList<String> topics = new ArrayList<>();
        topics.add("students");
        //subscribe方法里面传的是一个集合,所以要把topic封装成一个集合对象
        consumer.subscribe(topics);


      while (true){
          ConsumerRecords<String, String> consumerRecords = consumer.poll(1000);
          for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
              String topic = consumerRecord.topic();
              int partition = consumerRecord.partition();
              long offset = consumerRecord.offset();
              String value = consumerRecord.value();
              long timestamp = consumerRecord.timestamp();
              System.out.println(topic + "\t" + offset + "\t" + partition + "\t" + value + "\t" + timestamp);

          }
      }




    }
}

五 Flink On Kafka

5.1 kafka source

1.见代码

package com.shujia.flink.kafka;

import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class Demo1KafkaSource {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //创建kafka source
        KafkaSource<String> source = KafkaSource.<String>builder()
                .setBootstrapServers("master:9092,node1:9092,node2:9092")//kafka集群列表
                .setTopics("students")//指定消费的topic
                // 从消费组提交的位点开始消费,如果提交位点不存在,使用最早位点
                //.setStartingOffsets(OffsetsInitializer.committedOffsets(OffsetResetStrategy.EARLIEST))
                // 从最早位点开始消费
                //.setStartingOffsets(OffsetsInitializer.earliest())
                // 从最末尾位点开始消费
//                .setStartingOffsets(OffsetsInitializer.latest())
                .setStartingOffsets(OffsetsInitializer.earliest())
                .setValueOnlyDeserializer(new SimpleStringSchema())//指定读取数据的格式
                .build();

        //使用kafka source
        DataStreamSource<String> studentsDS = env
                .fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source");

        studentsDS.print();

        env.execute();
    }
}

5.2 kafka sink

package com.shujia.flink.kafka;

import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.connector.base.DeliveryGuarantee;
import org.apache.flink.connector.kafka.sink.KafkaRecordSerializationSchema;
import org.apache.flink.connector.kafka.sink.KafkaSink;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class Demo2KafkaSink {
    public static void main(String[] args) throws Exception{
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStream<String> carsDS = env.readTextFile("flink/data/cars_sample.json");

        //创建kafka sink
        KafkaSink<String> sink = KafkaSink.<String>builder()
                .setBootstrapServers("master:9092,node1:9092,node2:9092")//kafka集群列表
                .setRecordSerializer(KafkaRecordSerializationSchema.builder()
                        .setTopic("cars")//指定topic
                        .setValueSerializationSchema(new SimpleStringSchema())//指定数据格式
                        .build()
                )
                //指定数据处理的语义
                .setDeliverGuarantee(DeliveryGuarantee.AT_LEAST_ONCE)
                .build();

        //使用kafka sink
        carsDS.sinkTo(sink);

        env.execute();
    }
}

5.3 代码打包到服务器运行

1.导入依赖,将flink-sql-connector-kafka-1.15.2.jar放到flink/lib目录下

2.执行命令随便选一个

flink run-application -t yarn-application -c com.shujia.flink.kafka.Demo3Cars flink-1.0.jar 
 

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

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

相关文章

Pycharm创建Conda虚拟环境时显示CondaHTTPErOT

原因&#xff1a;conda源出问题了&#xff0c;之前可以用&#xff0c;现在报错。 最好的解决方案&#xff1a;找到conda源&#xff0c;换源即可。 步骤&#xff1a; 1.修改 .condarc 文件&#xff08;文件的位置在&#xff1a;C:\Users\(你的用户名)\.condarc&#xff09;&a…

关于认证协议

本地用户认证 本地认证的意思就是&#xff0c;我们的电脑上存储着自己的账号密码&#xff0c;无论电脑是否联网&#xff0c;只要能开机&#xff0c;就可以输入账号密码登录到电脑中&#xff0c;工作组就是采用本地认证 本地认证流程 winlogon.exe -> 接收用户输入 -> …

基于深度学习的中文标点预测模型-中文标点重建(Transformer模型)【已开源】

基于深度学习的中文标点预测模型-中文标点重建&#xff08;Transformer模型&#xff09;提供模型代码和训练好的模型 前言 目前以深度学习对文本自动添加标点符号研究很少&#xff0c;已知的开源项目并不多&#xff0c;详细的介绍就更少了&#xff0c;但对文本自动添加标点符号…

AVL树的介绍与实现

前言 我们上一期介绍了二叉搜索树并做了实现&#xff0c;本期我们来继续学习另一个更优的树即AVL树&#xff01; 本期内容介绍 什么是AVL树&#xff1f; AVL树的实现 AVL树的性能分析 在正式的介绍AVL树之前&#xff0c;我们先来回忆一下二叉搜索树的特点&#xff1a;左子树的…

专业好用的屏幕捕获工具

一、简介 1、一款功能全面、操作简便的屏幕捕获工具,它不仅支持常规的截屏功能,还包括了录屏、OCR文字识别、翻译、GIF制作等多项实用功能。该软件适用于Windows操作系统,旨在为用户提供一站式的屏幕捕捉解决方案 二、下载 1、下载地址: 官网链接:https://verycapture.com…

第二十七章HTML.CSS综合案例

1.产品介绍 效果图如下&#xff1a; 代码部分如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

【UnityShader入门精要学习笔记】第十七章 表面着色器

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 表面着色器…

274 基于matlab的随机粗糙表面对微气体轴承内气体压强分布的影响

基于matlab的随机粗糙表面对微气体轴承内气体压强分布的影响。采用差分法求解气体轴承的雷诺方程&#xff0c;通过尺寸参数、分形维数对粗糙度表面设置&#xff0c;滑流参数设置&#xff0c;实现气压分布可视化结果显示。程序已调通&#xff0c;可直接运行。 274 气体轴承 随机…

SpringCloud-面试篇(二十三)

&#xff08;1&#xff09;SpringCloud常见组件有那些 有无数微服务需要相互调用&#xff1a;可以用远程调用组件OpenFeign组件&#xff0c;也可以用Dobble 这么多微服务相互调用怎么管理&#xff1a;就用到注册中心组件Nacos&#xff0c;Eureka 所有的服务去找注册中心做注…

【Vue3-Element-Admin 动态路由】涉及到的配置

Vue3-Element-Admin 动态路由 涉及到的配置 0. Vue3-Element-Admin 项目地址1. router/index.ts2. Mock接口模拟数据3. store/permission4. api/menu5. plugins/permission 这篇文章讲的主要是 Vue3-Element-Admin 差不多内置的动态路由配置 (根据后端接口渲染) 先把开发环境&a…

vue3+three.js给glb模型设置视频贴图

1.在网上下载一个显示屏或者自己画一个,在blender中设置好显示屏的Mesh,UV设置好,这样方便代码中添加纹理贴图。可以让美术在建模软件中,先随机设置一张图片作为纹理,验证UV是否设置好 关于如何 在blender中给模型设置UV贴图百度很多的 // 视频 import * as THREE from…

直播回顾丨GQL 与新版本悦数图数据库亮点解析

5 月 23 日&#xff0c;悦数图数据库产品总监方扬亲临直播间&#xff0c;为我们深入剖析了 GQL 的技术内核&#xff0c;以及它如何引领图数据库技术的全新变革。同时&#xff0c;还揭秘了新版悦数图数据库的众多技术特点&#xff0c;让人眼前一亮。 添加图片注释&#xff0c;不…

python的模块

什么是模块&#xff08;Module&#xff09; 在计算机程序的开发过程中&#xff0c;随着程序代码越写越多&#xff0c;写在一个文件里的代码就会越来越长&#xff0c;越来越不容易维护。 为了让代码方便维护&#xff0c;我们将代码进行分类&#xff0c;分别放到不同的文件里。…

Xcode中给UIView在xib中添加可视化的属性

给UIView在xib中添加可视化的属性 效果如下图&#xff1a; 可以直接设置view 的 borderColor 、borderWidth、cornerRadius&#xff0c;也可以单独指定view的某个角是圆角。减少了代码中的属性。 完整代码&#xff1a; UIViewBorder.h #import <UIKit/UIKit.h>inter…

Python - 深度学习系列38 重塑实体识别5-预测并行化改造

说明 在重塑实体识别4中梳理了数据流&#xff0c;然后我发现pipeline的串行效率太低了&#xff0c;所以做了并行化改造。里面还是有不少坑的&#xff0c;记录一下。 内容 1 pipeline 官方的pipeline看起来的确是比较好用的&#xff0c;主要是实现了比较好的数据预处理。因为…

【全网唯一】触摸精灵iOS版纯离线本地文字识别插件

目的 触摸精灵iOS是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。但触摸精灵的图色功能比较单一&#xff0c;无法识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要…

电脑没电关机,wsl和docker又挂了,附解决过程

如题&#xff0c;开了个会没带笔记本电源&#xff0c;点啊弄关机后docker打不开&#xff0c;我以为是docker坏了&#xff0c;结果docker报错&#xff1a; An unexpected error occurred while executing a WSL command. Either shut down WSL down with wsl --shutdown, and/or…

day32--Spring(一)

一、Spring简介 1 Spring课程介绍 问题导入 我们为什么要学习Spring框架&#xff1f; 1.1 为什么要学 Spring技术是JavaEE开发必备技能&#xff0c;企业开发技术选型命中率>90% 专业角度 简化开发&#xff0c;降低企业级开发的复杂性框架整合&#xff0c;高效整合其他技…

概率分布、回归分析、假设检验……用 DolphinDB 函数库快速实现概率统计分析

在金融和物联网等领域&#xff0c;概率统计与分析扮演着至关重要的角色。DolphinDB 作为一款强大的时序数据库&#xff0c;提供了一系列内置的概率统计与分析函数&#xff0c;能够满足用户的各种需求。 金融领域 风险管理&#xff1a;通过概率统计分析&#xff0c;金融机构可…

python数据分析——逻辑回归

参考资料&#xff1a;活用pandas库 逻辑回归 当响应变量为二值响应变量时&#xff0c;经常使用逻辑回归对数据建模。 # 导入pandas库 import pandas as pd # 导入数据集 acspd.read_csv(r"...\data\acs_ny.csv") # 展示数据列 print(acs.columns) # 展示数据集 pri…