Hudi-简介和编译安装

news2024/11/15 16:42:01

简介

简介

Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发,同时保持数据的开源文件格式。

Apache Hudi不仅非常适合于流工作负载,而且还允许创建高效的增量批处理管道。

Apache Hudi可以轻松地在任何云存储平台上使用。Hudi的高级性能优化,使分析工作负载更快的任何流行的查询引擎,包括Apache Spark、Flink、Presto、Trino、Hive等。

Hudi项目最初的设计目标:在hadoop上实现update和delete操作

发展历史

  • 2015 年:发表了增量处理的核心思想/原则(O’reilly 文章)。
  • 2016 年:由 Uber 创建并为所有数据库/关键业务提供支持。
  • 2017 年:由 Uber 开源,并支撑 100PB 数据湖。
  • 2018 年:吸引大量使用者,并因云计算普及。
  • 2019 年:成为 ASF 孵化项目,并增加更多平台组件。
  • 2020 年:毕业成为 Apache 顶级项目,社区、下载量、采用率增长超过 10 倍。
  • 2021 年:支持 Uber 500PB 数据湖,SQL DML、Flink 集成、索引、元服务器、缓存。

Hudi特性

  • 可插拔索引机制支持快速Upsert/Delete。
  • 支持增量拉取表变更以进行处理。
  • 支持事务提交及回滚,并发控制。
  • 支持Spark、Presto、Trino、Hive、Flink等引擎的SQL读写。
  • 自动管理小文件,数据聚簇,压缩,清理。
  • 流式摄入,内置CDC源和工具。
  • 内置可扩展存储访问的元数据跟踪。
  • 向后兼容的方式实现表结构变更的支持。

使用场景

(1)近实时写入

  • 减少碎片化工具的使用。
  • CDC 增量导入 RDBMS 数据。
  • 限制小文件的大小和数量。

(2)近实时分析

  • 相对于秒级存储(Druid, OpenTSDB),节省资源。
  • 提供分钟级别时效性,支撑更高效的查询。
  • Hudi作为lib,非常轻量。

(3) 增量pipeline

  • 区分arrive time和event time处理延迟数据。
  • 更短的调度interval减少端到端延迟(小时 -> 分钟) => Incremental Processing。

(4)增量导出

  • 替代部分Kafka的场景,数据导出到在线服务存储 e.g. ES。

编译和安装

编译环境准备

相关组件版本如下:

Hadoop3.1.3
Hive3.1.2
Flink1.13.6,scala-2.12
Spark3.2.2,scala-2.12

安装Maven:

(1)上传apache-maven-3.6.1-bin.tar.gz到/opt/software目录,并解压更名

tar -zxvf apache-maven-3.6.1-bin.tar.gz -C /opt/module/
mv apache-maven-3.6.1 maven-3.6.1

(2)添加环境变量到/etc/profile中

sudo vim /etc/profile
#MAVEN_HOME
export MAVEN_HOME=/opt/module/maven-3.6.1
export PATH=$PATH:$MAVEN_HOME/bin

(3)测试安装结果

source /etc/profile
mvn -v

(4)修改为阿里镜像

修改setting.xml,指定为阿里仓库地址

vim /opt/module/maven-3.6.1/conf/settings.xml 

<!-- 添加阿里云镜像-->
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

上传Hudi源码包并修改pom文件

  • 上传源码包:

    # 将hudi-0.12.0.src.tgz上传到/opt/software,并解压:
    tar -zxvf /opt/software/hudi-0.12.0.src.tgz -C /opt/software
     
    # github地址:https://github.com/apache/hudi/
    
  • 在pom文件中新增repository加速依赖下载:

    # 编辑pom文件
    vim /opt/software/hudi-0.12.0/pom.xml
     
    # 新增repository加速依赖下载
    <repository>
            <id>nexus-aliyun</id>
            <name>nexus-aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
    </repository>
    
  • 在pom文件中修改依赖的组件版本:

    <hadoop.version>3.1.3</hadoop.version>
    <hive.version>3.1.2</hive.version>
    

修改源码兼容hadoop3

Hudi默认依赖的hadoop2,要兼容hadoop3,除了修改版本,还需要修改如下代码:

