实训笔记8.30

news2024/7/6 20:05:17

实训笔记8.30

  • 8.30笔记
    • 一、项目开发流程一共分为七个阶段
      • 1.1 数据产生阶段
      • 1.2 数据采集存储阶段
      • 1.3 数据清洗预处理阶段
      • 1.4 数据统计分析阶段
      • 1.5 数据迁移导出阶段
      • 1.6 数据可视化阶段
    • 二、项目数据清洗预处理的实现
      • 2.1 清洗预处理规则
      • 2.2 代码实现
    • 三、项目的数据统计分析阶段
      • 3.1 概念和技术选项
      • 3.2 Hive数据仓库进行统计分析时两个核心概念
        • 3.1.1 数据仓库分层
        • 3.2.2 数据仓库建模
      • 3.3 数据统计分析的实现(最好把所有的HQL代码写到一个SQL文件中,最后统一执行运行) 统计分析必须启动HDFS和YARN
        • 3.3.1 构建ODS层
        • 3.3.2 构建DWD层
        • 3.3.3 构建ADS层
    • 四、模拟其他年份,其他月份,其他日期的数据
    • 五、相关代码

8.30笔记

一、项目开发流程一共分为七个阶段

1.1 数据产生阶段

1.2 数据采集存储阶段

1.3 数据清洗预处理阶段

1.4 数据统计分析阶段

1.5 数据迁移导出阶段

1.2~1.5:大数据开发阶段

1.3~1.5:周期性调度执行,三个阶段需要通过azkaban任务调度工具进行自动化周期调度执行,
(项目的第7个阶段,任务调度阶段)

1.6 数据可视化阶段

二、项目数据清洗预处理的实现

2.1 清洗预处理规则

数据清洗规则

  1. 一条用户行为数据如果字段个数不足16,那么数据不完整,舍弃

  2. 一条用户行为数据中如果响应状态码大于等于400的,那么数据访问错误,舍弃

  3. 一条用户行为数据中省份 纬度 经度 年龄以-填充的,那么代表数据缺失,舍弃

    数据预处理规则

  4. 预处理规则:清洗完成的数据中最后在输出时,有很多的字段我们不需要的,因此我们需要对部分数据进行舍弃,对需要保留的字段数据以\001特殊字符分割输出

技术选项:MapReduce技术

2.2 代码实现

【注意】

  1. 因为我们只需要做数据的清洗预处理操作,不涉及到聚合操作,因此我们只需要一个Mapper阶段即可,不需要reduce阶段
  2. MapReduce数据清洗预处理是周期性调度执行的,一天执行一次,第二天处理前一天采集存储的数据,前一天采集存储的数据是以时间为基准的动态目录下存放,因此MR程序处理数据时,输入数据的目录必须得是昨天时间的目录。 【注意】会在第二天处理前一天的数据,一般会在第二天的凌晨去处理第一天采集存储的数据。(任务调度的事情)
  3. MR程序处理完成的数据输出到HDFS上,但是数据清洗预处理完成的数据给Hive做统计分析的,Hive我们也是一天执行一次,Hive是在数据清洗预处理完成之后执行的。 MR程序处理完成的数据输出到HDFS上时,也必须以基于时间的动态目录存放
  1. 创建Maven项目,引入MR的编程依赖
  2. 编写MR程序的Mapper程序和Driver驱动程序
  3. 在本地测试运行无问题之后,需要将代码打成jar包上传到大数据环境中在YARN上运行 必须启动YARN

三、项目的数据统计分析阶段

3.1 概念和技术选项

统计分析就是基于我们清洗预处理完成的高质量,从不同的数据纬度聚合数据,或者对数据进行计算得到我们感兴趣的一些指标或者是对网站运营发展有关的一些指标。

统计分析进行数据计算时,可能涉及到大量的聚合操作以及一些排名、排序等等操作,而这些操作也都是数据计算,那么我们就可以使用大数据计算框架完成,而大数据计算框架MapReduce如果要聚合、排序、分组等操作,MR代码就会非常的复杂。因此我们一般做统计分析时有一个想法,既能计算大量的数据,还能快速简单的进行数据的聚合、排名、分组等操作。就可以使用Hive数据仓库技术完成。

