编者按:编程是确保在21世纪能立足的关键技能之一,但是在语言、框架、平台令人眼花缭乱的编程世界里,初学者应该学习什么样的语言和框架呢?如何才不会在这个黑森林中迷失自己呢?有10多年编程经验的后端工程师Vardan Grigoryan提供了很好的入门指导。尽管初级开发者基本上需要的是有好的问题解决技能,而且你的第一份工作不会要求你了解本文所有的东西,但是这篇文章对于你的职业生涯规划还是会起到很好的帮助作用。
我刚开始码农生涯的时候,主要的烦恼之一是语言/技术的选择问题。我应该学什么,应该从哪里开始?去找第一份程序员工作的时候应该了解什么?当时(10年前)还没有Coursera、 Udemy 或者 SoloLearn。我没法找到明确的方向,光靠自己没法找到通往成功就业的完整路径。这就是21世纪薪水高待遇好衣食无忧的宇航员工作:程序员。
这样的问题仍然存在:初学者仍然受困于选择,想要成为一名好的程序员没有康庄大道,而且社区对于“pythn是不是一门直觉语言??”这样的菜鸟问题也没有那么热心了。走向成功编程生涯的道路甚至比以往还要模糊。你应该在C++/C++11/C++14/C++17、Java、C#、Kotlin、PHP (什么?)、Python、Node.js、JavaScript(等一下,是用Angular、React还是Vue呢?)等等之间做出选择。
语言、技术还是技能?
为了回答你的主要问题,我必须先问你一个问题。你想要什么?你是对开发移动app感到兴奋呢,还是对网站或者Facebook这样的网站或者Medium这样的网站感兴趣?还是说你想开发一款像Photoshop那样的桌面应用?也许你想全情投入到游戏开发?是移动的还是桌面的呢?
回答“要想被技术公司聘为软件工程师我应该了解哪些东西?”的最明智方式是找出成功通过技术面试应该掌握的的主要技能。不过首先,我们应该把一些事情先理顺,来深入探讨一下编程的世界,看看里面都有哪些国家和城市,看看其中的文化和战争,看看个中的得与失。不过如果你性子就是这么急的话,直接往下翻到“准备编码面试”章节吧。
探索编程的世界把我们带到了3个主要平台面前:
Web(Google Search、Facebook、Amazon、Twitter等)
桌面(Dropbox、Photoshop、Visual Studio、Skype等)
移动(SoloLearn、Instagram、Uber等)
上述大多数服务在这三个平台都有。比方说Skype就是一个桌面、移动和web(虽然做得很糟糕)应用。Twitter是一个web和移动应用等等。
Web
在这个上下文背景下web本身就是一个很大的概念,为了讲清楚情况,我们会把他分成所谓的前端和后端,后者是我个人很喜欢的一块。前端是你看到的东西,后端是跑应用的服务器,负责处理用户请求、数据库请求等等。
前端。如果你希望掌握外观,比方说开发好看到让用户爱上的网站,你就应该了解HTML(样子),CSS(外观与感觉),JavaScript(感觉)。不过这还不够,利用纯粹的JavaScript在今天已经不够了,你必须选择合适的框架,比如目前流行的Angular、React和Vue。要选择哪一种主要取决于你最喜欢哪一家公司,是Google还是Facebook?如果你喜欢Google的话,那就用Angular,如果喜欢Facebook的话就用React。如果这两个你都不喜欢(很怪异),那就用Vue吧。简单!除了这些,你还应该掌握一些基本概念,比如HTTP协议的内部工作机制,要熟悉web服务器(至少不应该被Apache或者Nginx这样的名字吓着)。身为一名前端开发者意味着你从后端拿到要渲染(为了用户而装点)的数据,所以要对什么是API有最小限度的理解,对JSON(以及为什么它比XML好)的认知是必须的。(如果这些你都听得一头雾水的话,看看本文末尾的参考章节)。
dWeb上描述前端与后端差异的众多迷因之一。
后端。看不见的真相,未透露的故事。在过去,知道PHP足以自称为后端开发者,然后微软引入了ASP.NET。这两个就开始打架,直到Node.js冒出来把东西整理得井然有序。一些事件驱动开发的概念在Node.js上得到了最好的应用,所以如果你选择这个的话,你就是帮了你的项目大忙了。
后端令人困惑的一部分是语言的多样性,在后端你可以采用任何想要的语言,关键是,“后端”其实是“查询数据库、处理书、对客户端进行响应并且尽可能高效执行”的简称。,而选择“合适”的语言/技术/数据库并非选项。尽管一些开发者钟情MySQL或者PostgreSQL这类的关系数据库,但新进入者却选择黑暗面,NoSQL(比如Cassandra 或者MongoDB)。这个选择完全是个人的,但是我有一个简单的方程式。你有没有给你的数据制订严格的计划并且在不远的将来它都不会有太大的变化?如果是的话选择关系式数据库。你是不是每分钟的访问量超过了100万次?那就选NoSQL(很痛苦)。你的产品是不是频繁变更?那就选NoSQL。现在,假设你选好数据库,但是你又打算具体选择什么样的技术呢?你喜欢微软吗?有Windows Server吗?那就选MsSQL。你喜欢Oracle?那就选Oracle。你对Oracle没意见,但是很讨厌微软?选MySQL。你只是不想伤害任何人?那就选PostgreSQL吧。
NoSQL这玩意儿其实挺棘手的。这东西要取决于你的服务和数据架构。你得到的只是文档以及其中的一些弱连接?选MongoDB。你需要存储一大堆的键值对?选Redis。你正致力于类似图的结构(Facebook的朋友图谱,Google的知识图谱等)?选择Neo4j。其实你也不确定自己究竟想要什么,但是觉得这些全都需要?选ArangoDB吧。
数据库保存了所有的必要数据,但是你得客户端要想读/写该数据库却要你定义一个API。这里最有用的选项是Node.js,尽管你也可以用PHP或者ASP.NET、Ruby、Python,但我的个人推荐还是Node.js。好吧,Facebook后端用的是PHP,算是吧。他们用C++重写了PHP的很大一部分。一些人用Python而有的则喜欢用Ruby。诚然,你几乎可以用任何一种语言写后端,比方说Google用的是C++、Java和Python(以及Go)。对于底层的数据处理,C++是最合适的,对于像更新用户朋友推荐这样的后台任务,Java是一个好的选项。对于数据分析或者自然语言处理或者目前红得发紫额AI相关任务,你极有可能用的是Python。
再次地,后端除了各种语言、框架、数据库以外,你还需要掌握一些核心概念。
缓存(Caching)。从CPU缓存(有不同的级别)开始,到浏览器缓存结束,缓存无所不在。对于像Google Search或者Facebook这样的高负载服务来说,缓存是极其必要的。
服务器(Server)。你可能会认为这个跟硬件有关(如果你懂得如何设置几台服务器让它们成为一个整体去存储和处理数据的话当然很棒),不过对于后端开发者来说服务器意味着web服务器。当今流行的web服务器是Nginx,知道如何安装和配置这个玩意儿的话会对你今后大有裨益。
套接字(Sockets)。套接字是网络编程的基石。你通过网络发送/接收所有东西都是通过套接字进行的。了解套接字编程的底层细节对于你的技能军火库来说是非常有用的补充(知道TCP套接字、UDP套接字之间的区别,以及什么是WebSockets更是锦上添花)。
数据库设计。不管你选择了什么样的DBMS,对数据进行操作都会是你的主要任务之一。看清数据全貌,对数据进行可视化,并且将数据单元连接起来,这是你在编程生涯中需要掌握的一项技能。
安全。就像前面提到的其他概念一样,这个概念也非常宽泛。你无法彻底掌握其中的任何一种,所以至少你应该熟悉一些最佳实践,比如存储面哈希值而不是明文。通过API令牌检查请求,要对每一项请求验证用户许可等等。
桌面
我们会讨论桌面应用中令其成为桌面应用的那部分内容。在桌面平台上需要特殊技能组合的应用数不胜数,比方说,Photoshop处理的是图像,如果你想写类似Photoshop这样的东西的话,了解图像处理算法和技术就是必须。如果你想写类似Dropbox这样的东西,了解套接字编程就是必须。如果你想编写编译器或者类似Visual Studio这样的IDE,则知道如何设计编译器就是必须。具体细节这里就不谈了,我们就先探讨一下如果要做桌面平台的东西的话,你最有可能会用到的语言吧。
说到桌面应用的语言,开发者得在C++、Java或者C#之中做出艰难选择。不过这里有一个简单的公式帮你做出正确选择:如果你喜欢微软,用C#。如果你喜欢Oracle,用Java。如果你认为语言不应该从属于从何一家公司,用C++。如果这个的帮助作用不大,我们就讨论一下具体的子平台。如果你编写的软件只是给Windows用户用的,C#是最佳选择。理由很显然,这两个都是微软的产品,自然也会是最佳拍档。尽管C#的开发者坚称在发布了.Net Core之后,其实C#也可以用于Linux环境,但我个人建议是如果你也想覆盖Linux的话,那就用C++。其关键是,C++本身就是作为跨平台编程语言开发出来的,在所有操作系统中都表现得很好(是的,甚至在MacOS上)。在这个上下文中跨平台会假设你要把你的C++项目在各个操作系统中都要独立地进行编译,从而在具体的OS中交付“不同”的应用可执行文件。还有,说实话C++缺乏任何的GUI。实际上,这一点最大的借口可以说“C++是给铁杆开发者准备的,而铁杆开发者除了Terminal(命令行接口)以外什么都不用。”然而,一群很友好的开发者聚到一起开发出了Qt,这是完美适配C++的跨平台GUI库。
最后,如果你对C++的复杂性以及你得连接像Qt这样的独立库用户才能拥有完整的GUI体验感到愤怒,并且你讨厌要为不同的OS给你的产品编译和交付不同的可执行文件的话,那就用Java。Java有一个虚机,所以交付可执行文件很容易。你的应用在任何安装了JVM(Java虚拟机器)的OS都能工作得一样好。
移动
说到Java,第一个想到的东西就是Android。在Kotlin被引进之前很久时,Java是实现Android app事实上的标准语言。而在今天,Kotlin俘获了开发者的心,使得Android平台的应用开发体验变得更好。所以,如果你想要制作Android app的话,你应该在Java和Kotlin之间进行选择。为了做出正确的选择,我们应该看看幕后的东西。关键是,Google对Oracle不太感冒。Java是Oracle的,而Java统治着Google的Android,所以为了让自己有点灵活性,Google在明面上必须引入一个选项(或者在暗面上,这取决于你),而引入Kotlin的目的就是“哇哦,如果有这么个好东西的话为什么要用Java呢。”如果你刚开始你的Android开发者生涯的话,我个人建议你从Kotlin开始,尽管要想在市场上成为一名胜任的开发者,你必须支持此前已经用Java实现的app,所以,知道Java的话对你的简历会是个加分项。
最后是iOS。iLand完全是另一个故事。很长一段时间以来,Objective-C是iOS的统治性语言,而且说实话,掌握Objective-C需要非常认真,要有一些好耐性。这也是look开发者数量相对较少的主要原因之一,所以苹果最终做出了正确的选择,引入了Swift。Swift掌握起来要比Objective-C容易多了,这使得iOS的开发者数量出现了增加。所以,要想成为一名iOS开发者,你需要跟进Swift,但要想成为一名真正自信的开发者,建议你掌握Objective-C,从而为app(无数app都是用Objective-C写的)提供支持。
这里我还必须提一提React Native,因为它允许你只用JavaScript编写同时支持Android和iOS平台的app,然而,作为这个市场一个新的变化节奏很快的玩家,我们知道有这么一个东西,而如果你只知道JavaScript的话自己就能写简单的app了。
准备编码面试
在编程世界有些概念是基础。大多数技术面试的目的都是为了发现你的问题解决技能以及看看你是否了解那些概念,所以除了掌握一门编程语言之外,你应该熟悉一些在程序员军火库中必须的一些概念。
要想为编码面试做好成功准备,你应该对以下领域有自信:
算法与数据结构
计算机组织&操作系统
编码
系统设计
算法&数据结构
这是程序眼最迫切需要的技能集。以下是每一位程序员都应该熟悉的主题:
算法复杂性:大O的概念以及如何计算算法复杂性;基于复杂性知道哪一种算法更好,比方说O(N) vs O(logN)。
基本数据结构&适配器:数组、链接表、堆栈、队列。
排序&搜索:知道各种排序算法可帮助你识别项目的最佳的实现。作为练习,不妨试着实现以下插入排序选择排序或者合并排序,然后识别线性搜索与折半搜索的不同。
数&图:树和图无所不在,可以从Facebook的“朋友图谱”和Google Search的“知识图谱”开始。
哈希表:作为世界上最有效的数据结构之一,哈希表一直都是一个好选择。你应该能够实现一个哈希表并且熟悉解决冲突的技巧。
计算机组织&操作系统
强烈建议你要熟悉的主题包括:
逐位运算
CPU是如何执行机器代码的
RAM与动态RAM之间的区别时什么
有哪些类型的OS内核
“互斥”与“信号量”之间的区别是什么
什么是死锁,什么是活锁
编码
你应该至少对一门语言有着非常好的了解。要知道你喜欢的语言所有的优缺点,最佳实践,这有助于你写出优雅高效可读性强的代码。
高度推荐你通过解决有挑战性的问题来进练习,比如:
约瑟夫斯问题
汉诺塔
字符串压缩
平衡括号(Balanced Parenthesis)
孪生素数
系统设计
知道面向对象编程对现代程序员来说是必须的。
系统设计意味着要考虑整个系统,能够设计其架构、对其按类进行详细分析,定义对象的交互。
要准备好回答下述问题:
——让你设计Google Search的话你会怎么设计?如果每秒钟有数百万的并发请求该怎么办?
——你会如何去实现Facebook的朋友查找?
——为什么你需要使用关系式数据库管理系统?
——为什么你要使用NoSQL DB?
高度建议你了解和使用正确的设计模式。比方说,你应该知道Composite(组成)与Decorator(装饰)这两种结构型模式的不同。
尽管初级开发者基本上需要的是有好的问题解决技能,而且你的第一份工作不会要求你上述所有的东西都懂,但是这个列表对于你的职业生涯规划还是会起到很好的帮助作用。
原文链接:https://medium/sololearn/warning-your-programming-career-b9579b3a878b
编译组出品。编辑:郝鹏程。
在数据仓库、数据平台、数据中台、数据湖的相关概念中,都与数据有关系,但它们之间又有什么区别呢?本文围绕它们的概念、架构、使用场景进行了介绍,一起来看一下吧。
我们经常听到别人谈论数据仓库、数据平台、数据中台、数据湖的相关概念,它们都与数据有关系,但它们之间又有什么区别,下面我们将围绕数据仓库、数据平台、数据湖和数据中台的概念、架构、使用场景进行介绍。
一、数据仓库1. 数据仓库概念数据仓库由比尔·恩门(Bill Inmon,数据仓库之父)于1990年提出,主要功能是将企业系统联机事务处理(OLTP)长期壁垒的大量数据,通过数据仓库理论支持所持有的数据存储结构,做有系统的分析整理。
随着企业的发展,业务系统的数据不断激增,这些存储在企业业务数据库中(也就是关系型数据库Oracle,Microsoft SQL Sever,MySQL等)数据会随着时间的积累越来越多,会使业务数据库会有一定的负载,导致业务系统的运行效率低,且这些数据中有很大一部分是冷数据,而我们业务系统一般对我们近期的数据,也就是热数据调用的比较频繁,对冷数据使用频率较低。
同时随着企业数据驱动业务概念的兴起,企业需要将各业务部门的业务数据提取出来进行数据分析与挖掘,辅助高层进行分析与决策,但各部门需求的数据种类千差万别,接口错综复杂,过多的数据查询脚本以及接口的接入导致业务数据库的稳定性降低。
为了避免冷数据与历史数据的积压对我们业务数据库效能产生影响,企业需要定期将冷数据从业务数据库中转移出来存储到一个专门存放历史数据的仓库里面,各部门可以根据自身业务特性对外提供统一的数据服务,这个仓库就是数据仓库。
2. 数据仓库特点数据仓库(Data Warehoese)的特点:面向主题的、集成的、稳定的、反映历史数据变化的。
面向主题的:数据仓库是用来分析特点主题域的,所以说数据仓库是面向主题的。例如,电商行业的主题域通常分为交易域、会员域、商品域等。集成的:数据仓库集成了多个数据源,同一主题或产品相关数据可能来自不同的系统不同类型的数据库,日志文件等。稳定的:数据一旦进入数据仓库,则不可改变。数据仓库的历史数据是不应该被更新的,同时存储稳定性较强反映历史数据变化的:数据仓库保存了长期的历史数据,这点相对OLTP的数据库而言。因为性能考虑后者统筹保存近期的热数据。3. OLTP与OLAP1)OLTP与OLAP概念
数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。
OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
2)OLTP与OLAP区别
OLTP 系统强调数据库内存效率,强调内存各种指标的命令率,绑定变量,并发操作等。OLAP 系统则强调数据分析,强调SQL执行市场,磁盘I/O,分区等。
3)OLAP与数据仓库的联系
OLAP和数仓的关系是依赖互补的,一般以数据仓库作为基础,既从数据仓库中抽取出详细数据的一个子集并经过必要的聚集存储到OLAP存储中供数据分析工具读取。
4. 数据仓库的作用数据仓库将来自不同来源的结构化数据聚合起来,用于业务智能领域的比较和分析,数据仓库是包含多种数据的存储库,并且是高度建模的。
如下图所示:各个系统的元数据通过ETL同步到操作性数据仓库ODS中,对ODS数据进行面向主题域建模形成DW(数据仓库),DM是针对某一个业务领域建立模型,具体用户(决策层)查看DM生成的报表。
什么是ETL?(extraction-transformation-load 抽取-转换-加载)
传统的数据仓库集成处理架构是ETL,利用ETL平台的能力,E=从源数据库抽取数据,L=将数据清洗(不符合规则的数据)、转化(对表按照业务需求进行不同维度、不同颗粒度、不同业务规则计算进行统计),T=将加工好的表以增量、全量、不同时间加载到数据仓库。
什么是ELT?(extraction-load-transformation抽取-加载-转换)
大数据背景下的架构体系是ELT结构,其根据上层的应用需求,随时从数据中台中抽取想要的原始数据进行建模分析。
ELT是利用数据库的处理能力,E=从源数据库抽取数据,L=把数据加载到目标库的临时表中,T=对临时表中的数据进行转换,然后加载到目标库目标表中。
ELT对比ETL的优势:
资源利用率的提升:ELT主要通过数据库引擎来实现系统的可扩展性(尤其是当数据加工过程在晚上时,可以充分利用数据库引擎的资源)。任务运行效率的提升:ELT可以保持所有的数据始终在数据库当中,避免数据的加载和导出,从而保证效率,提高系统的可监控性。并行处理优化:ELT可以根据数据的分布情况进行并行处理优化,并可以利用数据库的固有功能优化磁盘I/O。可扩展性增强:ELT的可扩展性取决于数据库引擎和其硬件服务器的可扩展性。性能优化:通过对相关数据库进行性能调优,ETL过程获得3到4倍的效率提升一般不是特别困难。数据仓库系统的作用能实现跨业务条线、跨系统的数据整合,为管理分析和业务决策提供统一的数据支持。数据仓库能够从根本上帮助你把公司的运营数据转化成为高价值的可以获取的信息(或知识),并且在恰当的时候通过恰当的方式把恰当的信息传递给恰当的人。以下图为例:
数据仓库的作用主要体现在企业决策、分析、计划和响应以下几个方面:
数据仓库针对实时数据处理和非结构化数据处理能力较弱,以及在业务在预警预测等方面应用有一定的限制。
二、数据平台1. 数据平台概念大数据时代,数据平台一般被称之为大数据平台。
狭义上的数据平台:是为了解决数据仓库不能处理非结构化数据和报表开发周期长的问题,所以先撇开业务需求、把企业所有的数据都抽取出来放到一起,成为一个大的数据集,其中有结构化数据、非结构化数据等。当业务方有需求的时候,再把他们需要的若干个小数据集单独提取出来,以数据集的形式提供给数据应用。
广义的大数据平台:广义的大数据平台通常被赋予更多的使命,以处理海量数据存储、计算及不间断流数据实时计算、离线计算、智能推荐、交互式查询、数据湖构建等场景为主的一套基础设施。典型的包括基于Hadoop 生态构建的大数据平台。提供易于部署及管理的 Hive、Spark、HBase、Flink、StarRocks、Iceberg、Alluxio 等开源大数据计算和存储引擎。
狭义的数据平台和传统的数据平台(数据仓库)功能一致,区别只是技术架构和数据容量方面的不同。
广义上的大数据平台是数据湖的基座,提供易于部署和管理的泛Hadoop生态及其他存储计算引擎的PaaS平台,助力企业构建企业级数据湖技术架构。
Tip:本文以狭义的数据平台进行对比,这里不对狭义的数据平台做过多概述。
三、数据中台1. 数据中台概念数据中台的起源:2015 年年中,马云带领阿里巴巴集团高管拜访了一家芬兰的小型游戏公司 Supercell。这家仅有不到 200 名员工的小型游戏公司竟创造了高达 15 亿美元的年税前利润!而 Supercell 之所以能够支持多个团队快速、敏捷地推出高质量的游戏作品,其强大的中台能力功不可没。
因此,在拜访 Supercell 的旅程结束之后,马云决定对阿里巴巴的组织和系统架构进行整体调整,建立阿里产品技术和数据能力的强大中台,构建“大中台,小前台”的组织和业务体制。
数据中台的主要目的:解决企业在发展过程中,由于数据激增与业务的扩大而出现的统计口径不一致、重复开发、指标开发需求响应慢、数据质量低、数据成本高等问题。通过一系列数据工具(元数据中心、数据指标中心、数仓模型中心、数据资产中心-资产质量/治理/安全、数据服务中心等),规范数据供应链的各个环节。
2. 数据中台特点数据中台特点:以一种标准的、安全的、可靠的、统一的、共享的、解耦的、服务化的方式支持前端数据的应用。
3. 数据中台作用(阿里数据中台逻辑架构图)
(数据中台产品能力图)
数据中台通过对企业内外部多源异构的数据采集、建设、管理、分析和应用,使数据对内优化管理提高业务价值,对外进行数据合作让业务价值得到释放,使之成为企业数据资产管理中枢。数据中台建立后,会形成数据API服务,为企业和客户提供高效各种数据服务。
数据中台对一个企业的数字化转型和可持续发展起着至关重要的作用。数据中台为解耦而生,企业建设数据中台的最大意义就是应用与数据之间的解耦,这样企业就可以不受限制地按需构建满足业务需求的数据应用。
构建了开放、灵活、可扩展的企业级统一数据管理和分析平台, 将企业内、外部数据随需关联,打破了数据的系统界限。
利用大数据智能分析、数据可视化等技术,实现了数据共享、日常报表自动生成、快速和智能分析,满足企业各级部门之间的数据分析应用需求。
深度挖掘数据价值,助力企业数字化转型落地。实现了数据的目录、模型、标准、认责、安全、可视化、共享等管理,实现数据集中存储、处理、分类与管理,建立大数据分析工具库、算法服务库,实现报表生成自动化、数据分析敏捷化、数据挖掘可视化,实现数据质量评估、落地管理流程。
四、数据湖1. 数据湖概念数据湖起源:数据湖的起源,应该追溯到2010年10月,由 Pentaho 的创始人兼 CTO, James Dixon 所提出,他提出的目的就当时历史背景来看,其实是为了推广自家产品 Pentaho。当时核心要解决的问题是传统数据仓库报表分析面临的两个问题:
只使用部分属性,这些数据只能回答预先定义好(pre-determined)的问题。数据被聚合了,最低层级的细节丢失了,能回答的问题被限制了。而我们当前所讨论的数据湖,已经远远超过了当初 James Dixon 所定义的数据湖,各厂商之间也对数据湖有了更多的不同定义。
1)AWS
A data lake is a centralized repository that allows you to store all your structured and unstructured data at any scale. You can store your data as-is, without having to first structure the data, and run different types of analytics—from dashboards and visualizations to big data processing, real-time analytics, and machine learning to guide better decisions.
“数据湖是一个集中式存储库,允许您以任意规模存储所有结构化和非结构化数据。您可以按原样存储数据(无需先对数据进行结构化处理),并运行不同类型的分析– 从控制面板和可视化到大数据处理、实时分析和机器学习,以指导做出更好的决策。”
2)微软
Azure Data Lake includes all the capabilities required to make it easy for developers, data scientists, and analysts to store data of any size, shape, and speed, and do all types of processing and analytics across platforms and languages. It removes the complexities of ingesting and storing all of your data while it faster to get up and running with batch, streaming, and interactive analytics.
“Azure 的数据湖包括一切使得开发者、数据科学家、分析师能更简单的存储、处理数据的能力,这些能力使得用户可以存储任意规模、任意类型、任意产生速度的数据,并且可以跨平台、跨语言的做所有类型的分析和处理。数据湖在能帮助用户加速应用数据的同时,消除了数据采集和存储的复杂性,同时也能支持批处理、流式计算、交互式分析等。”
3)阿里云
“数据湖是统一存储池,可对接多种数据输入方式,您可以存储任意规模的结构化、半结构化、非结构化数据。数据湖可无缝对接多种计算分析平台,根据业务场景不同,可以选择相应的计算引擎对数据湖中存储的数据进行数据处理与分析,从而打破孤岛,挖掘业务价值。”
2. 数据湖内容数据湖中包括来自于关系型数据库中的结构化数据(行和列)、半结构化数据(如CSV、日志、XML、JSON)、非结构化数据(如 email、文档、PDF 等)和 二进制数据(如图像、音频、视频)。
3. 数据湖的特点统一的数据存储,存放原始的数据。支持任意结构的数据存储,包括结构化、半结构化、非结构化。支持多种计算分析,适用多种应用场景。支持任意规模的数据存储与计算能力。目标都是为了更好,更快的发现数据价值。4. 数据湖能够解决的问题1)数据湖整体架构
最底下是分布式文件系统;
第二层是数据加速层。数据湖架构是一个存储计算彻底分离的架构,如果所有的数据访问都远程读取文件系统上的数据,那么性能和成本开销都很大。如果能把经常访问到的一些热点数据缓存在计算节点本地,这就非常自然的实现了冷热分离,一方面能收获到不错的本地读取性能,另一方面还节省了远程访问的带宽。
第三层就是 Table format 层,主要是把一批数据文件封装成一个有业务意义的 table,提供 ACID、snapshot、schema、partition 等表级别的语义。
最上层就是不同计算场景的计算引擎了。开源的一般有 Spark、Flink、Hive、Presto、Hive MR 等,这一批计算引擎是可以同时访问同一张数据湖的表的。
2)数据湖能解决哪类问题
数据分散,存储散乱,形成数据孤岛,无法联合数据发现更多价值。
这方面来讲,其实数据湖要解决的与数据仓库是类似的问题,但又有所不同,因为它的定义里支持对半结构化、非结构化数据的管理。而传统数据仓库仅能解决结构化数据的统一管理。
在这个万物互联的时代,数据的来源多种多样,随着不同应用场景,产出的数据格式也是越来越丰富,不能再仅仅局限于结构化数据。如何统一存储这些数据,就是迫切需要解决的问题。
3)存储成本
数据库或数据仓库的存储受限于实现原理及硬件条件,导致存储海量数据时成本过高,而为了解决这类问题就有了HDFS/对象存储这类技术方案。数据湖场景下如果使用这类存储成本较低的技术架构,将会为企业大大节省成本。结合生命周期管理的能力,可以更好的为湖内数据分层(冷温热存放在不同的存储介质:HDD、SSD、MEM),不用纠结在是保留数据还是删除数据节省成本的问题。
4)SQL已经无法满足的分析需求
越来越多种类的数据,意味着越来越多的分析方式,传统的 SQL 方式已经无法满足分析的需求,如何通过各种语言自定义贴近自己业务的代码,如何通过机器学习挖掘更多的数据价值。
5)存储/计算扩展性不足
传统数据库等在海量数据下,如规模到 PB 级别,因为技术架构的原因,已经无法满足扩展的要求或者扩展成本极高,而这种情况下通过数据湖架构下的扩展技术能力,实现成本为0,硬件成本也可控。业务模型不定,无法预先建模。
传统数据库和数据仓库,都是 Schema-on-Write 的模式,需要提前定义 Schema 信息。而在数据湖场景下,可以先保存数据,后续待分析时,再发现 Schema,也就是 Schema-on-Read。
五、对比1. 数据仓库 VS 数据中台 VS 数据湖2. 数据仓库 VS 数据平台因狭义的数据平台是由于数据仓库具有历史性的特性,其中存储的数据大多是结构化数据,而数据平台的出现解决了数据仓库不能处理非结构化数据和报表开发周期长的问题,故将数据仓库与数据平台(狭义)单独做对比。
本质区别:技术架构和数据容量方面的不同。
通过以上的论述,我们发现数据平台和数据湖好像存在诸多相似性,这二者之间的区别,从个人角度理解上分析应该是数据加工的角度不同,数据湖更着重于对原始数据的存储,而数据平台则同数据仓库一样,需对原始数据进行清洗、转换等数据处理后按照统一的标准规范进行存储。
六、总结根据以上数据平台、数据仓库、数据湖和数据中台的概念论述和对比,我们进行如下总结:
数据中台、数据仓库和数据湖没有直接的关系;数据中台、数据平台、数据仓库和数据湖在某个维度上为业务产生价值的形式有不同的侧重;数据仓库是数据驱动业务的逻辑概念,用于支持管理决策分析,为业务提供服务的主要方式是报表;数据中台是企业级的逻辑概念,体现企业数据向业务价值转化的能力,为业务提供服务的主要方式是数据 API;数据湖是企业级的技术逻辑概念,体现企业级数据湖架构加速数据向业务价值转化的能力,为业务提供服务的主要方式是原始数据;数据中台、数据湖距离业务更近,能够更快速的响应业务和应用开发需求,从而为业务提供速度更快的服务;数据中台可以建立在数据仓库和数据平台之上,是加速企业从数据到业务价值的过程的中间层;本文由 @Z先生聊产品 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自Unsplash,基于CC0协议。
该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务。