vim /opt/software/hudi-0.12.0/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieParquetDataBlock.java

修改第110行,原先只有一个参数,添加第二个参数null:

否则会因为hadoop2.x和3.x版本兼容问题(找不到合适的FSDataOutputStream构造器)。

手动安装Kafka依赖

有几个kafka的依赖需要手动安装,否则编译会报错。

(1)下载jar包

# 通过网址下载:http://packages.confluent.io/archive/5.3/confluent-5.3.4-2.12.zip

# 解压后找到以下jar包,上传编译服务器
common-config-5.3.4.jar
common-utils-5.3.4.jar
kafka-avro-serializer-5.3.4.jar
kafka-schema-registry-client-5.3.4.jar

(2)install到maven本地仓库

mvn install:install-file -DgroupId=io.confluent -DartifactId=common-config -Dversion=5.3.4 -Dpackaging=jar -Dfile=./common-config-5.3.4.jar
mvn install:install-file -DgroupId=io.confluent -DartifactId=common-utils -Dversion=5.3.4 -Dpackaging=jar -Dfile=./common-utils-5.3.4.jar
mvn install:install-file -DgroupId=io.confluent -DartifactId=kafka-avro-serializer -Dversion=5.3.4 -Dpackaging=jar -Dfile=./kafka-avro-serializer-5.3.4.jar
mvn install:install-file -DgroupId=io.confluent -DartifactId=kafka-schema-registry-client -Dversion=5.3.4 -Dpackaging=jar -Dfile=./kafka-schema-registry-client-5.3.4.jar

解决spark模块依赖冲突

修改了Hive版本为3.1.2,其携带的jetty是0.9.3,hudi本身用的0.9.4,存在依赖冲突。

(1)修改hudi-spark-bundle的pom文件

目的:排除低版本jetty,添加hudi指定版本的jetty

pom文件位置:vim /opt/software/hudi-0.12.0/packaging/hudi-spark-bundle/pom.xml (在382行的位置,修改如下红色部分)

文件要修改,要指定<dependency>里的<exclusions>剔除hive模块的jetty依赖,然后添加hudi使用的jetty依赖,否则后面在使用Spark向hudi表添加数据时会报错(不信可以试试):

java.lang.NoSuchMethodError: org.apache.hudi.org.apache.jetty.server.session.SessionHandler.setHttpOnly(Z)V
<!-- Hive -->
<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-service</artifactId>
    <version>${hive.version}</version>
    <scope>${spark.bundle.hive.scope}</scope>
    <exclusions>
        <exclusion>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
        </exclusion>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.pentaho</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-service-rpc</artifactId>
    <version>${hive.version}</version>
    <scope>${spark.bundle.hive.scope}</scope>
</dependency>
<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-jdbc</artifactId>
    <version>${hive.version}</version>
    <scope>${spark.bundle.hive.scope}</scope>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-metastore</artifactId>
    <version>${hive.version}</version>
    <scope>${spark.bundle.hive.scope}</scope>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-common</artifactId>
    <version>${hive.version}</version>
    <scope>${spark.bundle.hive.scope}</scope>
    <exclusions>
        <exclusion>
            <groupId>org.eclipse.jetty.orbit</groupId>
            <artifactId>javax.servlet</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 增加hudi配置版本的jetty -->
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>${jetty.version}</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-util</artifactId>
    <version>${jetty.version}</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-webapp</artifactId>
    <version>${jetty.version}</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-http</artifactId>
    <version>${jetty.version}</version>
</dependency>

(2)修改hudi-utilities-bundle的pom文件

目的:排除低版本jetty,添加hudi指定版本的jetty

位置:vim /opt/software/hudi-0.12.0/packaging/hudi-utilities-bundle/pom.xml(在405行的位置,修改如下(红色部分))

要指定<dependency>里的<exclusions>剔除hudi-common、hive等模块的jetty依赖,然后添加hudi使用的jetty依赖,否则后面在使用DeltaStreamer工具向hudi表插入数据时,也会报Jetty的错误

<!-- Hoodie -->
<dependency>
    <groupId>org.apache.hudi</groupId>
    <artifactId>hudi-common</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.hudi</groupId>
    <artifactId>hudi-client-common</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>