【注意】基本上到现在为止,如果我们要做大数据统计分析,不是直接使用大数据计算框架(MapReduce、Spark、Flink),因为大数据统计分析涉及到大量的聚合、排序、分组等等操作,操作如果直接使用大数据计算框架代码会非常的复杂。基本上都是使用类SQL(表面上写的是类SQL语句,底层还是大数据计算框架)的方式进行大数据统计分析的。

Hadoop—Hive

Spark—Spark SQL

Flink—Flink SQL

3.2 Hive数据仓库进行统计分析时两个核心概念

3.1.1 数据仓库分层

数据仓库建模是用来梳理表和表之间的关系的,便于我们后期进行统计分析。数据仓库分层是我们使用数据仓库进行统计分析的开发流程。

数据仓库分层从最底层开始到最高层主要有如下三层(不同的公司基于三层更加细致的分层)

  1. ODS层(数据贴源层)

如果我们要使用Hive数据仓库做统计分析,首先我们需要把清洗预处理完成的数据导入到Hive中加载成为一个数据表,ODS层指的就是把清洗预处理完成的数据原模原样的导入到Hive中,导入进来之后这些表组成了ODS层

  1. DW层(数据仓库层)–Hive统计分析的核心 数据仓库建模的阶段

    1. DWD层(明细宽表层)

      把ODS层的数据表可以再次处理一下构建成为一个明细宽表

      明细宽表一般会把ODS层的字段拆分成更加细粒度的字段,便于我们后期好做统计分析(时间字段)

    2. DIM层(纬表层)

纬度表如果比较多,那么纬度表单独划分到DW的DIM层

  1. ADS层(数据应用层)

将统计分析的结果以指标表的形式存储到ADS层

3.2.2 数据仓库建模

建模的目的是为了方便我们后期统计分析

在使用Hive进行数据统计分析时,首先必须先把清洗预处理完成的数据加载到Hive中成为数据表,而且一般在真实的企业项目中,清洗预处理完成数据不止一个,各种各样的数据,数据和数据之间都是有关系的。

所谓的数据仓库建模就是我们在对数据进行清洗预处理的时候,清洗预处理完成之后的多个数据之间的关系梳理建模

  1. 数据仓库建模的名词解释

    1. 事实表:一张表中基本全都是外键,如果我们需要查询数据,需要将这个表和各个对应的其它数据表进行关联查询才能得到我们想要的数据 订单表
    2. 维度表:事实表中外键对应的详细信息存储的表,而且他也是我们统计分析时纬度信息 用户表 商品表
  2. 数据仓库模型建立有很多种方式的,主要分为

    1. 3NF数据仓库建模

    2. 纬度建模

      1. 星型模型

        事实表直接与纬度表关联,而且只有一级关联

      2. 雪花模型

        事实表直接与维度表关联,纬度表拆分出更加细致的一些纬度表

      3. 星座模型

        在一个数仓中,事实表有多个,每一个事实表都有它自己对应的纬度表,纬度表还有它的二级纬度表

如何完成建模?数据清洗预处理的时候,把数据处理成为合适的模型结构

3.3 数据统计分析的实现(最好把所有的HQL代码写到一个SQL文件中,最后统一执行运行) 统计分析必须启动HDFS和YARN

3.3.1 构建ODS层

ODS层指的是我们把清洗预处理完成的数据不加以任何的处理,直接原模原样的在Hive中构建与之对应的表格,并且把数据装载到表格当中

清洗预处理完成的数据格式以\001特殊字符分割的,这样的话可以避免分隔符和字段的中一些符号冲突,导致装载数据到Hive出现串行的问题。

Hive中数据表有很多分类的:内部表、外部表、分区表、分桶表

考虑:数据统计分析一天执行一次,也就意味着我们每天处理完成的数据都需要往Hive的ODS层的数据表导入一份,如何区分ODS层导入的数据是哪一天?需要构建一个分区表(基于时间的)。外部表

