【iceberg】数据湖与iceberg调研与实战

news2024/11/25 0:42:18

文章目录

  • 一. 为什么现在要强调数据湖
    • 1. 大数据架构发展历史
    • 2. Lambda架构与kappa架构
    • 3. 数据湖所具备的能力
  • 二. iceberg是数据湖吗
    • 1. iceberg的诞生
    • 2. iceberg设计之table format
    • 从如上iceberg的数据结构可以知道,iceberg在数据查询时,1.查找文件的时间复杂度至少是O(1),2. 加上列统计信息,能够很好的实现物理层面的文件裁剪。
    • 3. iceberg 特性
    • 4. 其他数据湖框架的对比
  • 三. iceberg实战
    • 1. 集成iceberg到flink
    • 2. 管理iceberg元数据
      • 2.1. java api管理iceberg的catalog
      • 2.2. 通过flink sql操作iceberg的元数据
    • 3. 通过flink将数据入湖--集成到chunjun
    • 4. 通过flink 对数据湖进行数据分析--集成到chunjun
    • 5. 小结
    • 6. flink with iceberg 未来的规划
    • 7. 接下来的探索

一. 为什么现在要强调数据湖

1. 大数据架构发展历史

在这里插入图片描述

  1. 数据仓库:加载各个数据源到HIVE、HBASE等;
  2. 数据湖:数据入湖->再建仓(多中数据源)、或ETL;
  3. 湖仓一体:数据入湖、湖上建仓。离线实时数据使用同一批数据。

大数据整体的发展路径是:
向着统一存储、统一口径、一次性开发。

统一存储:只有一个存储,消除数据冗余,提高数据质量,更低的存储成本。
统一口径:离线、实时、ad-hoc、机器学习都可以使用同一个数据源,数据治理简单。
一次性开发:多次使用,节约计算成本。

注意:

缺点:将传统数据仓库迁移到湖仓的过程是耗时且昂贵的。

 

2. Lambda架构与kappa架构

在这里插入图片描述

lambda架构:

  • 复杂性:分为速度层批层;流批不同的技术,维护两套不同的代码库、工具,维护成本很高
  • 流、批分离:处理相同数据出现不一致的结果;
  • 延迟:流等批,增加延迟。(CDC可以解决)

kappa架构:流批一体(典型的kafka实时数仓)

  • 数据回溯能力弱:面对更复杂的数据分析时,要将DWD和DWS层的数据写入到ClickHouse、ES、MySQL或者是Hive里做进一步分析,这无疑带来了链路的复杂性。
  • OLAP分析能力弱:Kafka是一个顺序存储的系统,顺序存储系统是没有办法直接在其上进行OLAP分析的,例如谓词下推这类的优化策略,在顺序存储平台(Kafka)上实现是比较困难的事情。
  • 数据时序性受到挑战:Kappa架构是严重依赖于消息队列的,我们知道消息队列本身的准确性严格依赖它上游数据的顺序,但是,消息队列的数据分层越多,发生乱序的可能性越大。

这里可以将kafka改为将starrocks或doris作为实时数仓的存储层以及olap分析层。
提供存储的同时,具备强大的olap分析,以及运行的实时性。

 

那么:

  1. 是否存在一种存储技术
    既能够支持数据高效的回溯能力,支持数据的更新(ACID),又能够实现数据的批流读写,并且还能够实现分钟级到秒级的数据接入?

 

  1. 有没有这样一个架构
    既能够满足实时性的需求,又能够满足离线计算的要求,而且还能够减轻开发运维的成本,解决通过消息队列方式构建的Kappa架构中遇到的痛点?

 

3. 数据湖所具备的能力

数据湖要具备的能力:

  1. 流批数据处理的统一与能力
  2. 数据入湖后,支持对数据的修正、数据质量管理的能力。
  3. 数据的一致性与正确性:ACID事务的能力,元数据的可拓展性。
  4. 计算引擎与存储引擎的解耦:这样数据湖中间件可以在多个地方应用,即在不同计算引擎(spark、flink、trino、hive、starrocks…)、存储引擎(hdfs、s3)上应用。

 

二. iceberg是数据湖吗

1. iceberg的诞生

在这里插入图片描述

Iceberg是一个面向海量数据分析场景的表格式(Table Format)

