


问题与挑战
背景
大数据技术栈
系统平台 (Hadoop、CDH、HDP)
云平台 (AWS、GCP、Microsoft Azure)
监控管理 (CM、Hue、Ambari、Dr.Elephant、Ganglia、Zabbix、Eagle、Prometheus)
文件系统 (HDFS、GPFS、Ceph、GlusterFS、Swift 、BeeGFS、Alluxio、JindoFS)
资源调度 (K8S、YARN、Mesos、Standlone)
协调框架 (ZooKeeper 、Etcd、Consul)
数据存储 (HBase、Cassandra、ScyllaDB 、MongoDB、Accumulo、Redis 、Ignite、Geode、CouchDB、Kudu)
行列存储 (Parquet、ORC、Arrow、CarbonData、Avro)
数据湖 (IceBerg、Hudi、DeltaLake)
数据处理 (MaxCompute、Hive、MapReduce、Spark、Flink、Storm、Tez、Samza、Apex、Beam、Heron)
OLAP (Hologres、StarRocks、GreenPlum、Trino/Presto、Kylin、Impala、Druid、ElasticSearch、HAWQ、Lucene、Solr、 Phoenix)
数据采集 (Flume、Filebeat、Logstash、Chukwa)
数据交换 (Sqoop 、Kettle、DataX 、NiFi)
消息系统 (Pulsar、Kafka、RocketMQ、ActiveMQ、RabbitMQ)
任务调度 (Azkaban、Oozie、Airflow、Contab、DolphinScheduler)
数据安全 (Ranger、Sentry、Atlas)
数据血缘 (OpenLineage、Egeria、Marquez、DataHub)
Iceberg+S3+Starrocks+Flink
HDFS+Alluxio+Spark+Trino
HDFS+Hive+GreenPlum


Data Fabric/Data Mesh解决的问题
技术问题:大数据建设架构层出不穷,一直有“Next-Generation”的新产品与组件出现,持续建设导致技术架构多样化,数据存算分散成为常态。(比如某运营商客户同时运维N个小的业务域集群,总部和各省区域集群,数据处理ETL过程冗长,管理运维成本高)
组织问题:单一数据团队架构带来的数据工程需求压力,持续积累汪洋大海一样的数据目录带来高额的分析探查成本。缺少统一的血缘和业务知识导致的数据分析运营困难。而数据价值的挖掘存在知识壁垒,数据分析需求由单一数据部门来响应成为瓶颈,沟通成本高,表面在中台内开发但依然垂直建设烟囱的局面,未来面临一次又一次的重构。
概念分析
Data Fabric
定位:解决分散的数据平台,从技术和产品角度打造元数据驱动的统一的Virtual Layer,屏蔽底层各种数据集成、湖、仓、MPP数据库的差异。数据的读写和计算在各种底层的Warehouse中往来,在统一的自服务平台中编排和计算。
技术要素:数据集成、服务集成、统一的语义(跨引擎)、主动元数据、知识图谱(元数据图结构)、智能数据目录。主动适配各种大数据产品,避免废弃重建,增加了一个虚拟层。在虚拟层中自动进行必要的ETL、计算下推、数据目录智能推荐、数据虚拟化、联邦计算等过程,使开发人员和数据分析对于底层差异无感。
不涉及组织变化:数据分析可以由维护数据平台的人来统一管理和保障也可以跨组织协同。对组织架构无干涉。

Data Fabric Architecture
Data Mesh
面向领域的分布式数据权责划分和架构设计;
数据作为产品;Data as Product;
自服务的平台技术架构;
Level 0: No Data Analytics
Level 1: Operational Database Queries
Level 2: Analyze Own Data
Level 3: Analyze Cross-domain Data
Level 4: Publish Data as a Product
DataWorks and MaxCompute
AWS S3 and Athena
Azure Synapse Analytics
dbt and Snowflake
Databricks
总结
共同:Self-Serve Data Platform, No ETL,立足于解决数据现状分散的问题。是一种架构框架,而不是某款产品。
不同:Mesh偏向方法论,分布式的敏捷数据开发,类比微服务的Service Mesh。Fabric偏向构建虚拟的单体技术架构。

实效性要求高(网格化的数据通过CDC类实时的集成和计算也可以保证低延时)
技术分析
还需要哪些轮子
统一的数据集成、服务集成
统一的语义表达
主动元数据+知识图谱(元数据图结构、血缘),基于元数据的推荐等扩展能力
统一数据目录、统一的Table行列存储结构、统一缓存
跨域联邦计算、自动计算下推。