3.3.2 构建DWD层

DWD明细宽表层就是把ODS层的数据表字段拆分成为更加细粒度的字段,便于我们后期的统计分析。 DWD层说白了就是在ODS的数据表基础之上在多增加一些冗余字段,但是方便我们后期操作了

  1. ODS层的字段如下:

  1. 可以拆分的字段主要有两个

    1. 时间字段:后期需要基于细粒度的时间做统计分析

    2. 来源URL字段:后期统计站内站外的流量占比,站内站外的对比是基于HOST主机名/域名——HOST

DWD层这个数据表就属于我们Hive的自有表了,因此明细宽表我们构建成为内部分区表即可

明细宽表中没有数据,明细宽表中的数据从什么地方来?因为DWD层是基于ODS层建立的,因此DWD层的数据需要从ODS层查询获得。 需要从ODS层对应的数据表中查询指定的数据添加到DWD层当中(注意一下分区的问题)。

3.3.3 构建ADS层

ADS层其实就是我们基于DW数据仓库库构建的DWD和DIM层的数据表,进行查询,通过聚合、分组、排序等等操作统计相关的指标,得到指标数据,然后将指标数据存储到一个Hive数据表中。

  1. 基于时间纬度的指标

    1. 统计网站每年的用户的流量

      网站每天都会产生数据,每一天数据一增加,那么当前年份的用户访问量必然增加一天的数据

      思路:不是针对明细宽表某一个分区的数据进行统计分析,而是针对于明细宽表中整体数据集进行统计分析(所有的分区进行操作)

      实现:因为在明细宽表中已经拆分除了visit_year字段,因此我们只需要根据visit_year分区聚合数据即可得到,每一年的用户访问量

      select visit_year,count(*) from dwd_user_behavior_detail group by visit_year;

    2. 统计网站每一年不同月份的用户流量

      1. 实现同上
      2. 区别:分组时,需要根据年和月来分组
    3. 统计网站每一年不同月份下每天用户的访问量

      1. 实现同上
      2. 区别:分组的时候,需要根据年、月、日三个字段来分组
    4. 统计网站每一年不同月份下每天的每小时用户的访问量

      1. 实现同上
      2. 区别:分组的时候,需要根据年、月、日、时四个字段来分组
    5. 统计网站每一年每一个月的流量相比于上个月的比例:开窗函数(上边界和下边界),针对每一年不同月份的用户流量指标的二次分析结果

  2. 基于地理纬度的指标

    1. 统计每天网站不同省份用户的访问量
    2. 每天访问量TOP10的省份
  3. 基于用户纬度的指标

    1. 统计不同年龄段用户的访问量
    2. 统计每天网站的独立访客数
  4. 基于终端纬度的指标——统计网站用户使用的不同浏览器的占比情况

  5. 基于来源纬度的指标——统计网站每天站内和站外的流量占比

  6. 指标有很多,可以进行各种自由扩展

四、模拟其他年份,其他月份,其他日期的数据

只需要通过date -s “时间” 系统时间改成我们想要模拟数据的日期即可

把以前产生的userBehavior.log文件删除了

然后启动采集程序 启动数据模拟程序

处理数据,只需要再把系统时间往后调整一天

五、相关代码

-- 0、创建一个项目专属的数据库
create database if not exists project;
use project;
-- 1、构建ODS层的数据表,数据表和清洗预处理完成的数据格式一致的表格 而且ODS层的表格是外部分区表
create external table if not exists ods_user_behavior_origin(
   ip_addr string, --ip地址
   visit_time string,-- 浏览时间
   request_url string,-- 行为触发之后的请求网址
   referer_url string,-- 来源网址
   user_agent string,-- 用户使用的浏览器信息
   province string, --省份
   latitude string, -- 纬度
   longitude string, -- 经度
   age int --年龄
)partitioned by(data_gen_time string)
row format delimited fields terminated by '\001'; 

-- 2、需要将清洗预处理完成的昨天的数据(/dataClean/yyyy-MM-dd)导入到ods层的昨天时间分区中。
load data inpath '/dataClean/${hiveconf:yesterday}' into table ods_user_behavior_origin partition(data_gen_time='${hiveconf:yesterday}')

-- 3、构建DWD明细宽表层  就是在ods数据表基础之上增加了五列字段 visit_year  visit_month  visit_day  visit_hour referer_host
create  table if not exists dwd_user_behavior_detail(
   ip_addr string, --ip地址
   visit_time string,-- 浏览时间
   visit_year string, --拆分的浏览年份
   visit_month string,----拆分的浏览月份
   visit_day string,---拆分的浏览天
   visit_hour string,---拆分的浏览时
   request_url string,-- 行为触发之后的请求网址
   referer_url string,-- 来源网址
   referer_host string, -- 来源网址的域名
   user_agent string,-- 用户使用的浏览器信息
   province string, --省份
   latitude string, -- 纬度
   longitude string, -- 经度
   age int --年龄
)partitioned by(data_gen_time string)
row format delimited fields terminated by '\001'; 

-- 4、从贴源数据表查询明细宽表所需的数据,然后把数据增加到明细宽表的昨天的时间分区中
insert overwrite table dwd_user_behavior_detail partition(data_gen_time='${hiveconf:yesterday}')
select 
	ip_addr,
	visit_time,
	date_format(visit_time,'yyyy') as visit_year,
	date_format(visit_time,'MM') as visit_month,
	date_format(visit_time,'dd') as visit_day,
	date_format(visit_time,'HH') as visit_hour,
	request_url,
	referer_url,
	parse_url(referer_url,'HOST') as referer_host,
	user_agent,
	province,
	latitude,
	longitude,
	age
from ods_user_behavior_origin 
where data_gen_time='${hiveconf:yesterday}';

-- 5、构建数据应用层 统计各种各样的指标数据,并且把指标数据保存到Hive对应的指标表中 指标表的结构必须和我们查询的指标数据一致的
--(1)基于时间纬度--统计网站每年用户的流量
create table if not exists ads_year_flow(
   visit_year string,
   flow bigint
)row format delimited fields terminated by '\001';

-- 将统计的结果覆盖添加到基于年份的指标表中 防止年份流量数据重复
insert overwrite table ads_year_flow
select  visit_year,count(*)  from dwd_user_behavior_detail group by visit_year;


-- (2)统计网站每一年不同月份的用户流量
create table if not exists ads_month_flow(
   visit_year string,
   visit_month string,
   flow bigint
)row format delimited fields terminated by '\001';

insert overwrite table ads_month_flow
select  visit_year,visit_month,count(*)  from dwd_user_behavior_detail group by visit_year,visit_month;
package com.sxuek;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * MR程序的驱动程序
 *   封装MR程序的
 */