该项目最初是由Netflix公司开发的,目的是解决他们使用巨大的PB级表的长期问题。它于2018年作为Apache孵化器项目开源,并于2020年5月19日从孵化器中毕业。

表格式(Table Format):是对元数据以及数据文件的一种组织方式,处于计算框架(Flink,Spark…)之下,数据文件之上。

我们先回到Netflix 的 Ryan Blue创建Iceberg的原因。

举个hive的窘境:hive表分区天改成小时。

需要如下操作:

  1. 不能在原表之上直接修改,只能新建一个按小时分区的表,
  2. 再把数据Insert到新的小时分区表。
  3. 因为分区字段修改,导致需要修改原表上层的应用的sql,即使通过Rename的命令把新表的名字改为原表。

以上操作上任何一步操作,都会冒着其他地方出现错误的风险

所以数据的组织方式(表格式)是许多数据基础设施面临挫折和问题的共同原因。

[! Apache Iceberg设计的一个关键考虑是解决各种数据一致性和性能问题,这些问题是Hive在使用大数据时所面临的问题。]

  • hive的table state存储在两个地方:分区存储在hive元数据、文件存储在文件系统。
  • bucketing(分桶)是由hive的hash实现,(效率不高吗)
  • 非 ACID 布局的唯一原子操作是添加分区
  • 需要在文件系统中原子地移动对象 ing
  • 需要dir_list来plan作业,这会导致 :
    • 效率:O(n) 的列表调用,其中 n 是匹配分区的数量。
    • 正确性:最终一致性会破坏正确性。

 

2. iceberg设计之table format

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

 

有关存储格式方面,Apache Iceberg 中的一些概念如下:

数据文件 data files

数据文件是Apache Iceberg表真实存储数据的文件,一般是在表的数据存储目录的data目录下,iceberg支持三种格式(parquet、avro、orc)的文件存储。
Iceberg每次更新会产生多个数据文件(data files)。

 
表快照 Snapshot

快照代表一张表在某个时刻下表的状态。每个快照里面会列出表在某个时刻的所有 data files 列表。

  • data files是存储在不同的manifest files里面
  • manifest files是存储在一个Manifest list文件里面
  • 一个Manifest list文件代表一个Snapshot。

 
清单列表 Manifest list

manifest list是一个元数据文件,它列出构建表快照(Snapshot)的清单(Manifest file)。

  • manifest list中记录了Manifest file列表,其中每个Manifest file信息占据一行。
  • 每行中存储了
    • Manifest file的路径、
    • 数据文件(data files)的分区范围,
    • 增加了几个数文件、删除了几个数据文件等信息,
      这些信息可以用来在查询时提供过滤,加快速度。

 

清单文件 Manifest file

Manifest file也是一个元数据文件,

  • 存储了数据文件(data files)的列表信息。
  • 每行都是每个数据文件的详细描述,包括
    • 数据文件的状态、文件路径、
    • 分区信息、
    • 列级别的统计信息(比如每列的最大最小值、空值数等)、
    • 文件的大小以及文件里面数据行数等信息。

其中列级别的统计信息可以在扫描表数据时过滤掉不必要的文件。


从如上iceberg的数据结构可以知道,iceberg在数据查询时,1.查找文件的时间复杂度至少是O(1),2. 加上列统计信息,能够很好的实现物理层面的文件裁剪。

 

3. iceberg 特性

序号特性说明
1统一存储统一性:数据都统一存储到hdfs、s3中。
- 数据湖中可以存储结构化、半结构化、非结构化数据,我们可以通过iceberg来摄取这些数据。
- 但要注意:数据湖存储例如图片等非结构化数据并不是强项。
2插件化灵活性:Iceberg不和特定的数据存储、计算引擎绑定。常见数据存储(HDFS、S3…),计算引擎(Flink、Spark…)都可以接入Iceberg。
3模式演化演化能力:支持table、schema、Partition的添加、删除、更新或重命名,简化表修改成本。
4隐藏分区分区信息并不需要人工维护:会自动计算。
由于Iceberg的分区信息和表数据存储目录是独立的,使得Iceberg的表分区可以被修改,而且不涉及到数据迁移。
5Time Travel镜像数据查询:允许用户通过将表重置为之前某一时刻的状态来快速纠正问题。
6乐观锁的并发支持提供了多个程序并发写入的能力并且保证数据线性一致。
7支持事务upsert与读写分离:
- 提供事务(ACID)的机制,使其具备了upsert的能力并且使得边写边读成为可能,从而数据可以更快的被下游组件消费。
- 通过事务保证了下游组件只能消费已commit的数据,而不会读到部分甚至未提交的数据。
8文件级数据剪裁文件级谓词下推:
- Iceberg的元数据里面提供了每个数据文件的一些统计信息,比如最大值,最小值,Count计数等等。
- 查询SQL的过滤条件除了常规的分区,列过滤,甚至可以下推到文件级别,大大加快了查询效率。

 

