https://www.zhihu.com/question/37627092


背景:


作者:Xiaoyu Ma
链接:https://www.zhihu.com/question/37627092/answer/72948056
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

对小公司来说,大概自己找一两台机器架个集群算算,也算是大数据平台了。在初创阶段,数据量会很小,不需要多大的规模。这时候组件选择也很随意,Hadoop一套,任务调度用脚本或者轻量的框架比如luigi之类的,数据分析可能hive还不如导入RMDB快。监控和部署也许都没时间整理,用脚本或者轻量的监控,大约是没有ganglia、nagios,puppet什么的。这个阶段也许算是技术积累,用传统手段还是真大数据平台都是两可的事情,但是为了今后的扩展性,这时候上Hadoop也许是不错的选择。
当进入高速发展期,也许扩容会跟不上计划,不少公司可能会迁移平台到云上,比如AWS阿里云什么的。小规模高速发展的平台,这种方式应该是经济实惠的,省了运维和管理的成本,扩容比较省心。要解决的是选择平台本身提供的服务,计算成本,打通数据出入的通道。整个数据平台本身如果走这条路,可能就已经基本成型了。走这条路的比较有名的应该是netflix。


也有一个阶段,你发现云服务的费用太高,虽然省了你很多事,但是花钱嗖嗖的。几个老板一合计,再玩下去下个月工资发布出来了。然后无奈之下公司开始往私有集群迁移。这时候你大概需要一群靠谱的运维,帮你监管机器,之前两三台机器登录上去看看状态换个磁盘什么的也许就不可能了,你面对的是成百上千台主机,有些关键服务必须保证稳定,有些是数据节点,磁盘三天两头损耗,网络可能被压得不堪重负。你需要一个靠谱的人设计网络布局,设计运维规范,架设监控,值班团队走起7*24小时随时准备出台。然后上面再有平台组真的大数据平台走起。
然后是选型,如果有技术实力,可以直接用社区的一整套,自己管起来,监控部署什么的自己走起。这个阶段部署监控和用户管理什么的都不可能像两三个节点那样人肉搞了,配置管理,部署管理都需要专门的平台和组件;定期Review用户的作业和使用情况,决定是否扩容,清理数据等等。否则等机器和业务进一步增加,团队可能会死的很惨,疲于奔命,每天事故不断,进入恶性循环。
当然有金钱实力的大户可以找Cloudera,Hortonworks,国内可以找华为星环,会省不少事,适合非互联网土豪。当然互联网公司也有用这些东西的,比如Ebay。
接下去你可能需要一些重量的组件帮你做一些事情。
比如你的数据接入,之前可能找个定时脚本或者爬log发包找个服务器接收写入HDFS,现在可能不行了,这些大概没有高性能,没有异常保障,你需要更强壮的解决方案,比如Flume之类的。


你的业务不断壮大,老板需要看的报表越来越多,需要训练的数据也需要清洗,你就需要任务调度,比如oozie或者azkaban之类的,这些系统帮你管理关键任务的调度和监控。
数据分析人员的数据大概可能渐渐从RDBMS搬迁到集群了,因为传统数据库已经完全hold不住了,但他们不会写代码,所以你上马了Hive。然后很多用户用了Hive觉得太慢,你就又上马交互分析系统,比如Presto,Impala或者SparkSQL。
你的数据科学家需要写ML代码,他们跟你说你需要Mahout或者Spark MLLib,于是你也部署了这些。
至此可能数据平台已经是工程师的日常工作场所了,大多数业务都会迁移过来。这时候你可能面临很多不同的问题。
比如各个业务线数据各种数据表多的一塌糊涂,不管是你还是写数据的人大概都不知道数据从哪儿来,接下去到哪儿去。你就自己搞了一套元数据管理的系统。
你分析性能,发现你们的数据都是上百Column,各种复杂的Query,裸存的Text格式即便压缩了也还是慢的要死,于是你主推用户都使用列存,Parquet,ORC之类的。
又或者你发现你们的ETL很长,中间生成好多临时数据,于是你下狠心把pipeline改写成Spark了。
再接下来也许你会想到花时间去维护一个门户,把这些零散的组件都整合到一起,提供统一的用户体验,比如一键就能把数据从数据库chua一下拉到HDFS导入Hive,也能一键就chua一下再搞回去;点几下就能设定一个定时任务,每天跑了给老板自动推送报表;或者点一下就能起一个Storm的topology;或者界面上写几个Query就能查询Hbase的数据。这时候你的数据平台算是成型了。