public class DataCleanDriver {
    public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException, ClassNotFoundException {
        //1、准备一个配置文件对象 用来封装MR程序运行的一些相关配置
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.38.101:9000");

        //2、准备一个用于封装MR程序的Job对象
        Job job = Job.getInstance(conf);
        //3、设置一个jar包的位置判断 是为了让MR程序打成jar包以后可以正常运行
        job.setJarByClass(DataCleanDriver.class);

        //4、配置MR程序的InputFormat以及我们的输入文件路径
        job.setInputFormatClass(TextInputFormat.class);
        //输入文件路径是采集存储的昨天的数据目录 /dataCollect/yyyy-MM-dd 在驱动程序中获取昨天的时间
        Calendar cal = Calendar.getInstance();//默认是今天的时间
        cal.add(Calendar.DAY_OF_MONTH,-1);
        Date date = cal.getTime();
        //需要把获取的昨天的时间转换称为yyyy-MM-dd这种格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String yesterday = sdf.format(date);
        String inputPath = "/dataCollect/"+yesterday;
        System.out.println("待处理的数据目录为"+inputPath);
        TextInputFormat.setInputPaths(job,new Path(inputPath));

        //5、封装Mapper阶段
        job.setMapperClass(DataCleanMapper.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(NullWritable.class);

        //6、封装Reducer阶段
        job.setNumReduceTasks(0);

        //7、封装OutputFormat  封装输出目录 输出目录也得是一个动态目录 /dataClean/yyyy-MM-dd
        job.setOutputFormatClass(TextOutputFormat.class);
        Path outPath = new Path("/dataClean/"+yesterday);
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.38.101:9000"), conf, "root");
        if (fileSystem.exists(outPath)){
            fileSystem.delete(outPath,true);
        }
        TextOutputFormat.setOutputPath(job,outPath);

        //8、提交MR程序运行 然后运行成功合理的关闭MR程序
        boolean flag = job.waitForCompletion(true);
        System.exit(flag?0:1);
    }
}
package com.sxuek;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * MR程序的Mapper阶段
 *   四个泛型:Mapper阶段的输入key value  输出key value
 *   因为采集存储的数据是以纯文本文档的形式在HDFS上存放的,而且一个文件采集存储的时候设置128M
 *   因此我们清洗预处理时,一个文件正好可以当作一个切片使用,不存储大量的小文件
 *   所以我们MR程序的InputFormat我们直接使用默认TextInputFormat机制即可
 *
 * 因为数据清洗预处理只需要mapper阶段,不需要reduce阶段,因此mapper阶段的输出就是最终输出
 * mapper输出的就是每一行清洗预处理完成的一行数据
 */
public class DataCleanMapper extends Mapper<LongWritable, Text,Text, NullWritable> {
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, NullWritable>.Context context) throws IOException, InterruptedException {
        /**
         * 1、获取到切片中对应的每一行的用户行为日志数据
         * 172.83.232.165 - - 2023-08-29 15:19:32 "POST https://www.bailongma.com/category/b HTTP/1.1" 200 15075 https://www.baidu.com/search Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0 广东 23.08 113.14 56
         */
        String line = value.toString();
        /**
         * 2、将用户行为数据以空格分割得到一个数组 数组中存放的就是用户行为数据对应的多个字段
         */
        String[] array = line.split(" ");
        //拿到数组之后 我们应该先进行一个字段个数不合法的清洗过程
        if (array.length < 16){
            return;
        }

        //获取用户行为数据中各种字段信息
        //获取用户的访问IP 第一个字段
        String ip = array[0];
        //获取用户的访问时间  第四个字段和第五字段两部分组成
        String time = array[3]+" "+array[4];
        //获取用户的请求URL  第七个字段
        String requestURL = array[6];
        //获取用户的响应状态码  第九个字段 而且是整数类型
        int code = Integer.parseInt(array[8]);
        //获取用户的来源URL  第11个字段
        String refererURL = array[10];
        //获取用户的浏览器信息 字段个数不确定  但是浏览器的位置一定是从第12个字段开始到倒数第五个字段结束
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 11; i <= array.length-5 ; i++) {
            stringBuffer.append(array[i]);
        }
        String userAgent = stringBuffer.toString();
        //获取用户的省份 纬度 经度 年龄
        String province = array[array.length - 4];
        String latitude = array[array.length - 3];
        String longitude = array[array.length - 2];
        String age = array[array.length - 1];

        /**
         *  3、清洗过程
         */
        //清洗状态码大于等于400的
        if (code >= 400){
            return;
        }
        //把地理位置信息和用户年龄为-的数据舍弃
        if (province.equals("-") || latitude.equals("-") || longitude.equals("-") || age.equals("-")){
            return;
        }

        /**
         *  4、将数据预处理成我们想要的格式
         *  ip,访问时间,请求URL,来源URL,用户浏览器,省份,纬度,经度,年龄
         */