4. 其他数据湖框架的对比

在这里插入图片描述

  • iceberg不支持自动文件合并,历史数据也需要自己手动清洗
  • 文件格式支持的最多:parquet、avro、orc
  • 存储引擎支持hdfs、S3
  • 不支持索引

 

三. iceberg实战

1. 集成iceberg到flink

iceberg独立于计算引擎和存储引擎

...
# 1.16 or above has a regression in loading external jar via -j option. 
# See FLINK-30035 for details.
put iceberg-flink-runtime-1.16-1.5.2.jar in flink/lib dir

./bin/sql-client.sh embedded shell


 

2. 管理iceberg元数据

https://iceberg.apache.org/docs/latest/java-api-quickstart/

2.1. java api管理iceberg的catalog

使用iceberg native api去管理iceberg的catalog

/**
 * 数据湖元数据操作
 */
public interface DatalakeMetaAPI {

    // Catalog操作
    <A> A createCatalog();

    void dropCatalog(String catalogName);

    Catalog getCatalog(String catalogName);

    // Namespace操作:就是数据库
    void createNamespace(String namespaceName);

    void dropNamespace(String namespaceName);

    Namespace getNamespace(String namespaceName);

    List<Namespace> getAllNamespaces();

    // Table操作
    Table createTable();

    void dropTable(String namespaceName, String tableName);

    Table alterTable(String catalogName, String namespaceName, String tableName);

    List<TableIdentifier> getAllTables(String namespaceName);

    <T> T setConf();
}

 

/**
 * hadoopCatalog的实现方法
 */
public class IcebergMetaAPI implements DatalakeMetaAPI {

    private HadoopCatalog hadoopCatalog;
    private String warehousePath;

    public IcebergMetaAPI(String warehousePath) {
        Configuration hadoopConf = setConf();
        hadoopCatalog = new HadoopCatalog(hadoopConf, warehousePath);
    }

    @Override
    public HadoopCatalog createCatalog() {
        Configuration hadoopConf = setConf();
        return new HadoopCatalog(hadoopConf, warehousePath);
    }

    @Override
    public void dropCatalog(String catalogName) {
    }

    @Override
    public Catalog getCatalog(String catalogName) {
        return null;
    }

    @Override
    public void createNamespace(String namespaceName) {
        hadoopCatalog.createNamespace(Namespace.of(namespaceName));
        System.out.println("创建Namespace成功");
    }

    @Override
    public void dropNamespace(String namespaceName) {
        hadoopCatalog.dropNamespace(Namespace.of(namespaceName));
        System.out.println("删除Namespace成功");
    }

    @Override
    public Namespace getNamespace(String namespaceName) {
        if (hadoopCatalog.namespaceExists(Namespace.of(namespaceName))) {
            // todo:是否正确
            return hadoopCatalog.listNamespaces(Namespace.of(namespaceName)).get(0);
        }
        return Namespace.empty();
    }

    @Override
    public List<Namespace> getAllNamespaces() {
        return hadoopCatalog.listNamespaces();
    }

    @Override
    public Table createTable() {
        TableIdentifier spaceAndTableName = TableIdentifier.of("logging", "logs2");
        /** typeid是需要的, 从其他模式格式(如Spark、Avro和Parquet)进行转换时,将自动分配新的ID */
        Schema schema = new Schema(Types.NestedField.required(1, "level", Types.StringType.get()),
            Types.NestedField.required(2, "event_time", Types.TimestampType.withZone()),
            Types.NestedField.required(3, "message", Types.StringType.get()),
            Types.NestedField.optional(4, "call_stack",
                Types.ListType.ofRequired(5, Types.StringType.get())));

        /**
         * 分区规范描述了Iceberg如何将记录分组成数据文件。分区规范是使用构建器为表的模式创建的。
         *
         * <p>以下是按照日志事件的时间戳的小时和日志级别进行分区:
         */
        PartitionSpec partition = PartitionSpec.builderFor(schema).hour("event_time")
            .identity("level").build();
        // namespace就是数据库
        Table table = hadoopCatalog.createTable(spaceAndTableName, schema, partition);

        System.out.println("创建表" + table + "成功");
        return table;
    }