Impl:具体Catalog的实现类,影响URL和IO的配置
Url: Catalog的存储地址,可以是S3、HDFS,根据Impl的定义有差异
IO: Catalog具体的IO读写实现,比如S3的Catalog存储既可以选择用Hadoop-S3去读写,也可以直接使用S3FileIO Client读写,或者通过Restful API
Warehouse:实际数据的存储地址,可以是HDFS、S3或其他分布式存储

@Override
public Database getDB(String dbName) throws InterruptedException, TException {
org.apache.hadoop.hive.metastore.api.Database db = clients.run(client -> client.getDatabase(dbName));
if (db == null || db.getName() == null) {
throw new TException("Hive db " + dbName + " doesn't exist");
}
return convertToSRDatabase(dbName);
}


Cli Wrapper:对于Python开发的客户端,代码可以重新封装,替换原默认的命令行脚本,在提交过程解析任务执行的代码,分析血缘并转发给后端;
java agent:适用于Java开发的submit job 过程,侵入Jvm加载字节码的过程,分析代码中的血缘并转发给LIneage Backend远程地址;
event listener:对于支持Extra Listener扩展的计算框架,提供定制化的Listener配置,运行时过程中手机元数据信息转发给后端;
与大数据技术服务的关系

大数据异构平台的迁移(解决从A到B的问题):帮助客户实现快速低成本数据、任务和调度统一迁移到云上阿里云大数据产品。搬站服务和工具的一些设计与轻量级的Data fabric关联较大,比如数据迁移依赖MaxCompute的湖仓一体(Inside Hadoop方案)加速客户的数据迁移过程。内部抽象统一的血缘分析和调度的标准化转换屏蔽了客户各种Script、调度DAG的差异。
湖仓、流批架构规划服务(解决A与B共存演进问题):部分客户提到希望可以提供持续演进的规划,中间态多产品共存,比如通过扩展MaxCompute的标准插件实现与开源大数据引擎的联合分析,或者基于HDFS联邦新老集群共存,在在某些架构咨询项目,设计统一的数据湖元数据中心组件实现存储计算结构平滑扩容。
数据生产运营优化(数据价值与生产平衡问题):结合data fabric架构思想设计统一的全链路的数据血缘帮助客户做全面的存储、槽位、Quota等资源分析和优化。对于客户当前已经有多平台共存、云边端协同等场景的大数据架构设计场景,基于data mesh的理论框架,实现数据敏捷分析、快速体现数据业务化价值。


https://www.datamesh-architecture.com/
https://www.datanami.com/2021/10/25/data-mesh-vs-data-fabric-understanding-the-differences/
https://www.starrocks.io/
https://iceberg.apache.org/
https://openlineage.io/
https://www.gartner.com/doc/reprints?id=1-2B6AXOGW&ct=220920&st=sb
https://arrow.apache.org/
https://www.starrocks.io/
https://www.getdbt.com/
https://datahubproject.io/
作者|
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev
打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性
Ruby中的Fixnum方法.next和.succ有什么区别?看起来它的工作原理是一样的:1.next=>21.succ=>2如果有什么不同,为什么有两种方法做同样的事情? 最佳答案 它们是等价的。Fixnum#succ只是Fixnum#next的同义词。他们甚至在thereferencemanual中共享同一block. 关于ruby-Ruby中.next和.succ的区别,我们在StackOverflow上找到一个类似的问题: https://stacko
我明白了defa(&block)block.call(self)end和defa()yieldselfend导致相同的结果,如果我假设有这样一个blocka{}。我的问题是-因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用变量/引用block):defa(&block)yieldselfend这是一个我不理解&block用法的具体案例:defrule(code,name,&block)@rules=[]if@rules.nil?@rules 最佳答案 我能想到的唯一优点就是自省(introspecti
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A
在Ruby中,我试图理解to_enum和enum_for方法。在我提出问题之前,我提供了一些示例代码和两个示例来帮助理解上下文。示例代码:#replicatesgroup_bymethodonArrayclassclassArraydefgroup_by2(&input_block)returnself.enum_for(:group_by2)unlessblock_given?hash=Hash.new{|h,k|h[k]=[]}self.each{|e|hash[input_block.call(e)]示例#1:irb(main)>puts[1,2,3].group_by2.ins
我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro