Spark+Flink+Iceberg打造湖仓一体架构实践探索

一文总结Spark和Flink的内存模型&执行流程 首先,要做JVM内存模型调优之前先好好审视你的代码质量!算法不行就改算法!!不要什么都交给调优!!! Spark部分 摘抄自 https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-apache-spark-memory-management/index.html 概述 首先要了解Spark的RDD,Shuffle,merge概念... 阅读详情
数据湖-大数据生态杀青数据湖-大数据生态杀青
数据仓库的痛点
  • 只能存储结构化数据,无法采集存储非结构化数据
  • 无法存储原始数据,所有的数据须经过ETL清洗过程
  • 离线数仓的数据表牵一发而动全身,数据调整工程量大
  • 实时数仓存储空间有限,无法采集和存储海量实时数据
  • 回溯效率低下,实时数据和离线数据计算接口难以统一
  • Kafka 做实时数仓,以及日志传输。Kafka 本身存储成本很高,且数据保留时间有时效性,一旦消费积压,数据达到过期时间后,就会造成数据丢失且没有消费到
  • 将实时要求不高的业务数据入湖、比如说能接受 1-10 分钟的延迟。因为 Iceberg 0.11 也支持 SQL 实时读取,而且还能保存历史数据。这样既可以减轻线上 Kafka 的压力,还能确保数据不丢失的同时也能实时读取
数据湖三剑客对比
Hudi
  • Hudi:Hadoop Upserts Deletes and Incrementals(原为 Hadoop Upserts anD Incrementals),强调了其主要支持 Upserts、Deletes 和 Incremental 数据处理,其主要提供的写入工具是 Spark HudiDataSource API 和自身提供的 HoodieDeltaStreamer
  • 在查询方面,Hudi 支持 Hive、Spark、Presto。
  • 在性能方面,Hudi 设计了 HoodieKey ,一个类似于主键的东西。对于查询性能,一般需求是根据查询谓词生成过滤条件下推至 datasource。Hudi 这方面没怎么做工作,其性能完全基于引擎自带的谓词下推和 partition prune 功能。
Delta
  • Delta定位是流批一体的 Data Lake 存储层,支持 update/delete/merge。不强调主键,因此其 update/delete/merge 的实现均是基于 spark 的 join 功能。在数据写入方面,Delta 与 Spark 是强绑定的,这一点 Hudi 是不同的:Hudi 的数据写入不绑定 Spark(可以用 Spark,也可以使用 Hudi 自己的写入工具写入)
  • 在查询方面,开源 Delta 目前支持 Spark 与 Presto,但是,Spark 是不可或缺的,因为 delta log 的处理需要用到 Spark。这意味着如果要用 Presto 查询 Delta,查询时还要跑一个 Spark 作业
Iceberg
  • Iceberg一个通用化设计的Table Format,高性能的分析与可靠的数据管理,Iceberg 没有类似的 HoodieKey 设计,其不强调主键。上文已经说到,没有主键,做 update/delete/merge 等操作就要通过 Join 来实现,而 Join 需要有一个 类似 SQL 的执行引擎。
  • Iceberg 在查询性能方面做了大量的工作。值得一提的是它的 hidden partition 功能。Hidden partition 意思是说,对于用户输入的数据,用户可以选取其中某些列做适当的变换(Transform)形成一个新的列作为 partition 列。这个 partition 列仅仅为了将数据进行分区,并不直接体现在表的 schema 中。
总结
  • Delta、Hudi、Iceberg三个开源项目中,Delta和Hudi跟Spark的代码深度绑定,尤其是写入路径。这两个项目设计之初,都基本上把Spark作为他们的默认计算引擎了。而Apache Iceberg的方向非常坚定,宗旨就是要做一个通用化设计的Table Format。它完美的解耦了计算引擎和底下的存储系统,便于多样化计算引擎和文件格式,很好的完成了数据湖架构中的Table Format这一层的实现,因此也更容易 成为Table Format层的开源事实标准
  • Apache Iceberg也在朝着流批一体的数据存储层发展,manifest和snapshot的设计,有效地隔离不同transaction的变更 ,非常方便批处理和增量计算。并且,Apache Flink已经是一个流批一体的计算引擎,二都可以完美匹配,合力打造流批一体的数据湖架构。
Iceberg术语
  • 数据文件 ( data files )
    Iceberg 表真实存储数据的文件,一般存储在data目录下,以".parquet"结尾。
  • 清单文件 ( Manifest file )
    每行都是每个数据文件的详细描述,包括数据文件的状态、文件路径、分区信息、列级别的统计信息(比如每列的最大最小值、空值数等)、通过该文件、可过滤掉无关数据、提高检索速度。
  • 快照( Snapshot )
    快照代表一张表在某个时刻的状态。每个快照版本包含某个时刻的所有数据文件列表。Data files 是存储在不同的 manifest files 里面, manifest files 是存储在一个 Manifest list 文件里面,而一个 Manifest list 文件代表一个快照。
spark + Iceberg离线数仓
  • 前期准备
    spark 3.0.0_scala_2.12
    Iceberg 0.13.1
    编译好的iceberg-spark3-runtime-0.13.1.jar拷贝到spark/jars

  • DWD加载ods原始数据

>controller
val sparkConf = new SparkConf()
      .set("spark.sql.catalog.hadoop_prod", "org.apache.iceberg.spark.SparkCatalog")
      .set("spark.sql.catalog.hadoop_prod.type", "hadoop")
      .set("spark.sql.catalog.hadoop_prod.warehouse", "hdfs://hadoop01:9820/spark/warehouse")
      .set("spark.sql.catalog.catalog-name.type", "hadoop")
      .set("spark.sql.catalog.catalog-name.default-namespace", "db")
      .set("spark.sql.sources.partitionOverwriteMode", "dynamic")
      .set("spark.sql.session.timeZone", "GMT+8")
      .setMaster("local[*]")
      .setAppName("dwd_app")
    val sparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
    DwdIcebergService.readOdsData(sparkSession)