    @Override
    public void dropTable(String namespaceName, String tableName) {
        hadoopCatalog.dropTable(TableIdentifier.of("namespaceName", "tableName"));
    }

    @Override
    public Table alterTable(String catalogName, String namespaceName, String tableName) {
        //todo:修改表操作
        return null;
    }

    @Override
    public List<TableIdentifier> getAllTables(String namespaceName) {
        return hadoopCatalog.listTables(Namespace.of(namespaceName));
    }

    @Override
    public Configuration setConf() {
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://localhost:9000");
        //        configuration.addResource(new
        // Path("/Users/lianggao/MyWorkSpace/001-360/001project-360/datalake-metadata-api/datalake-metadata-iceberg/src/main/resources/core-site.xml"));
        //        configuration.addResource(new
        // Path("/Users/lianggao/MyWorkSpace/001-360/001project-360/datalake-metadata-api/datalake-metadata-iceberg/src/main/resources/hdfs-site.xml"));
        //        configuration.addResource(new
        // Path("/usr/hdp/current/hive-client/conf/hdfs-site.xml"));
        configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        //        configuration.setBoolean("fs.hdfs.impl.disable.cache", true);
        //        configuration.set("hadoop.job.ugi", "logsget");
        //        UserGroupInformation.setConfiguration(configuration);
        //        try {
        //            Subject subject = new Subject();
        //            subject.getPrincipals().add(new UserPrincipal("logsget"));
        //            UserGroupInformation.loginUserFromSubject(null);
        //        } catch (IOException e) {
        //            e.printStackTrace();
        //        }
        return configuration;
    }
}

 

2.2. 通过flink sql操作iceberg的元数据

本文采用的是flink client sql (在flink standalone集群)去提交iceberg表相关操作,如下创建catalog,我们看到创建的catalog持久化到了s3存储中。

表操作


# 创建catalog
CREATE CATALOG hadoop_catalog WITH (  'type'='iceberg',  'catalog-type'='hadoop', 'warehouse'='hdfs://iceberg1v.middle.bjmd.qihoo.net:9000/warehouse/iceberg-hadoop', 'property-version'='1' );


# 使用catalog
use catalog hadoop_catalog;


# 创建表,默认数据库为default
CREATE TABLE `sample` (
    city_name STRING ,
    category_name STRING,
    province_name STRING,
    order_amount_daily_category_city decimal(20,2)
);

# 插入数据
INSERT INTO `sample` VALUES (1, 'a');



# 创建带有主键的表
CREATE TABLE `sample5` (
  `id`  INT UNIQUE COMMENT 'unique id',
  `data` STRING NOT NULL,
 PRIMARY KEY(`id`) NOT ENFORCED
) with (
'format-version'='2', 
'write.upsert.enabled'='true'
);


注意:flink sql只允许修改表的属性,并不支持对于列、分区的修改。
官网: https://iceberg.apache.org/docs/nightly/flink/

 

查找表的相关元数据

-- 表历史
SELECT * FROM spotify$history;

-- 
SELECT * FROM spotify$metadata_log_entries;

-- snapshots
SELECT * FROM spotify$snapshots;

产品结合:我们运行的flink是在 yarn 下运行的,交互慢,费资源,所以不推荐使用flink对catalog进行管理,而是使用native api管理。

 

3. 通过flink将数据入湖–集成到chunjun

自己搭建的集群与现有系统部环境暂不统一,使用系统部的hadoop作为数据湖的存储

Flink SQL> CREATE CATALOG hadoop_catalog WITH (  'type'='iceberg',  'catalog-type'='hadoop', 'warehouse'='hdfs://iceberg1v.middle.bjmd.qihoo.net:9000/warehouse/iceberg-hadoop',
'property-version'='1' );