当然,磕磕碰碰免不了。每天你都有新的问题和挑战,否则你就要失业了不是?
你发现社区不断在解决你遇到过的问题,于是你们架构师每天分出很多时间去看社区的进展,有了什么新工具,有什么公司发布了什么项目解决了什么问题,兴许你就能用上。
上了这些乱七八糟的东西,你以为就安生了?Hadoop平台的一个大特点就是坑多。尤其是新做的功能新起的项目。对于平台组的人,老板如果知道这是天然坑多的平台,那他也许会很高兴,因为跟进社区,帮忙修bug,一起互动其实是很提升公司影响力的实情。当然如果老板不理解,你就自求多福吧,招几个老司机,出了问题能马上带路才是正道。当然团队的技术积累不能不跟上,因为数据平台还是乱世,三天不跟进你就不知道世界是什么样了。任何一个新技术,都是坑啊坑啊修啊修啊才完善的。如果是关键业务换技术,那需要小心再小心,技术主管也要有足够的积累,能够驾驭,知道收益和风险。


大数据平台从平台部署和数据分析过程可分为如下几步:

1、linux系统安装
 一般使用开源版的Redhat系统--CentOS作为底层平台。为了提供稳定的硬件基础,在给硬盘做RAID和挂载数据存储节点的时,需要按情况配置。例如,可以选择给HDFS的namenode做RAID2以提高其稳定性,将数据存储与操作系统分别放置在不同硬盘上,以确保操作系统的正常运行。

2、分布式计算平台/组件安装
 目前国内外的分布式系统的大多使用的是Hadoop系列开源系统。Hadoop的核心是HDFS,一个分布式的文件系统。在其基础上常用的组件有Yarn、Zookeeper、Hive、Hbase、Sqoop、Impala、ElasticSearch、Spark等。
 先说下使用开源组件的优点:1)使用者众多,很多bug可以在网上找的答案(这往往是开发中最耗时的地方)。2)开源组件一般免费,学习和维护相对方便。3)开源组件一般会持续更新,提供必要的更新服务『当然还需要手动做更新操作』。4)因为代码开源,若出bug可自由对源码作修改维护。
 再简略讲讲各组件的功能。分布式集群的资源管理器一般用Yarn,『全名是Yet Another Resource Negotiator』。常用的分布式数据数据『仓』库有Hive、Hbase。Hive可以用SQL查询『但效率略低』,Hbase可以快速『近实时』读取行。外部数据库导入导出需要用到Sqoop。Sqoop将数据从Oracle、MySQL等传统数据库导入Hive或Hbase。Zookeeper是提供数据同步服务,Yarn和Hbase需要它的支持。Impala是对hive的一个补充,可以实现高效的SQL查询。ElasticSearch是一个分布式的搜索引擎。针对分析,目前最火的是Spark『此处忽略其他,如基础的MapReduce 和 Flink』。Spark在core上面有ML libSpark StreamingSpark QLGraphX等库,可以满足几乎所有常见数据分析需求。
 值得一提的是,上面提到的组件,如何将其有机结合起来,完成某个任务,不是一个简单的工作,可能会非常耗时。

3、数据导入
 前面提到,数据导入的工具是Sqoop。用它可以将数据从文件或者传统数据库导入到分布式平台『一般主要导入到Hive,也可将数据导入到Hbase』。

4、数据分析
  数据分析一般包括两个阶段:数据预处理数据建模分析
数据预处理是为后面的建模分析做准备,主要工作时从海量数据中提取可用特征,建立大宽表。这个过程可能会用到Hive SQL,Spark QL和Impala。
数据建模分析是针对预处理提取的特征/数据建模,得到想要的结果。如前面所提到的,这一块最好用的是Spark。常用的机器学习算法,如朴素贝叶斯、逻辑回归、决策树、神经网络、TFIDF、协同过滤等,都已经在ML lib里面,调用比较方便。