        StringBuffer sb = new StringBuffer();
        //append可以一直拼接  链式编程 方法执行完成返回当前方法的调用对象
        sb.append(ip).append(",").append(time).append(",").append(requestURL).append(",")
                .append(refererURL).append(",").append(userAgent).append(",").append(province)
                .append(",").append(latitude).append(",").append(longitude).append(",").append(age);
        String result = sb.toString();
        //5、输出预处理之后的结果数据即可
        context.write(new Text(result),NullWritable.get());
    }
}

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

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

相关文章

Linux通信--构建进程通信IPC的方案之共享内存|实现使用共享内存进行serverclient通信

共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;即进程不再通过执行进入内核的系统调用来传递彼此的数据。 目录 一、共享内存的原理 二、使用共享内存 三、共享内存函数 1.shmget(用来创建共…

字节跳动岗位的薪酬体系曝光,看完感叹:真的不服不行

曾经的互联网是PC的时代&#xff0c;随着智能手机的普及&#xff0c;移动互联网开始飞速崛起。而字节跳动抓住了这波机遇&#xff0c;2015年&#xff0c;字节跳动全面加码短视频&#xff0c;从那以后&#xff0c;抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节…

Web3数据云OORT推出商用版智能代理构建平台:OORT TDS

随着技术进步和数据隐私问题的日益凸显&#xff0c;生成式AI和去中心化技术联手为企业和个人开辟了全新的互动视野。站在这一趋势的前沿&#xff0c;OORT展现了其在去中心化数据云领域的技术实力&#xff0c;作为行业的领先者&#xff0c;今日Oort正式宣布OORT TDS (Talk-to-Da…

MAGNA 直连 EDI 解决方案

全球首屈一指的汽车零部件供应商&#xff0c;在28个国家设有335家制造工厂&#xff0c;96个产品开发、工程和销售中心。产品主要包括制造车身、底盘、外饰、座椅、动力总成、电子、主动驾驶辅助、镜像、闭锁以及车顶系统&#xff0c;拥有多个领域的电子和软件工程能力。 MAGNA与…

row_number() over(partition by xx order by xx desc)

一、目的 主要用于根据某个字段对数据分组去重 二、demo 1. 有数据表 duplicate_test 如下 2. 使用 name 作为 key 对数据分组&#xff0c;并增加一列标识序号 idx&#xff08;根据 时间戳倒序标记序号&#xff09; select name,row_number() over(partition by name order…

IT6225B芯片方案|替代IT6225B方案|CS5366国产Typec转hdmi投屏方案

国产CS5366 透过模拟与数字的设计及28nm先进制程工艺,大幅降低功耗,无需增加散热片,提高产品可靠性,CS5366完全替代联阳IT6225B/IT6225,CS5366是一款Type-C转HDMI 2.0 4K60USB 3.0PD3.1/3.0高集成度视频转换芯片方案. 1.cs5366功耗低&#xff1a; CS5366系列符合USB电源传输规…

TCP数据报结构分析(面试重点)

在传输层中有UDP和TCP两个重要的协议&#xff0c;下面将针对TCP数据报的结构进行分析 关于UDP数据报的结构分析推荐看UDP数据报结构分析&#xff08;面试重点&#xff09; TCP结构图示 TCP报头结构的分析 一.16位源端口号 源端口表示发送数据时&#xff0c;发送方的端口号&am…

IO模型:阻塞和非阻塞

一、五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉 非阻塞&#xff1a;不能操作就返回错误 多路复用&#xff1a;委托中介监控 信号驱动&#xff1a;让内核如果能操作时发信号&#xff0c;在信号处理函数中操作 异步IO&#xff1a;向内核注册操作请求&…

ES+Redis+MySQL,这个高可用架构设计太顶了!

目录 背景ES 高可用方案会员 Redis 缓存方案高可用会员主库方案异常会员关系治理展望&#xff1a;更精细化的流控和降级策略 背景 会员系统是一种基础系统&#xff0c;跟公司所有业务线的下单主流程密切相关。如果会员系统出故障&#xff0c;会导致用户无法下单&#xff0c;…

RS485隔离电路方案

RS485总线是一种使用平衡发送&#xff0c;差分接收实现通讯的通用串口通信总线&#xff0c;由于其具有抗共模干扰能力强、成本低、抗噪能力强、传输距离远、传输速率高、可连接多达256个收发器等优点&#xff0c;广泛应用于工业智能仪表&#xff0c;通讯设备等各个领域。 RS485…

Flutter:getX的学习

前言 学习教程&#xff1a;Getx教程_FlutterGetx系列实战教程 简介 getX是第三方的状态管理插件&#xff0c;不仅具有状态管理的功能&#xff0c;还具有路由管理、主题管理、国际化多语言管理、网络请求、数据验证等功能。相比其他状态管理组件&#xff0c;getX简单、功能强大…

JDK源码解析-Object

1. Object类 所有类的基类——java.lang.Object Object 类是所有类的基类&#xff0c;当一个类没有直接继承某个类时&#xff0c;默认继承Object类Object 类属于 java.lang 包&#xff0c;此包下的所有类在使用时无需手动导入&#xff0c;系统会在程序编译期间自动导入。 思…

(二)范数与距离

本文主要内容如下&#xff1a; 1. 范数的定义2. 常见的范数举例3. 范数的等价4. 距离与度量空间的定义 1. 范数的定义 定义1-1&#xff1a;设 E E E 为向量空间&#xff0c; R \mathbb{R} R 为实数域。若映射 ∥ ⋅ ∥ : E → R : x ↦ ∥ x ∥ \begin{equation*} \lVert\cd…

12.物联网LWIP之消息处理机制,lwip消息传递机制

一。LWIP数据包消息处理 1.接受数据包 2.构造消息 3.投递消息 4.获取消息 5.处理数据包 api_msg 这个结构体包括执行函数所必需的一切,对于另一个线程上下文中的netconn(主要用于处理netconn)在tcpip_thread上下文中(线程安全)。 struct api_msg { /* 大家可以理解为是一个so…

ssm学生信息管理系统源码和论文

ssm学生信息管理系统源码和论文075 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 传统办法管理学生信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行…

多目标应用:基于多目标向日葵优化算法(MOSFO)的微电网多目标优化调度MATLAB

一、微网系统运行优化模型 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标向日葵优化算法 多目标向日葵优化算法&#xff08;Multi-objective sunflower optimization&#xff0c;MOS…

企业网络安全:威胁检测和响应 (TDR)

什么是威胁检测和响应 威胁检测和响应&#xff08;TDR&#xff09;是指识别和消除 IT 基础架构中存在的恶意威胁的过程。它涉及主动监控、分析和操作&#xff0c;以降低风险并防止未经授权的访问、恶意活动和数据泄露&#xff0c;以免它们对组织的网络造成任何潜在损害。威胁检…

新开通的抖店没有销量和体验分,如何找达人带货起店?教程如下

我是王路飞。 做抖店&#xff0c;想要快速起店&#xff0c;无非就是做动销&#xff0c;或者货损。 但是动销比较有风险&#xff0c;货损的话&#xff0c;一个是新手不会具体的操作和设置&#xff0c;一个是自己利润受损。 所以今天给你们说下&#xff0c;新开通的抖店在没有…

Java EE 突击 15 - Spring Boot 统一功能处理

Spring Boot 统一功能处理 一 . 统一功能的处理1.1 初级阶段 : 不断重复1.2 中级阶段 : 集成方法1.3 高级阶段 : Spring AOP1.4 超高级阶段 : Spring 拦截器准备工作实现拦截器自定义拦截器将自定义拦截器加入到系统配置 拦截器实现原理扩展 : 统一访问前缀添加 二 . 统一异常的…

机器学习的第一节基本概念的相关学习

目录 1.1 决策树的概念 1.2 KNN的概念 1.2.1KNN的基本原理 1.2.2 流程&#xff1a; 1.2.3 优缺点 1.3 深度学习 1.4 梯度下降 损失函数 1.5 特征与特征选择 特征选择的目的 1.6 python中dot函数总结 一维数组的点积&#xff1a; 二维数组&#xff08;矩阵&#xff09;的乘法&am…