[ERROR] Could not execute SQL statement. Reason:
java.io.IOException: ViewFs: Cannot initialize: Empty Mount table in config for viewfs://iceberg1v.middle.bjmd.qihoo.net:9000/

 


Flink SQL> CREATE CATALOG hadoop_catalog WITH (  'type'='iceberg',  'catalog-type'='hadoop', 'warehouse'='hdfs://namenode.dfs.shbt.qihoo.net:9000/home/logsget/warehouse/iceberg-hadoop', 'property-version'='1' );
[INFO] Execute statement succeed.

Flink SQL> use catalog hadoop_catalog;
[INFO] Execute statement succeed.

Flink SQL> CREATE TABLE `sample` (city_name STRING , category_name STRING, province_name STRING, order_amount_daily_category_city decimal(20,2));
2024-05-17 00:47:21,945 WARN  org.apache.hadoop.hdfs.DFSClient                             [] - Cannot remove /home/logsget/warehouse/iceberg-hadoop/default/sample/metadata/version-hint.text: No such file or directory.
[INFO] Execute statement succeed.


 


CREATE CATALOG hadoop_catalog WITH (  'type'='iceberg',  'catalog-type'='hadoop', 'warehouse'='hdfs://namenode.dfs.shbt.qihoo.net:9000/home/logsget/warehouse/iceberg-hadoop', 'property-version'='1' );



--use catalog hadoop_catalog;




CREATE TABLE `aaa_b` (
city_name STRING , category_name STRING, province_name STRING, order_amount_daily_category_city decimal(20,2)
)
WITH (
      'password' = 'a87fc6992a96de56',
      'connector' = 'starrocks-x',
      'sink.max-retries' = '3',
      'schema-name' = 'dp_test',
      'sink.buffer-flush.interval-ms' = '5000',
      'fe-nodes' = 'db01.doris.shyc2.qihoo.net:8030',
      'table-name' = 'ads_product_citycategoryamount_di',
      'url' = 'jdbc:mysql://10.192.197.134:9030/dp_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&connectTimeout=3000&useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true&&serverTimezone=Asia/Shanghai&sessionVariables=query_timeout=86400',
      'username' = 'dfs_shbt_logsget'
);

insert into hadoop_catalog.`default`.sample select * from aaa_b;

/data01/chunjun-master-dev/bin/run-ri-test.sh /data01/chunjun-master-dev/conf/ice-w.sql \
offline logsget '' '' 3 '' '' '' '' '' logsget 1 '' '' '' '' '' \
radar_1_2187_9270_4058632_test '' '' '' local  

 

4. 通过flink 对数据湖进行数据分析–集成到chunjun



CREATE CATALOG hadoop_catalog WITH (  'type'='iceberg',  'catalog-type'='hadoop', 'warehouse'='hdfs://namenode.dfs.shbt.qihoo.net:9000/home/logsget/warehouse/iceberg-hadoop', 'property-version'='1' );



--use catalog hadoop_catalog;




CREATE TABLE `aaa_b` (
city_name STRING , category_name STRING, province_name STRING, order_amount_daily_category_city decimal(20,2)
)
WITH (
      'connector' = 'print'
);

insert into aaa_b select * from hadoop_catalog.`default`.sample ;



/data01/chunjun-master-dev/bin/run-ri-test.sh /data01/chunjun-master-dev/conf/ice-w.sql \
 offline logsget '' '' 3 '' '' '' '' '' logsget 1 '' '' '' '' '' \
 radar_1_2187_9270_4058632_test '' '' '' local                                                                  

 

5. 小结

虽然iceberg当初是为了解决hive表格式的问题,但实际上iceberg的种种能力,使得他配得上作为数据湖中间件,这里再回顾下iceberg的能力:

  1. 流批数据处理的统一与能力
  2. 数据入湖后,支持对数据的修正、数据质量管理的能力。
  3. 数据的一致性与正确性:ACID事务的能力,元数据的可拓展性。
  4. 计算引擎与存储引擎的解耦:这样数据湖中间件可以在多个地方应用,即在不同计算引擎(spark、flink、trino、hive、starrocks…)、存储引擎(hdfs、s3)上应用。

 

我们可以借助iceberg搭建存储统一、计算口径统一的数据湖仓。
 

具体地,我们可以

  • 使用iceberg native api进行元数据管理;
  • 使用flink进行数据入湖;湖仓建设;
  • 使用flink、spark、trino、hive等进行数据分析。

 