5、结果可视化及输出API
 可视化一般式对结果或部分原始数据做展示。一般有两种情况,行数据展示,和列查找展示。在这里,要基于大数据平台做展示,会需要用到ElasticSearch和Hbase。Hbase提供快速『ms级别』的行查找。 ElasticSearch可以实现列索引,提供快速列查找。

 

平台搭建主要问题:
1、稳定性 Stability
 理论上来说,稳定性是分布式系统最大的优势,因为它可以通过多台机器做数据及程序运行备份以确保系统稳定。但也由于大数据平台部署于多台机器上,配置不合适,也可能成为最大的问题。 曾经遇到的一个问题是Hbase经常挂掉,主要原因是采购的硬盘质量较差。硬盘损坏有时会到导致Hbase同步出现问题,因而导致Hbase服务停止。由于硬盘质量较差,隔三差五会出现服务停止现象,耗费大量时间。结论:大数据平台相对于超算确实廉价,但是配置还是必须高于家用电脑的。

2、可扩展性 Scalability
 如何快速扩展已有大数据平台,在其基础上扩充新的机器是云计算等领域应用的关键问题。在实际2B的应用中,有时需要增减机器来满足新的需求。如何在保留原有功能的情况下,快速扩充平台是实际应用中的常见问题。

上述是自己项目实践的总结。整个平台搭建过程耗时耗力,非一两个人可以完成。一个小团队要真正做到这些也需要耗费很长时间。

目前国内和国际上已有多家公司提供大数据平台搭建服务,国外有名的公司有ClouderaHortonworksMapR等,国内也有华为明略数据星环等。另外有些公司如明略数据等还提供一体化的解决方案,寻求这些公司合作对 于入门级的大数据企业或没有大数据分析能力的企业来说是最好的解决途径。

对于一些本身体量较小或者目前数据量积累较少的公司,个人认为没有必要搭建这一套系统,暂时先租用AWS阿里云就够了。对于数据量大,但数据分析需求较简单的公司,可以直接买TableauSplunkHP Vertica,或者IBM DB2等软件或服务即可。


对于一个大数据平台主要分为三部分:

  • 数据接入

  • 数据处理

  • 数据分析

  •  

数据接入是将数据写入数据仓储中,也就是数据整合。因为在企业中,数据可能分布在外部和内部,分布在外部的是企业使用第三方系统产生的数据和一些公共数据,分布在企业内部的是企业内部IT系统产生的数据。这些数据一般都是独立分布的,也就是所说的数据孤岛,此时的这些数据是没有什么意义的,因此数据接入就是将这些内外部的数据整合到一起,将这些数据综合起来进行分析。


数据处理是对接入的数据进行数据清洗和ETL建模,将各个数据表之间的关系建立起来,比如关联,聚合,追加等等这些处理。


数据分析是在数据处理后的数据基础上进行维度和数值的可视化分析,也就是基于OLAP的查询和分析,包含上卷,钻取,切片,转轴等操作,最后分析的结果通过报表或是仪表盘来呈现出来,从而支撑业务人员和决策人员。


按照数据处理的顺序可以将大数据平台分为传统型和敏捷型,传统型的是在将数据送入数据仓储里面之前做,存入数据仓储里面的数据已经定义好了事实维度这些模型关系,业务人员可以直接进行查询,但是实时性和灵活性会大打折扣,如果业务人员需要分析一个事先没有的数据的话,需要去跟技术人员反馈,技术人员来完成处理。而敏捷型的则是将数据处理放到了后面,这样业务人员可以根据自己的需要去自助探索式的建模和进行数据分析,但是对系统的性能要求较高。

上面只是从产品层面来进行了说明,下面从技术层面来进行对应。


首先是数据仓储,一般是基于HDFS,采用分布式的文件系统来进行存储。数据处理和数据分析需要基于大数据处理引擎,如果想要实时的查询则需要用Spark这类的基于内存计算的,如果实时性要求没那么高的则可以用基于MR的这些离线计算的引擎。数据分析需要OLAP以及前端可视化这些技术来进行支撑。