> service 
  // 加载member 到dwd
  def loadMember(sparkSession: SparkSession): Unit ={
    sparkSession.read.json("/datasource/iceberg/member.log").drop("dn")
      .withColumn("uid", col("uid").cast("int"))
      .withColumn("ad_id", col("ad_id").cast("int"))
      .writeTo("hadoop_prod.db.dwd_member").overwritePartitions()
  }
  • DWS数据宽表
  def getDwsMemberData(sparkSession: SparkSession, dt: String) = {
    import sparkSession.implicits._
    ....
    val result = dwdMember.join(dwdMemberRegtype.drop("dt"), Seq("uid"), "left")
      .join(dwdPcentermempaymoney.drop("dt"), Seq("uid"), "left")
      .join(dwdBaseAd, Seq("ad_id", "dn"), "left")
      .join(dwdBaseWebsite, Seq("siteid", "dn"), "left")
      .join(dwdVipLevel, Seq("vip_id", "dn"), "left_outer")
      .select("...").as[DwsMemberResult]

    val resultData = result.groupByKey(item => item.uid + "_" + item.dn)
      .mapGroups { case (key, iters) =>
        val keys = key.split("_")
        val uid = Integer.parseInt(keys(0))
        val dn = keys(1)
        val dwsMembers = iters.toList
        val paymoney = dwsMembers.filter(_.paymoney != null)
          .map(item => BigDecimal.apply(item.paymoney))
          .reduceOption(_ + _)
          .getOrElse(BigDecimal.apply(0.00)).toString
   ....
    // 分区列不能为null,spark-sql内存表null为字符串
    resultData.where($"dn" =!= "null").show()
    resultData.where($"dn" =!= "null")
      .write.format("iceberg")
      .mode("overwrite").save("hadoop_prod.db.dws_member")
  }
  • ADS统计分析
 def queryDetails(sparkSession: SparkSession, dt: String) = {
    import sparkSession.implicits._
    val result = DwsIcebergDao.queryDwsMemberData(sparkSession).as[QueryResult].where(s"dt='${dt}'")
    result.cache()

    //统计根据url统计人数  wordcount
    result.mapPartitions(partition => {
      partition.map(item => (item.appregurl + "_" + item.dn + "_" + item.dt, 1))
    }).groupByKey(_._1)
      .mapValues(item => item._2).reduceGroups(_ + _)
      .map(item => {
        val keys = item._1.split("_")
        val appregurl = keys(0)
        val dn = keys(1)
        val dt = keys(2)
        (appregurl, item._2, dt, dn)
      }).toDF("appregurl", "num", "dt", "dn")
      .writeTo("hadoop_prod.db.ads_register_appregurlnum").overwritePartitions()

    // 统计各memberlevel等级 支付金额前三的用户: mysql、oracle、hive、phoenix、iceberg对where里都不支持开窗函数,spark内存函数强大
    result.withColumn("rownum", row_number().over(Window.partitionBy("memberlevel").orderBy(desc("paymoney"))))
      .where("rownum<4")
      .orderBy("memberlevel", "rownum")
      .select("...")
      .writeTo("hadoop_prod.db.ads_register_top3memberpay").overwritePartitions()
  }
  • yarn 上测试
    最后是花了 18 分钟跑完 1000 万条数据,查询表数据观察是否有数据丢失。数据没有丢失
    yarn集群测试
Flink+Iceberg 流批一体架构
  • 前期准备
    flink 1.13.0_scala_2.12
    iceberg 0.13.1
    拷贝编译好的iceberg-flink-runtime-1.13-0.13.1.jar到flink/lib
    启动flink集群,运行flink sql:bin/sql-client.sh embedded shell
  • flink cdc采集数据到kafka,流模式写入iceberg
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.enableCheckpointing(6000);
        ...
        kafakSource.setStartFromLatest();
        DataStream<RowData> result = env.addSource(kafakSource).map(item -> {
          ....
            rowData.setField(0, uid);
            rowData.setField(1, courseid);
            rowData.setField(2, deviceid);
            rowData.setField(3, StringData.fromString(array[3].trim()));
            return rowData;
        });

        result.print(">>>处理完数据:");
        TableLoader testtopicTable = TableLoader.fromHadoopTable("hdfs://hadoop01:9820/flink/warehouse/iceberg_db/dwd_view_log");
        FlinkSink.forRowData(result).tableLoader(testtopicTable).build();

        env.execute();
  • 批模式初始化加载数据
   DataStream<RowData> batch = FlinkSource.forRowData().env(env).tableLoader(tableLoader).streaming(false).build();
  • 流模式增量处理数据
DataStream<RowData> stream = FlinkSource.forRowData().env(env).tableLoader(tableLoader).streaming(true).build();
  • DataStream与Table转换写入iceberg
Table table = dwsIcbergDao.queryDwsMemberData(env, tableEnv).where($("dt").isEqual(dt));
        DataStream<QueryResult> queryResultDataStream = tableEnv.toAppendStream(table, QueryResult.class);

        tableEnv.createTemporaryView("tmpA", queryResultDataStream);
        String sql = "select *from(select uid,memberlevel,register,appregurl" +
                ",regsourcename,adname,sitename,vip_level,cast(paymoney as decimal(10,4)),row_number() over" +
                " (partition by memberlevel order by cast(paymoney as decimal(10,4)) desc) as rownum,dn,dt from tmpA where dt='" + dt + "') " +
                " where rownum<4";
        Table table1 = tableEnv.sqlQuery(sql);
        DataStream<RowData> top3DS = tableEnv.toRetractStream(table1, RowData.class).filter(item -> item.f0).map(item -> item.f1);

        String sql2 = "select appregurl,count(uid),dn,dt from tmpA where dt='" + dt + "' group by appregurl,dn,dt";
        Table table2 = tableEnv.sqlQuery(sql2);
        DataStream<RowData> appregurlnumDS = tableEnv.toRetractStream(table2, RowData.class).filter(item -> item.f0).map(item -> item.f1);

        TableLoader top3Table = TableLoader.fromHadoopTable(warehouseDir + "/ads_register_top3memberpay");
        TableLoader appregurlnumTable = TableLoader.fromHadoopTable(warehouseDir + "/ads_register_appregurlnum");

	FlinkSink.forRowData(top3DS).tableLoader(top3Table).overwrite(true).build();
    FlinkSink.forRowData(appregurlnumDS).tableLoader(appregurlnumTable).overwrite(true).build();
优化实践
1 小文件处理
  • Iceberg 0.11 以前,通过定时触发 batch api 进行小文件合并,这样虽然能合并,但是需要维护一套 Actions 代码,而且也不是实时合并的。
Table table = findTable(options, conf);
Actions.forTable(table).rewriteDataFiles()
        .targetSizeInBytes(10 * 1024) // 10KB
        .execute();

Iceberg 0.11 新特性,支持了流式小文件合并。通过分区/存储桶键使用哈希混洗方式写数据、从源头直接合并文件,这样的好处在于,一个 task 会处理某个分区的数据,提交自己的 Datafile 文件,比如一个 task 只处理对应分区的数据。这样避免了多个 task 处理提交很多小文件的问题,且不需要额外的维护代码,只需在建表的时候指定属性 write.distribution-mode,该参数与其它引擎是通用的,比如 Spark 等。

CREATE TABLE city_table ( 
     province BIGINT,
     city STRING
) PARTITIONED BY (province, city) WITH (
    'write.distribution-mode'='hash' 
);
2 排序功能
  • 在 Iceberg 0.11 之前,Flink 是不支持 Iceberg 排序功能的,所以之前只能结合 Spark 以批模式来支持排序功能,0.11 新增了排序特性的支持,Iceberg也支持flink的排序
insert into Iceberg_table select days from Kafka_tbl order by days, province_id;
  • 利用 Iceberg 的排序特性,将天作为分区。按天、小时、分钟进行排序,那么 manifest 文件就会记录这个排序规则,从而在检索数据的时候,提高查询效率,既能实现 Hive 分区的检索优点,还能避免 Hive metadata 元数据过多带来的压力。
总结
  • flink不支持隐藏分区,不支持创建带水位线的表
  • 与 hudi 相比,缺少行级更新,只能对表的数据按分区进行 overwrite 全量覆盖
  • flink近实时入湖
    ① Iceberg 提交 Transaction 时是以文件粒度来提交。这就没法以秒为单位提交 Transaction,否则会造成文件数量膨胀;
    ② 没有在线服务节点。对于实时的高吞吐低延迟写入,无法得到纯实时的响应;
    ③ Flink 写入以 checkpoint 为单位,物理数据写入 Iceberg 后并不能直接查询,当触发了 checkpoint 才会写 metadata 文件,这时数据由不可见变为可见。checkpoint 每次执行都会有一定时间。
2022-03-16 16:09:24,486   INFO --- [                        jobmanager-future-thread-2]  org.apache.flink.runtime.checkpoint.CheckpointCoordinator                       (line: 1250)  :  Completed checkpoint 60 for job c7a6d8df0b422bb4c27a35b21a9142de (9169 bytes in 5 ms).
2022-03-16 16:09:30,481   INFO --- [                                  Checkpoint Timer]  org.apache.flink.runtime.checkpoint.CheckpointCoordinator                       (line:  741)  :  Triggering checkpoint 61 (type=CHECKPOINT) @ 1647418170480 for job c7a6d8df0b422bb4c27a35b21a9142de.
2022-03-16 16:09:30,483   INFO --- [IcebergFilesCommitter -> Sink: IcebergSink hdfs://hadoop01:9820/flink/warehouse/iceberg_db/dwd_view_log (1/1)#0]  org.apache.iceberg.flink.sink.IcebergFilesCommitter                             (line:  162)  :  Start to flush snapshot state to state backend, table: hdfs://hadoop01:9820/flink/warehouse/iceberg_db/dwd_view_log, checkpointId: 61
2022-03-16 16:09:30,483   INFO --- [                        jobmanager-future-thread-6]  org.apache.flink.runtime.checkpoint.CheckpointCoordinator                       (line: 1250)  :  Completed checkpoint 61 for job c7a6d8df0b422bb4c27a35b21a9142de (9169 bytes in 3 ms).
实时数据处理架构实战:从Flink选型到生产级监控 实时数据处理是支撑现代业务即时决策的核心技术,其核心在于构建低延迟、高可靠的数据管道。从技术原理上看,实时系统通常基于流处理引擎,通过事件驱动模型对连续数据流进行计算,其价值在于将传统T+1的批处理模式升级为秒级甚至毫秒级的即时分析,广泛应用于实时监控、风险控制、个性化推荐等场景。在工程实践中,Apache Flink因其强大的状态管理和Exactly-Once语义成为复杂实时计算的事实标准,而Kafka作为数据中枢则提供了可靠的消息缓冲。本文以“SL Real Time Information”项目为例, 阅读详情

相关推荐

《大数据最全面试题-Offer直通车》目录

做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答

大模型大数据攻城狮的专栏 2642

Flink + Iceberg打造流批一体的数据湖架构

对于数据湖架构来说,数据文件在HDFS的分布组织是由写入任务决定的,而对于分布式数仓来说,数据一般是通过JDBC写入,数据的存储组织方式是由数仓本身决定的,所以数仓可以按照对于查询更加友好的方式组织数据的存储,比如对数据文件定期compact到合适的大小或者对数据进行合理排序和分组,对于大规模的数据来说,数据的优化组织可以大大提高查询的效率。在这里需要做一个概念上的澄清:数据湖关注的是对原始数据高效、灵活的处理,DWD 及其他数仓分层是充分设计的数据模型,它并不符合我们对数据湖的定义和需求。

. 6797

Maya ACES工作流程配置(Arnold 及 RedShift 贴图配置规范-还原出SP-Aces流程下贴图正确的效果) PS还原Aces流程下渲染的图

*如果使用SP,项目工程如果新建的时候设置的就是Aces的流程的话,按规范正常导出即可,贴图会带上相对应的后缀,然后贴图导入材质球的时候会根据后缀自动设置相对应的色彩空间;**万一不是,就自己手动设置一下对应的色彩空间即可;然后点击选择当前的或者选择全部导入的贴图,点击右下角后,开始转换;我复制了一下,一个默认没有LUT的效果,然后另外一个是加载2个LUT后的还原效果,和渲染的效果应该是没有区别的,至少我没有看出明显的区别;把需要转换的贴图拖拽到左侧,然后右面选择需要转换到的相对应的色彩空间;...

Yuulily 7993

详解数据仓库数据湖及湖仓一体

性能、成本方面极大提升(MaxCompute 完成了核心引擎的全面升级和性能跳跃式发展,连续三年刷新 TPCx-BigBench 世界记录),数据管理能力空前增强(数据中台建模理论、智能数仓),企业级安全能力大为繁荣(同时支持基于 ACL 和基于规则等多种授权模型,列级别细粒度授权,可信计算,存储加密,数据脱敏等),在联邦计算方面也普遍做了增强,一定程度上开始将非数仓自身存储的数据纳入管理,和数据湖的边界日益模糊。进入数据湖的数据可以是结构化的,也可以是半结构化的,甚至可以是完全非结构化的原始日志。

xljlckjolksl的博客 4146

Unity 2022.3.3 LTS + Visual Studio 2022:手把手教你复刻《吸血鬼幸存者》核心战斗(附完整项目源码)

本文详细介绍了如何使用Unity 2022.3.3 LTS和Visual Studio 2022从零构建《吸血鬼幸存者》式战斗系统。通过图文开发教程,涵盖对象池优化、ECS架构雏形、2D物理碰撞控制等关键技术,帮助开发者高效复刻这款热门游戏的自动攻击与海量刷怪机制。

weixin_30721077的博客 458

03 Aras Innovator二次开发-服务端方法(二)

Aras Innovator二次开发-服务端方法书写

企业信息化(PLM,ERP.MES) 2016

B站基于Iceberg的湖仓一体架构实践

点击上方蓝色字体,选择“设为星标”回复"面试"获取更多惊喜八股文教给我,你们专心刷题和面试Hi,我是王知无,一个大数据领域的原创作者。放心关注我,获取更多行业的一手消息。背景在B站,每天都有PB级的数据注入到大数据平台,经过离线或实时的ETL建模后,提供给下游的分析、推荐及预测等场景使用。面对如此大规模的数据,如何高效低成本地满足下游数据的分析需求,一直是我们重点的工作...

微信搜:import_bigdata,大数据领域硬核原创作者 1974

【我的Android进阶之旅】Android自定义View实现一个游戏摇杆,来实现监听遥动的方向或者监听摇动的角度的功能

一、需求描述 去年有个需求,需要使用自定义View实现一个游戏摇杆,来识别上下左右摇动的方向。 有点类似下面这样的王者荣耀游戏摇杆的效果 二、业界已有的参考资料 在下面这篇博客介绍了如何自定义游戏摇杆 2.1 博客介绍 Android自定义摇杆 2.1.1 功能 支持自适应大小 支持2个方向、4个方向、8个方向的摇动监听 支持摇动角度获取 可选回调模式 支持可摇动区域自定义 支持摇杆自定义 支持设置图片、色值、Shape图形 2.1.2 效果图 2.1.3 设置回调方式 setCallBac

字节卷动 1409

Iceberg源码学习:flink读iceberg流程二

flink读iceberg

yiweiyi329的博客 1348

Android 12.0 SystemUI下拉状态栏定制化之隐藏下拉通知栏布局功能实现(二)

在12.0的系统定制化开发中,由于从12.0开始SystemUI下拉状态栏和11.0的变化比较大,所以可以说需要从新分析相关的SystemUI的 布局,然后做分析来实现不同的功能,今天就开始实现关于隐藏SystemUI下拉状态栏中的通知栏布局系列二,去掉下拉状态栏中 通知栏部分 白色的圆角背景

安卓兼职framework和app工程师的博客 1634

真题库系列之 CCF GESP 2025年12月认证 Python 1级真题含正确答案与解析

学生通过计算机基础知识的学习,了解计算机的构成与操作,以及计算机的发 展历程。通过编程基础知识以及语句的掌握,可以独立完成简单功能的顺序结构、 分支结构、循环结构的程序。

iCloudEnd的博客 316

基于Apache Iceberg打造T+0实时数仓

导语大数据处理技术现今已广泛应用于各个行业,为业务解决海量存储和海量分析的需求。但数据量的爆发式增长,对数据处理能力提出了更大的挑战,同时对时效性也提出了更高的要求。业务通常已不再满足滞...

过往记忆大数据 3372

C#身份验证黑科技:用量子级加密与多维防御矩阵构建坚不可摧的用户管理系统!

某金融系统因身份验证漏洞导致200万用户数据泄露,量子级防御可将攻击面缩小99.99%。

墨夶的博客 353

Iceberg vs Hudi

Iceberg 和 Hudi 的初衷场景并不完全相同,造成了在设计上的差别。因此后面是趋同还筑起各自专长优势壁垒未可知。Hudi跟Spark的代码深度绑定,尤其是写入路径。其设计之初,基本上把Spark作为他们的默认计算引擎了。而 Apache Iceberg 的方向非常坚定,宗旨就是要做一个通用化设计的Table Format。它完美的解耦了计算引擎和底下的存储系统,便于多样化计算引擎和文件格式,很好的完成了数据湖架构中的Table Format。

兴趣是最好的老师 1159

用 SAP S/4HANA Configure Predefined Custom Fields 玩转预定义自定义字段:从概念到实战

SAP预定义自定义字段配置指南:安全扩展业务模型的云原生方案 摘要: 本文系统介绍SAP S/4HANA Cloud中预定义自定义字段的配置方法,对比普通自定义字段与预定义字段的区别,阐述其技术特点与业务价值。重点解析"Configure Predefined Custom Fields"应用的核心功能,包括字段元数据配置、多语言支持、UI集成等能力,并通过业务伙伴扩展案例演示完整实施流程。文章指出预定义字段方案在云环境下的独特优势:既满足业务扩展需求,又能保证系统可升级性,是SaaS环

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 79

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Apache Polaris Catalog 终极指南:5分钟掌握Iceberg跨引擎目录管理

你是否正在为Apache Iceberg的多引擎数据访问而烦恼?想要一个统一的目录服务来管理跨Spark、Flink、Trino等计算引擎的数据资产?**Apache Polaris Catalog**正是你需要的解决方案!作为Apache Iceberg的互操作开源目录,Polaris Catalog提供集中式安全访问控制和跨引擎读写互操作性,彻底解决数据湖目录管理的复杂性。在本文中,你将快速掌

gitblog_00161的博客 329

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Apache Iceberg 生态厂商全景指南:谁在支持 Iceberg 表(附仓库源码佐证)

Apache Iceberg 之所以成为开放数据湖仓事实标准,除了格式规范本身([spec.md](https://link.gitcode.com/i/a0e961e98486332543d016a8f194751a))与核心 Java 实现([core](https://link.gitcode.com/i/70e916f3bafe3df5494e264959005425))之外,还仰赖一个庞

gitblog_00221的博客 1117

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

构建以MinIO为核心的数据湖中台(更新中)

本文介绍了一个基于MinIO对象存储构建的数据湖中台解决方案。该平台采用Apache Iceberg作为开放表格式,整合Kafka、Flink、Spark等开源技术,实现实时流处理与离线批处理的统一。系统架构包括:MinIO作为统一存储底座,Kafka负责数据接入,Flink处理实时数据流,Spark进行批处理分析,PostgreSQL存储元数据。实施步骤涵盖环境准备、实时数据入湖和离线分析处理。该方案具有统一存储、多源整合、实时智能等特点,适用于生产制造等行业的数字化转型需求。

Accompagner的博客 2925

从数据孤岛到3000节点15PB存储的 Doris + Iceberg 湖仓一体实践

天翼云基于Apache Doris和Iceberg构建超大规模湖仓一体平台,成功解决数据孤岛问题。该平台已落地20多个项目,管理超15PB数据,在实时报表、湖仓融合、日志分析、物联网和信创领域取得突破性成果:查询响应缩短至秒级,写入吞吐提升5倍,并发处理达15000QPS,并通过国产化技术优化实现30%性能提升。这一实践为企业数字化转型提供了高效、安全的数据处理新范式。

FeelTouch Labs 395

Icevue:为 Apache Iceberg REST Catalog 打造一个轻量、只读的可视化入口

Icevue 解决的不是如何执行更复杂的 Iceberg 计算,而是如何更简单地理解一张 Iceberg 表。它希望把原本分散在 REST API、metadata JSON、manifest、命令行和 SQL 系统表中的信息,整理成一个轻量、直观、可以随时打开的工作界面。

Turk的专栏 420

Apache Iceberg 与 Amoro 集成指南:湖仓一体管理、自动优化与混合表格式深度解析

Apache Amoro(incubating)是一个构建在开放数据湖格式之上的 Lakehouse 管理系统,它面向 Flink、Spark、Trino 等计算引擎提供可插拔的表维护(Table Maintenance)能力,帮助数据平台以开箱即用的方式获得数据仓库体验,并构建“存储与计算解耦、流批一体、湖原生”的架构。在 Apache Iceberg 生态中,Amoro 承担着"托管层"的角色

gitblog_00154的博客 268

Delta Lake 的 IcebergWriterCompatV1 表特性:为 Iceberg 写入互操作打造的协议约束与 Kernel 实现解析

IcebergWriterCompatV1 是 Delta Lake 协议体系中的一个写端表特性(table feature),它以协议级约束确保 Delta 表可以安全地被转换为 Apache Iceberg™ 格式表。本文以 [protocol_rfcs/iceberg-writer-compat-v1.md](https://link.gitcode.com/i/16d7cc9bdfa25e

gitblog_00823的博客 344

Lakehouse 数据湖三大格式横向深度评测:Apache Iceberg vs Delta Lake vs Apache Hudi 架构选型与适用场景全景对比

在现代大数据技术栈从传统“Lambda 架构 / 分离数仓”向演进的过程中,基于开放列存文件(Parquet / ORC)之上的扮演了整个技术底座的“承重墙”角色。三大数据湖表格式的**底层元数据拓扑(Metadata Architecture)**有什么本质区别?场景下该如何精准选型?本文深度剖析三大湖格式的底层架构机理、对比矩阵,并给出企业级生产选型决策树与实战准则。

2611_95335967的博客 3949

DoEKS未来路线图:探索数据平台在EKS上的七大发展趋势

DoEKS(Data on Amazon EKS)作为构建、部署和扩展亚马逊EKS数据平台的核心工具,正在重塑云原生数据基础设施的未来。本文将深入剖析DoEKS的技术演进方向,揭示数据平台在容器编排环境中如何实现智能化、高性能与高弹性的无缝融合。 ## 1. AI原生数据处理:Agentic智能分析的兴起 AI与数据处理的深度融合正成为DoEKS最具变革性的发展方向。基于LangGraph和A

gitblog_00438的博客 361

程序员如何应对海量数据:从单机思维到分布式分析的范式迁移

海量数据并非单纯指文件体积大,而是标志着数据访问模式、计算范式与系统约束的根本转变。当数据规模突破单机内存承载、SQL直连查询和人工验证能力的临界点,传统编程思维便面临失效——核心矛盾从‘怎么算’转向‘在哪算、谁调度、结果是否可信’。理解数据寻址替代数据持有、列存+向量化执行替代逐行迭代、分层建模替代一把梭、可观测性替代经验主义,是构建高可用分析能力的技术基石。本文聚焦程序员真实落地场景,融合DuckDB、Flink、StarRocks等现代工具链实践,解决‘pandas卡死’‘SQL突然不灵’‘报表总延迟

383
上一篇: 2022 Mysql优化来一波
下一篇: 区块链应用:椭圆曲线数字签名算法ECDSA
架构师老狼
博客等级 码龄14年 44粉丝 57原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值