在这里插入图片描述

 

6. flink with iceberg 未来的规划

There are some features that are do not yet supported in the current Flink Iceberg integration work:

  • Don’t support creating iceberg table with hidden partitioning. Discussion in flink mail list.
  • Don’t support creating iceberg table with computed column.
  • Don’t support creating iceberg table with watermark.
  • Don’t support adding columns, removing columns, renaming columns, changing columns. FLINK-19062 is tracking this.

 

7. 接下来的探索

  1. iceberg数据入湖的事务能力验证
  2. iceberg修改表结构对任务的影响
  3. iceberg批数据分批写完,下游数据立马能消费的验证,以及相关原理
  4. iceberg数据合并的逻辑验证。
  5. iceberg处理非结构数据与半结构数据的实践

 
 

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

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

相关文章

三、自定义信号和槽函数(无参和有参)

需求&#xff1a; 下班后&#xff0c;小明说请小红吃好吃的&#xff0c;随便吃&#xff0c;吃啥买啥 无参&#xff1a;小红没有提出吃啥 有参&#xff1a;小红提出自己想吃的东西&#xff0c;吃啥取决于一时兴起&#xff08;emit触发&#xff09; 思路&#xff1a; 1&#xff…

【数据结构】排序详解(希尔排序,快速排序,堆排序,插入排序,选择排序,冒泡排序)

目录 0. 前情提醒&#xff1a; 1. 插入排序 1.1 基本思想&#xff1a; 1.2 直接插入排序 实现步骤&#xff1a; 动图演示&#xff1a; 特性总结&#xff1a; 代码实现&#xff1a; 1.3 希尔排序&#xff08;缩小增量排序&#xff09; 基本思想&#xff1a; 步骤演示&…

谷歌上架,个人号比企业号好上?“14+20”封测如何解决,你知道了吗

在Google Play上架应用&#xff0c;对开发者而言&#xff0c;既是挑战也是机遇。随着谷歌政策的不断更新&#xff0c;特别是要求2023年11月13日后注册的个人开发者账号在发布正式版应用前&#xff0c;必须经过20人连续14天的封闭测试。 这一政策的改变使得许多开发者开始考虑使…

适合小白入门的AI扩图(创成式填充)工具

近期&#xff0c;发现许多人对AI扩图工具的需求比较大&#xff0c;为了满足大家的需求&#xff0c;本期天祺为大家整理了一些好用的AI扩图工具&#xff0c;各个设配的扩图工具都有介绍哦&#xff0c;电脑&#xff0c;手机端都能用&#xff0c;大家可以根据自己的喜好和需求进行…

Linux程序开发(十):文件分类器趣味设计

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

搜索插入位置 ---- 二分查找

题目链接 题目: 分析: 因为数排序数组, 所以具有"二段性", 可以使用二分查找题目中, 我们如果找到目标值 , 则返回下标, 如果没找到目标值, 应该返回的是>target的第一个位置, 所以应该将数组分成< target 和 > target当<target时, 应该移动left, left…

Marin说PCB之POC电路layout设计仿真案例---03

今天中午午休我刚要打开手机的准备刷抖音看无忧传媒的学生们的“学习资料”的时候&#xff0c;看到CSDN -APP上有提醒&#xff0c;一看原来是一位道友发的一个问题&#xff1a; 本来小编最近由于刚刚从国外回来&#xff0c;手上的项目都已经结束了&#xff0c;这周开始学习仿真…

Xcode=> 安装 simulator

XCode xcode中下载 simulator 点击加号➕&#xff0c;选择对应的版本&#xff0c;即可下载 下载完成&#xff1a; 其他下载办法 因为使用上述下载&#xff0c;会经常性的出现断开&#xff0c;再次下载又是从头开始&#xff0c;太费时费力。下面使用下载地址&#xff0c;然后用…

软考中级-软件设计师-真题详解【2023年上半年】

2023上半年真题记忆点详解 本片不涉及解题法&#xff0c;只整理记忆背诵点&#xff0c;记住即可拿分。 上午题部分&#xff1a; 片内总线&#xff1a;用于芯片内部各主要部件连接&#xff1b; 系统总线&#xff1a;用于CPU、主存、外设见的数据传输&#xff1b; 通讯总线&…

