岂止于大,一文读懂大数据及其在推荐系统的应用
从最简单的概念起始, 本系列文章会一步步讲解推荐系统的发展进程以及最新实践, 站在产品经理的角度, 阐述与推荐系统相关的算法、技术和架构。本章作为第三章, 会对推荐系统的基石之一大数据进行系统性介绍。数据智能时代的“铁公基”是大数据, 其属于一系列计算以及存储的基础设施, 推荐系统建构于大数据基础之上, 大量的数据挖掘与模型训练皆不能脱离大数据。大数据的这个叫法取得特别恰当, 要是面对的恰巧正好是非技术领域的人员, 那也绝对能够从中领会到其中大的意思, 即是数据的数量特别庞大, 并且具备极为强大的计算能力。可是, 这般强大无比的能力究竟是怎么产生的呢 , 针对此大数据生态体系在架构方面又是如何进行分工的呢?没具体做过的同学并不知道今天就接着从产品经理的角度, 深入且不失浅显地来讲这些问题, 实际上不一定非得是产品经理, 对大数据感兴趣的同学都能瞧瞧, 本文篇幅较长, 要是时间不够, 建议先标记下。01 大数据的诞生与分布式大数技术诞生以前, 数据存储与处理的大半部分是和MySql之类数据库软件相关的。这些传统数据库的文件系统是单机的, 这意味着, 数据仅能在一台机器上运行 , 它们在处理达到TB级甚至上PB级的数据时会极其吃力。谷歌是第一个解决了该问题的公司, 其将分布式作为解决这个问题的思路, 在2003年至2004年间, 谷歌分别发表了三篇具有重量级的论文, 这些论文奠定了大数据的基础。简单的说谷歌通过论文公布了以下三个工具如何创造用于文件存储的分布式系统: File, 具备分布式并行计算能力的框架: 用于数据存储的分布式系统:这便是大数据技术初始的形态了。自谷歌的这一源头起程迈出第一步, 历经较长时间的逐渐演变发展, 大数据最终造就而成当下这般完整的样子所处的状况了呐。可以用以下三个分类来去解构整个大数据生态分布式存储, 是将文件切割成多份, 而后分布着存储到多台机器之上。其常用的组件包含: HDFS、HBase等。分布式计算, 是把数据计算的任务切割成多个部分, 进而分配到多台机器上去计算。其常用的组件有: Spark、Storm、Flink等。分布式工具, 涵盖数据辅助类工具以及资源调度管理工具等。常见的组件有: YARN、Hive、Flume、Sqoop等。大数据的整个生态体系极为庞大, 与之相关的产品多得数不过来, 让人看得眼睛都花了, 有种类似物种大爆发时的那种感觉。然而它也并非完全毫无头绪可找。我们要去理解大数据生态, 从这三个方面着手去理解便会轻松不少。本文也是依照这个方式严格地进行讲述的。02 本文讲述需要用的数据表因大数据生态极为庞大复杂, 为让文章更浅显易懂, 本文不对技术概念作过多阐述, 而是直接进入操作层面, 以图示形式讲解。因讲述的是数据系统, 我在此建一张数据表 USER, 通过用这张数据表在各个系统中的处理过程, 给大家讲述大数据各个组件的工作原理及机制。03在整个互联网技术生态圈里头, 谷歌属于超级绩优生。每当发表论文时, 都会致使诸多相关人员前来“抄作业”。Doug也就是其之父, 和他所带领的团队乃是众多抄作业者当中的一个。他耗费业余中的两年时间, 依据谷歌的论文去实现了一项针对分布情况进行数据处理的系统, 进而用自己儿子的那个大象材质毛绒制成的玩具体的名字, 把这个系统予以定名。而它的Logo也是呈现着大象的模样。之后到了二零零六年, 被引入基金会, 变为一个开源的顶级项目。伴随它的持续发展, 在此项目里 , 出现了HBase, Hive, Pig等子项目, 并先后被基金会把它们独立升级成了顶级项目。与此同时, 基金会持续不断地兼收并揽着其他诸多大数据项目, 基本上将绝大部分在大数据范围内称得上优秀的项目都纳入了自己的旗下, 给人一种仿佛天下所有的武功秘籍都出自少林那般的感觉。在大数据领域各种各样的不同开源组件这个整体范畴之中, 它所旗下归属的那些才是如同少林正宗一般被视作正统的存在。闲话不多说我们来讲。现在的主要分三个部分高可靠HDFS( File ) 所充当的分布式存储, 是一个能实现海量数据存储的高吞吐量分布式文件系统。可实现海量计算的是一个分布式离线并行计算框架, 它属于分布式计算范围。作为一个实现硬件资源调配的框架, YARN是用以集群资源调度管理的分布式工具。04 以图解形式呈现分布式。这里先具象的解释下什么是大数据的分布式长什么样当我们进行安装一事的时候, 需要将同一个软件安装予以包, 安装于三台以上不同的机器之上。在安装完成之后, 咱们便能够获取到一个分布式集群呢。像是下面所呈现的这样, 把三个组件, 于集群的每一台机器之上进行安装, 这个集群存在七台机器, 每一台机器被称作一个节点, 在这七个节点里, 要挑选出一个来充当老大, 我们若有什么事情, 会先去找这个老大, 这便是主节点, 由于主节点十分关键, 要是它出现故障, 整个集群都将无法正常运行, 故而通常会配置两台主节点, 其中一台作为备份, 其余五个节点被叫做从节点, 在相关情境中, 主节点被命名为某特定名称, 从节点则为Slave。05 分布式文件系统HDFS将下面所讲到的首个组件, 也就是HDFS。HDFS身为分布式的一种文件系统, 它是以文本这种方式去保存数据的, 换句话讲, 数据通常会如同我们的TXT文件那般呈现。一个文件会依据设定, 被切割成不一样的数据块, 接着每个数据块会被复制成多份, 随后通过分布式的形式存储到不同的节点当中。HDFS把集群节点划分成两种类型: 和。顺着USER数据表来说, 举个例子讲讲HDFS的运作过程。在实际的系统里面, 鉴于负荷偏重, 会安排一项起到协助作用而非备份作用的工作。上图中HDFS先是将深蓝色的文本数据进行切分, 切分成了三份, 每份数据依照系统设定, 像是64MB或是128MB作为一块, 接着把三份数据块复制成三份, 进而就有了九份数据, 随后把上一步所得到的九份数据划分到不同之处, 并且建好目录, 最后按照储存分配, 将各个数据块予以保存。具有数据容量大这一优点的HDFS, 是大数据之中最为主要的数据存储方式, 众多其他组件皆建立于HDFS的基础之上, 其应用极为广泛。HDFS 存在缺点, 它属于文件系统, 并非数据库系统, 无法像关系数据库系统那般借助建立索引之类的工具来提高处理速度以及定位到数据所在位置, 鉴于其数据记录以一行一行的字符串形式呈现, 所以无法定位, 并且不支持对数据进行直接修改。06 分布式离线计算引擎它是专门负责分布式计算的, 它呢, 是一个组合词, 这个组合词可以进行划分, 能分成两个部分, 一部分是Map, 另一部分是。简而言之, Map所做的便是将需计算的数据拆分为多个计算任务, 然而是对Map过程斩获的结果予以汇总处理。假定当下我们计划计算在USER表当中, 男性与女性各自的人数分别是多少。计算详细过程如下上图中阶段, 会去划分数据成三块, 通常是基于在HDFS存储时切分的基础之上再进行切分, 接着为每一个切分出来的数据块创建一个任务, 逐一条一条地去计算每条数据对应的结果, 之后把结果存储在磁盘里, 也就是要对阶段产生的结果做分拣, 任务必须等全部完成之后才能够开展, 就是把分拣好的数据, 实施汇总。通过这种方式获得了强大的运算能力。优点在于, 其具备强大的计算能力, 运算所耗费的成本较为低廉, 并且在运算能力处于一般水平的机器之上它也能够运行。缺点是, 它诞生的那个年代, 内存那时还很贵, 在进行计算的进程中, 那些中间结果得持续存入磁盘里, 目的是减轻内存的压力, 然而如此一来就致使运算速度相对较慢。另外还有, 代码并非简洁, 学习曲线比较陡峭, 后续在HIVE部分将要讲述。07 资源管理调度系统YARNYARN的全称是Yet直译就是另一种资源协调者。看名字便晓得, 他属于其中一种资源调度器 , 其最为关键的组件是 , 借由该组件 , YARN能够为我们的任务开展资源分配 , 所分配的资源是一个个计算容器 , 每个计算任务于这个容器里运行 , 因出色 , 后来YARN进一步得以广泛发扬 , 成为了诸多大数据组件之外的资源调度框架。08 数据分析和数据仓库工具HIVE有着的当中, 加以处理数据作业的程序是得经由JAVA去达成的, 然而JAVA在进行书写程序进程之际并不简单明快, 比如说我们先前谈到过在统计某张数据表里面男丁与女人人数该项特别普通操作的时候是必不可少严格遵循诸如, 自Input开启以至此这样步骤严格遵循且要达到五步来促成的一项操作, 编写代码通常状况下长度达到上百行之谱。然而, 去统计这般数据的结果, 针对于SQL来讲, 那可是仅仅一句话就能搞定的事儿啦: 以sex作为分组依据, 从USER表当中来统计COUNT(1) , 就是这样的。这般来言, 为了达成不再撰写长度冗长亦颇繁琐的 JAVA 之目标后, Hive 便顺势而诞生了。而 Hive 这个组件主要所负责去做的之事就在于, 把 SQL 相关代码进行转译成为另外一种形式, 之后再放置到由 YARN 构建而成的容器当中, 进而运行产生出相应的结果来。如此一来, 当我们需要去进行对USER表之中的男性以及女性人数予以统计之际, 便无需通过编写JAVA来达成实现, 进而能够实现调动了, 在此之处, 我们借助画图的方式来对此予以说明:除此以外, Hive除了具备转译SQL这个功能之外, 它还能够被用于构建数据库以及数据表。它所拥有的能力是与数据库具备的能力一样的, 并且还能够对大量的数据予以处理, 因而通常人们还会把Hive运用构建数据仓库。对于数据仓库而言, 其主要的功能是把历史数据全部存入其中, 能够反复地进行统计计算以供使用。数据仓库最为主要的特征则是其数据数量极其庞大。由于它构建于一定基础之上, Hive具备可计算的容量庞大的特点, 其运算能力较为强大, 然而速度并不快, Hive也无法直接对数据进行修改, 针对Hive开展数据的修改操作会耗费相当长的时间。最后介绍一下Hive和MySql的区别09 离线计算和流式计算DAG计算引擎SPARKSpark属于分布式计算引擎, 是大数据生态体系里速度快且功能强大的组件, Spark整个框架极为庞大, 具备极为丰富的离线计算以及流式计算能力。本小节先介绍Spark的离线计算功能。因摩尔定律作用下硬件基础设施得以升级, 内存愈发便宜, 不同于主要将中间结果持续写入磁盘, Spark主要把数据置于内存中进行计算, 如此Spark在速度方面便得了上千倍数目的提升。内存不足之际, Spark会需要把中间结果存储至磁盘。然而在此情形下, Spark在速度方面相较于也有着上百倍的提高。源于Spark给出了 RDD以及这样的数据表工具, 还为这些数据表筹备了一系列效率高计算的算子, 切实提升了速度。多个算子叠加便成了一个DAG(Graph), 故而Spark也被称作DAG计算引擎。下面介绍Spark的计算流程。鉴于RDD皆是类乎关系数据库的数据表, 其流程机制大体无异, 于此选用作解释。当Spark针对USER表的数据予以处理之际, 会经历如下过程:上图中数据取读, 得从文本、HDFS、HIVE、JSON等好些格式里取读。将取读的数据表转变为Spark的内置格式, 且在上图里被命名为。有了它便能直接对其开展算子操作。上图里所用到的和count都是算子。算子的功用就是施行某类核算的操作。算子运算, 是分组的算子。它达成了依照男女把数据予以分组, 获得一个分组后的新的, 在上图里命名为。每回算子运算过后, 都会得到一个新的。对于count算子的运算, 是要在上一步所得到的结果里面, 再度去开展个数方面的计算, 进而获取到最后的结果。多个算子相互混合起来了之后, 便形成了一个DAG, 在这个DAG上面所进行的操作, 会造就以下的DAG。Spark先是通过构建DAG, 而后再下发给从节点来进行计算呢。与此同时, 这个计算进程亦是如此这般, 把计算任务划分成 Map 以及别外两个阶段模样, 在多台机器当中以分布式的形式来进行计算此处便不再予以详述了。10 离线计算和流式计算Spark是离线计算的代表之一, 离线计算意味着在计算之前就已具备所有需计算的数据, 而且每次计算都是所有数据都参与其中的运算, 由于每次都是整批数据进行计算, 故而离线计算通常又被称作批量计算, 然而在日常事务里, 存在诸多场景是需要持续实时更新数据的。倘若我们的USER表, 当下鉴于有一名新用户注册进来了, 从而多增加了一条与之对应的关于用户的具体数据“蔡九, 女, 27”。离线计算的行为就要将这新增从而出现的新数据加以汇总, 之后再开展针对诸多既有数据的计算操作:增加一条用户日志, 就得对全部的予以计算, 在数据量极为庞大之际, 这压根就是不可能做到的事。所以我们还需另外的一种计算方式, 也就是流式计算。流式计算鉴于其实时性, 又常常被称作在线计算以及实时计算。这里是流式计算的进程, 相同的新添数据, 流失计算之时只需针对新添数据加以计算, 其后汇总予以更新。有流式计算引擎, 分别是SPARK , Storm以及Flink , 它们都能够提供流式计算的服务, 然而存在着些不同之处。11 分布式结构化存储系统HBASE往前提及了谷歌所发表的、以大数据作为主题的三篇论文, 于这里额外补充一下, 它们在后续, 发展变化而产生的最终成果:File相关演变成的分布式文件系统是HDFS, , 演变成什么的分布式并行计算框架, , 存在演变成另外一个大名鼎鼎就是HBase的分布式数据库。这就是HBase的诞生。一个名为HBase的存在, 属于NoSql数据库范畴。其于整个大数据生态里的定位, 乃是针对数据开展实时的操作行为, 涵盖查询、更新、删除以及插入等各项操作。先前提及的HIVE, 具备处理大量数据的能力, 然而速度较为缓慢, 并且无法对数据实施修改操作。而诸如MySql这类传统数据库, 响应速度快, 可运算能力却有所欠缺。HBase的问世, 目的便在于解决这些方面所存在的问题。并不支持SQL语句的数据库, 这便是NoSql数据库的意思, HBase具备下面这些特征:通过一种便捷的方式来促使理解, 我们采取直接绘图去查看HBase的工作情形, 当我们让那属于我们的USER数据表放置到HBase里之后, 它呈现出这样的形态, 是如此这般模样的:其中在MySql里头, 要是有修改数据的情况发生, 那旧数据就会被覆盖掉。然而于HBase当中, 同一个键值对是能够留存多个数据版本的。这个版本会是以时间戳的样式去进行标记。就好比张三这个人, 有一天他改名为张三丰了, 这种状况下, 它可不是把原有的张三给覆盖了事, 而是会把这两个版本都保存下来。如下如所示HBase具备强大的读取能力, HBase具备强大的增删改查能力, HBase能够保存不同时间的数据版本, 在推荐系统里, 用户画像的结果数据是保存在HBase中的, 离线召回的数据是保存在HBase中的, 近线召回等数据是保存在HBase中的。此外, HBase能够做到快速响应, 推荐系统中需要快速读取的数据都能够存在HBase中。12 数据采集大数据得以诞生, 并非是要将传统的关系型数据库给取代掉, 而是会转变成一种补充, 传统数据库存不了的数据, 由大数据来进行存储, 传统数据库算不了的数据, 由大数据来进行计算, 大数据系统仅仅是把现有系统的数据采集到大数据里, 去做存储以及计算, 对于已有的业务流程和系统架构并不会产生什么影响。要把数据收集到大数据里, 通常会运用到两个工具, 哎, 这俩工具分别是Sqoop工具以及Flume工具。实际上, 不同的公司在使用数据采集工具这件事儿上不尽相同, 这块儿仅仅是做个简单的讲述罢了。有一种我们极其常见的数据, 叫做关系型数据, Sqoop是一座架设在关系型数据库与大数据之间, 用于数据流动的桥梁它能够被用以把MySql的数据导入至HDFS与HBASE之中, 或者将大数据里的数据导入到MySql。还有一种平常会出现的数据, 是源自日志系统的数据, 于生产环境里, 我们的搜索服务, 推荐服务, 广告服务始终无时无刻不在生出许许多多的流式日志, 这些日志数据样式不同, 形态纷杂, 它们俱是非结构数据。这些数据大体是以文本这一方式存于各个业务系统里, 对于推荐系统来说。最重要的用户埋点行为数据是存在日志当中的。而针对这些非关系型数据, 当我们要采集到大数据阶段时。就需要用到Flume了。Flume能够采集批量数据, 也能够采集流数据。这两个工具知道作用即可不用深究太多。13 分布式消息队列KAFKA使用Sqoop或者Flume进行数据采集之际, 存在着这么一种情况, 那便是一对一的直采专线服务模式。我们将生产数据的系统称作生产者, 把消费数据的系统称为消费者。伴随系统的持续发展, 通常生产者与消费者的数量都会不断增多, 一旦全部采用一对一直采方式, 连接数便会呈指数形式上升, 并且维护起来颇具难度。一旦生产者的数据未能及时被消费者接收, 或者出现丢包现象, 数据便会遗失。为了解决这些问题Kafka被创造了出来。经过Kafka, 生产者仅需将数据进行打包, 对Topic做好标记, 而后扔至Kafka的消息队列之上便可。至于消费者呢, 所要做的事儿就是去订阅该生产者的Topic。一旦有新的数据抵达时, Kafka便会通知消费者去取了。数据会被暂且留存在Kafka的硬盘里一阵子通常是7天, 消费者能随时前来拿取。被保存下的那一系列数据块, 是一个个依据时间排列的消息队列。同样地, Kafka是分布式的, 它会被安设在多个节点内, 数据也会被存于多个节点中。14 架构可以看到这里, 已然是极为不容易的了, 先前业已把本文所要介绍的大数据组件讲授完毕了。大数据规模极其庞大, 并且各自履行职责, 分工细致入微。数目众多的大数据框架存在, 如离线计算、流式计算, 还有各异的分布式存储、不同的分布式工具, 那么, 这般众多框架如何构建成为一个涵盖全方位大数据的、综合性且复杂的系统呢?这就要介绍大数据的架构。架构是大数据系统里极为关键、有着重大影响力的架构, 数据通道被划分成两条不同的分支, 一条是实时流, 另一条是离线。按照流式架构的实时流保障了它的实时性, 而主要以批处理方式的离线, 保障了最终一致性, 适用于存在实时需求同时又存在离线需求的情况。抽象掉所有的框架可以把架构简化成如下方式推荐系统可是个在存储以及算力消耗方面堪称大户的存在, 它有着这样的需求, 其一, 要进行离线计算, 针对那些对时间不敏感的数据展开大批量的计算, 其二, 还得进行实时流式计算, 为的是对用户画像, 还有物品画像数据予以实时更新。把本章之中所提及的大数据的各种框架组件, 依照架构的形式进行组建之后, 我们能够获得下图。就实际情形而言, 比起上图来讲还要更加复杂一部分 , 然而针对本文来说呢 , 借助机器学习的术语来讲 , 要是再复杂下去那就会出现“过拟合 ”了 , 适量的这种情况能够预防过拟合。舍弃掉一些 , 或许会是更佳的。总结由分布式存储、分布式计算以及辅助性组件构成的一个庞大的数据技术生态体系, 被汇总成一句话: 大数据。它存在几个关键知识点:得去明白, 关于分布式存储的那种机制, 鉴于数据量庞大, 数据存储的最终承载者是最为简单的文本数据, 不存在诸多繁杂花哨的事物, 这些文本数据被划分成多个数据块, 呈分布式地存于不同的数据节点里头, 得去理解分布式计算当中的机制, 要领会HIVE的工作机制, 要弄清楚啥是离线计算, 啥是流式计算, 最终要是可以的话, 记住架构。写在最后的话太多了大数据的知识点, 因篇幅受到限制, 这次只是有选择性地去介绍, 推荐系统所需要用到的, 大数据开源类装置。这个生态体系仍在持续地发展着, 我同样也还处于行进途中。存在不足之处, 还需乞请各路高手, 不吝给出教导。