知道了是什么样的,接下来我们可以来做了。

通过上面的介绍,我们可以看出需要的技术成本是比较高的,因此对于初创型的公司建议采用第三方的工具来使用。比如国内的BDP()和永洪(),国外的DOMO()这些SaaS产品,更小型的团队可以使用BDP个人版()。这些数据产品都是可以满足企业分析数据的需要,同时有上面所说的各类功能。由于BDP个人版是免费的,这里通过一些截图来说明一下。

数据接入- 支持各类第三方API以及数据库

数据处理-可视化拖拽和SQL


数据可视化-丰富的图表和交互


如果公司有足够的实力,想自建数据平台,可以在现有的一些开源的数据相关的工具来进行搭建,底层存储和计算平台的HDFS,Spark,Hive这些都是Apache开源的,OLAP有Kylin,Saiku这些开源工具,可视化有Airbnb开源的Superset,如果在这些基础上进行搭建和开发,相信能够省去一些开发量,但是事物除了有共性还是有个性的,想要绝对的满足需求是没有的,都是需要企业根据自身的需求来进行定制化开发的。



软件工程的流程来分析数据工程,也就是大数据平台的建设步骤。


软件工程建设步骤包括需求分析、系统设计、系统开发、系统运维等4大方面。本文主要讲一下前3个方面。

1、需求分析

数据需求分为三个层次,分别为业务需求、用户需求、功能需求。各需求要了解清楚大致内容:

  • 业务需求,老板想干啥?是想赚多点钱还是政绩工程?当然一般会是精准营销、个性化服务、提升效率等

  • 用户需求,真正使用这个平台的用户的需求是什么?要什么数据?分析啥?

  • 功能需求,基于业务需求和用户需求推导出大数据平台需要具备哪些功能

  • 数据需求:要接入哪些数据?指标体系是怎样?数据来源于哪些系统?数据量大概什么量级?日增量大概多少?数据接口是怎样的?

2、系统设计

基于需求分析的输出设计大数据平台,设计步骤主要包含4个子环节:

  • 技术选型,技术选型主要考虑3个输入:数据量、查询性能要求、实时性要求等,由此决定是采用传统数据仓库还是分布式架构,同时还需考虑资金和团队的因素,如果有钱可采用商用平台和服务,没钱但有技术团队,可采用开源方案,没钱又没团队可以洗洗睡了。

  • 技术架构设计,采集、存储、计算、交互式查询、机器学习等场景分别采用什么技术?同时各技术的集成性需要考虑。

  • 数据架构设计,数据主题、数据分层、数据流、数据交换方式等等

  • 数据应用设计,也就是上层数据应用的功能设计,这个和软件差不多,但基于数据的应用设计还是有很多不同的考虑,在此不做赘述。

3、系统开发

  • 平台部署:部署hadoop等大数据平台;

  • 数据集成及处理开发:开发ETL,从数据源采集数据,并做清洗、标准化形成主题库,并根据主题库的标准数据,根据上层数据应用需求,处理成相应的专题库(也叫数据集市);

  • 数据服务开发:开发并发布上层所需的数据服务接口,供上层数据应用调用;

  • 数据应用开发:基于数据服务、数据集,开发数据应用;

 


比较简单的步骤:
1. 首先要有一个分布式的文件系统,保证能够对“大”的数据进行存储,而且该文件系统应该具有容错和高吞吐量的特点,例如HDFS之类的。
2. 然后要有一个分布式的计算环境,如Hadoop、Spark之类的,能够快速开发程序对数据进行分析和加工。
3. 最后要有一个大数据的可视化工具,能够快速生成可视化界面。



我参与了一个大数据平台从无到有的过程,创建平台说起来很简单!但你需要考虑几个问题:
一、平台的定位:交易?解决方案?商城?
二、数据的来源:自有?第三方渠道?
三、人员的配备:技术驱动?销售驱动?运营驱动?
四、平台的规则:如何保证数据安全?如何给数据定价?如何保证数据质量?数据使用问题如何定则?数据的更新频率。及时。有效性。
五、快速变现:如何教育用户使用?如何让数据流通碰撞?



第一步,抓取数据
第二步,建立模型
第三步,读取数据。