百度信息流 - 成本保障未生效?

今天创建百度信息流单元时&#xff0c;发现一个细节&#xff0c;创建好后&#xff0c;成本保障未生效&#xff08;“保”字没有出现&#xff09; 过了一会&#xff0c;再进来看&#xff0c;成本保障生效了。 分析原因 &#xff1a; 展现为 1 &#xff0c;也就是说&#xff0c;一…

建筑施工突发事故应急处置vr安全培训平台

在不断发展的时代背景下&#xff0c;掌握必要的应急安全知识已成为我们生活中不可或缺的一部分。由央企携手我们华锐推出的3D线上应急宣教虚拟体验馆&#xff0c;标志着民众应急安全教育的全新里程碑&#xff0c;不仅突破了传统学习模式的局限&#xff0c;还让每个人都能在灵活…

GpuMall智算云:Ubuntu 实例桌面版

基于 ubuntu18.04 安装的桌面版本&#xff0c;桌面使用 xfce4 &#xff0c;集成了 Pytorch2.3.0、cuda11.8、Python3.10、VNC、noVNC、VSCode-Server。 在 镜像市场 选择xfce4-desktop镜像&#xff0c;然后进行创建实例 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall…

这八个步骤,有效进行防错管理

导读 在产品实际的生产过程中&#xff0c;因零件相似而错装、因零件又小又多而漏装等现象时有发生&#xff0c;需要防止或尽可能避免错误发生。 试想&#xff0c;一个操作人员每天进行同样的装配工作上百次千次甚至上万次&#xff0c;如果产品设计和过程设计开发不能防止提前预…

vue.js状态管理和服务端渲染

状态管理 vuejs状态管理的几种方式 组件内管理状态&#xff1a;通过data&#xff0c;computed等属性管理组件内部状态 父子组件通信&#xff1a;通过props和自定义事件实现父子组件状态的通信和传递 事件总线eventBus&#xff1a;通过new Vue()实例&#xff0c;实现跨组件通…

Pytorch入门(7)—— 梯度累加(Gradient Accumulation)

1. 梯度累加 在训练大模型时&#xff0c;batch_size 最大值往往受限于显存容量上限&#xff0c;当模型非常大时&#xff0c;这个上限可能小到不可接受。梯度累加&#xff08;Gradient Accumulation&#xff09;是一个解决该问题的 trick梯度累加的思想很简单&#xff0c;就是时…

第12周作业--HLS入门

目录 一、HLS入门 二、HLS入门程序编程 创建项目 1、点击Vivado HLS 中的Create New Project 2、设置项目名 3、加入文件 4、仿真 3、综合 一、HLS入门 1. HLS是什么&#xff1f;与VHDL/Verilog编程技术有什么关系? HLS&#xff08;High-Level Synthesis&#xff0c…

自动化重置数据库功能的探索与实践

1、简介 在现代软件开发中&#xff0c;尤其是涉及到数据驱动的应用程序时&#xff0c;开发和测试环境中数据库的管理是至关重要的一环。为了确保开发和测试环境中的数据库始终处于一致的状态&#xff0c;自动化重置数据库成为了一种常见的实践。本文旨在介绍如何通过Shell脚本…

打印9*9乘法表(递归或压缩矩阵)python

打印9*9表def print_multiplication_table(row, col):if row > 10:return # 递归结束条件if col row:print() # 换行print_multiplication_table(row 1, 1) # 递归调用下一行else:print(f"{row-1} * {col} {(row-1) * col}\t", end"") # 打印乘法…

小程序properties默认值定义及父子组件的传值

因经常写vue&#xff0c;很久没写小程序&#xff0c;容易串频道&#xff0c;现记录一下小程序的组件用法、监听传入值及父子传值方式 首先小程序中传值是没有&#xff1a;(冒号)的&#xff0c;其次properties中定义默认值不需要写default 1.自定义组件中&#xff0c;首先json…

TransFormer学习之基础知识:STN、SENet、CBAM、Self-Attention

1.空间注意力机制STN 参考链接&#xff1a;STN(Spatial Transformer Networks) 参考链接&#xff1a;通俗易懂的Spatial Transformer Networks(STN) 核心动机&#xff1a; 在空间中捕获重要区域特征(如图像中的数字)&#xff0c;将核心区域进行放大居中&#xff0c;使得结果更…