<!-- Hive -->
<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-service</artifactId>
    <version>${hive.version}</version>
    <scope>${utilities.bundle.hive.scope}</scope>
    <exclusions>
        <exclusion>
            <artifactId>servlet-api</artifactId>
            <groupId>javax.servlet</groupId>
        </exclusion>
        <exclusion>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
        </exclusion>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.pentaho</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-service-rpc</artifactId>
    <version>${hive.version}</version>
    <scope>${utilities.bundle.hive.scope}</scope>
</dependency>

<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-jdbc</artifactId>
    <version>${hive.version}</version>
    <scope>${utilities.bundle.hive.scope}</scope>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-metastore</artifactId>
    <version>${hive.version}</version>
    <scope>${utilities.bundle.hive.scope}</scope>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>${hive.groupid}</groupId>
    <artifactId>hive-common</artifactId>
    <version>${hive.version}</version>
    <scope>${utilities.bundle.hive.scope}</scope>
    <exclusions>
        <exclusion>
            <groupId>org.eclipse.jetty.orbit</groupId>
            <artifactId>javax.servlet</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 增加hudi配置版本的jetty -->
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>${jetty.version}</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-util</artifactId>
    <version>${jetty.version}</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-webapp</artifactId>
    <version>${jetty.version}</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-http</artifactId>
    <version>${jetty.version}</version>
</dependency>

编译并进入Hudi客户端

编译命令:

mvn clean package -DskipTests -Dspark3.2 -Dflink1.13 -Dscala-2.12 -Dhadoop.version=3.1.3 -Pflink-bundle-shade-hive3

进入hudi-cli说明成功:

编译完成后,相关的包在packaging目录的各个模块中。

Hudi集成Spark的环境准备

Hudi支持的Spark版本:

HudiSupported Spark 3 version
0.12.x3.3.x 3.2.x 3.1.x
0.11.x3.2.x(default build,spark bundle only) 3.1.x
0.10.x3.1.x(default build) 3.0.x
0.7.0-0.9.03.0.x
0.9.0 and priorNot supported

注意:0.11.x不建议使用,如果要用请使用补丁分支:[DO NOT MERGE] 0.11.1 release patch branch by danny0405 · Pull Request #6182 · apache/hudi · GitHub

集成Spark:

其实就是将上述编译好的安装包拷贝到spark下的jars目录中:

cp /opt/software/hudi-0.12.0/packaging/hudi-spark-bundle/target/hudi-spark3.2-bundle_2.12-0.12.0.jar /opt/module/spark-3.2.2/jars

注意:启动Spark之前需要启动Hadoop等相关组件。

Hudi集成Flink的环境准备

Hudi支持的Flink版本:

HudiSupported Flink version
0.12.x1.15.x、1.14.x、1.13.x
0.11.x1.14.x、1.13.x
0.10.x1.13.x
0.9.01.12.2

注意:0.11.x不建议使用,如果要用请使用补丁分支:[DO NOT MERGE] 0.11.1 release patch branch by danny0405 · Pull Request #6182 · apache/hudi · GitHub

集成Flink:

  • 将上述编译好的安装包拷贝到flink下的jars目录中:

    cp /opt/software/hudi-0.12.0/packaging/hudi-flink-bundle/target/hudi-flink1.13-bundle_2.12-0.12.0.jar /opt/module/flink-1.13.6/lib/
    
  • 拷贝guava包,解决依赖冲突:

    cp /opt/module/hadoop-3.1.3/share/hadoop/common/lib/guava-27.0-jre.jar /opt/module/flink-1.13.6/lib/
    
  • 配置Hadoop环境变量:

    sudo vim /etc/profile.d/my_env.sh
     
    export HADOOP_CLASSPATH=`hadoop classpath`
    export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
     
    source /etc/profile.d/my_env.sh
    

注意:启动Flink之前需要启动Hadoop等相关组件。

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

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

相关文章

【yolov5】首次尝试目标检测利用prompt(完整操作流程)

1、打开prompt 2、切换到pytorch所在环境 conda activate freezing我的环境名是freezing&#xff0c;这里根据自己环境名去激活切换 3、进入到yolov5项目所在路径 激活完环境后立即执行指令当然是无效的&#xff0c;首先要进入到你的项目目录 首先看一下自己的项目在那个位…

https协议

文章目录对称加密方案非对称加密方案对称加密方案非对称加密方案对称加密方案非对称加密方案数字证书因为HTTP是明文传输&#xff0c;所以会很有可能产生中间人攻击&#xff08;获取并篡改传输在客户端及服务端的信息并不被人发觉&#xff09;&#xff0c;HTTPS加密应运而生。 …

【Java|golang】1234. 替换子串得到平衡字符串---双指针

有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符&#xff0c;且长度为 n 的字符串。 假如在该字符串中&#xff0c;这四个字符都恰好出现 n/4 次&#xff0c;那么它就是一个「平衡字符串」。 给你一个这样的字符串 s&#xff0c;请通过「替换一个子串」的方式&#xff0c;…

SpringBoot2知识点记录

SpringBoot2知识点记录1.SpringBoot2基础入门1.1 环境要求1.1.1 maven设置1.2 第一个程序 HelloWorld1.2.1 创建maven工程1.2.2 引入依赖1.2.3 创建主程序1.2.4 编写业务1.2.5 测试1.2.6 简化配置1.2.7 简化部署1.3 自动装配1.3.1 SpringBoot特点1.3.1.1 依赖管理1.3.1.2 自动装…

上班在群里摸鱼,逮到一个字节8年测试开发,聊过之后羞愧难当...

老话说的好&#xff0c;这人呐&#xff0c;一旦在某个领域鲜有敌手了&#xff0c;就会闲得某疼。前几天我在上班摸鱼刷群的时候认识了一位字节测试开发大佬&#xff0c;在字节工作了8年&#xff0c;因为本人天赋比较高&#xff0c;平时工作也兢兢业业&#xff0c;现在企业内有一…

【论文阅读】基于意图的网络(Intent-Based Networking,IBN)研究综述

IBN研究综述一、IBN体系结构1.1 体系结构&#xff1a;1.2 闭环流程&#xff1a;1.3 IBN的自动化程度(逐步向前演进)&#xff1a;二、IBN 的实现方式2.1 意图获取&#xff1a;2.1.1 YANG、NEMO2.1.2 Frenetic、NetKAT、LAI2.2 意图转译&#xff1a;2.2.1 iNDIRA系统2.2.2 基于模…

GIT命令操作大全

文章目录一、前言二、工作模块2.1 Workspace&#xff1a;工作区2.2 Index / Stage&#xff1a;暂存区2.3 Repository&#xff1a;本地仓库2.4Remote&#xff1a;远程仓库三、GIT基本配置四、GIT项目代码管理4.1 初始化git仓库4.2 提交到暂存区(stage)4.3 将暂存区的文件恢复到工…

解决HC-05/HC06等蓝牙模块的调试问题

解决HC-05/HC06等蓝牙模块的调试问题问题&#xff1a;1.无法使用USB转串口工具设置HC-05等蓝牙模块&#xff0c;具体问题是&#xff1a;发送AT指令&#xff0c;无回复&#xff1b;2.电脑如何连接HC-05模块&#xff0c;与模块通信&#xff08;具体场景&#xff1a;HC-05模块的串…

python学习之pyecharts库的使用总结

pyecharts官方文档&#xff1a;https://pyecharts.org//#/zh-cn/ 【1】Timeline 其是一个时间轴组件&#xff0c;如下图红框所示&#xff0c;当点击红色箭头指向的“播放”按钮时&#xff0c;会呈现动画形式展示每一年的数据变化。 data格式为DataFrame&#xff0c;数据如下图…

数据结构——TreeMap、TreeSet与HashMap、HashSet

目录 一、Map 1、定义 2、常用方法 3、注意 二、TreeMap 三、HashMap 1、定义 2、冲突定义 3、冲突避免方法——哈希函数设计 &#xff08;1&#xff09;、直接定制法(常用) &#xff08;2&#xff09;、除留余数法(常用) &#xff08;3&#xff09;、平方取中法 &…

kubectl命令控制远程k8s集群(Windows系统、Ubuntu系统、Centos系统)

文章目录1. 本地是linux2. 本地是Windows1. 本地是linux 安装kubectl命令 法一&#xff1a;从master的/usr/bin目录下拷贝kubectl文件到本机/usr/bin目录下法二&#xff1a;GitHub下载kubectl文件 在家目录下创建.kube目录config文件 法一&#xff1a;将master上对应用户的~/.…

binlog、redolog、undolog

目录 一、binlong 1、binlog介绍 作用 特点 2、日志格式 3、写入流程 二、redo log 1、redo log作用 2、redo log如何写入 3、怎么提交数据进行刷盘 4、奔溃恢复流程 三、undolog 一、binlong 1、binlog介绍 作用 binlog是 mysql server 层的一种二进制日志&…

GA-PEG-GA,Glutaric Acid-PEG-Glutaric Acid,戊二酸-聚乙二醇-戊二酸供应

英文名称&#xff1a;Glutaric Acid-PEG-Glutaric Acid&#xff0c;GA-PEG-GA 中文名称&#xff1a;戊二酸-聚乙二醇-戊二酸 GA-PEG-GA是一种线性双功能PEG羧酸试剂。PEG和羧基COOH之间存在C4酯键。PEG羧酸可用于与氨基反应&#xff0c;与NHS和DCC、EDC等肽偶联试剂反应。 P…

CUDA原子操作|参加CUDA线上训练营

什么是原子操作 CUDA的原子操作可以理解为对一个Global memory或Shared memory中变 “读取-修改-写入” 这三个操作的一个最小单位的执行过程&#xff0c;在它执量进行行过程中&#xff0c;不允许其他并行线程对该变量进行读取和写入的操作。 基于这个机制&#xff0c;原子操…

实测2023款哪吒U-II,智驾功能对女司机很友好

最近&#xff0c;我们受邀试驾了2023款哪吒U-II。这是一款A级新能源SUV&#xff0c;是哪吒U的改款车型。哪吒U系列自2020年3月上市到2023年1月&#xff0c;累计销售数量达76688台&#xff0c;也因此被称为15万级智能天花板。2023款哪吒U-II的一大亮点是&#xff1a;针对以往哪吒…

react基础,操作属性样式事件。事件处理this指向问题,及案例

1.1 React 起源于 Facebook 于2013年5月开源. 是一个用于构建用户界面的 JavaScript 库, 与vue,angular并称前端三大框架&#xff0c;现在最新版本是18 特点&#xff1a;-数据驱动&#xff08;操作数据&#xff09; - 组件化 - 虚拟DOM 开发环境&#xff1a; cdn引入js <…

Theano教程:Python的内存管理

在写大型程序时候的一大挑战是如何保证最少的内存使用率。但是在Python中的内存管理是比较简单的。Python显示分配内存&#xff0c;使用引用计数系统管理对象&#xff0c;当指向某一个对象的引用数变为 0 的时候&#xff0c;该对象所占的内存就会被释放。理论上听起来很不错&am…

Linux基础语法进阶版

Linux基础语法 查看文件内容指令 touch 主要是修改文件时间&#xff0c;多用创建文件 -a #只更改访问时间 -m #只更改修改时间 -c --no-create#不创建任何文件cat 展示小文件内容 -b #对于非空输出行编号 -n #对于所有行输出编号 -E #在每行结束处显示"$" -A #展示所…

全国重点城市春节商圈客流数据来了,最火爆商圈果然是它 | 数说热点

作为疫情防控政策进一步放开后的首个春节&#xff0c;在“返乡潮”、“出游潮”和各地促销费政策的刺激下&#xff0c;火热强劲且亮点纷呈的线下消费市场随烟火气再次回归。那么2023年春节&#xff0c;线下消费市场呈现出哪些特点&#xff1f;全国各大购物中心在引客流聚人气方…

Java开发学习(五十)----MyBatisPlus快速开发之代码生成器解析

1、代码生成器原理分析 造句: 我们可以往空白内容进行填词造句&#xff0c;比如: 在比如: 观察我们之前写的代码&#xff0c;会发现其中也会有很多重复内容&#xff0c;比如: 那我们就想&#xff0c;如果我想做一个Book模块的开发&#xff0c;是不是只需要将红色部分的内容全部…