第十二周 学习总结
1.大数据原理概述
1.1 大数据技术发展史
今天我们常说的大数据技术,其实起源于 Google 在 2004 年前后发表的三篇论文,也就是我们经常听到的大数据“三驾马车”,分别是分布式文件系统 GFS、大数据分布式计算框架 MapReduce 和 NoSQL 数据库系统 BigTable。
搜索引擎主要就做两件事情,一个是网页抓取,一个是索引构建和排序,而在这个过程中,有大量的数据需要存储和计算。这“三驾马车”其实就是用来解决这个问题的,也就是,一个文件系统、一个计算框架、一个数据库系统。
浏览下 Hadoop 的代码,这个纯用 Java 编写的软件其实并没有什么高深的技术难点,使用的也都是一些最基础的编程技巧,也没有什么出奇之处,但是它却给社会带来巨大的影响,甚至带动一场深刻的科技革命,推动了人工智能的发展与进步。
Lucene 开源项目的创始人 Doug Cutting 当时正在开发开源搜索引擎 Nutch,阅读了 Google 的论文后,根据论文原理初步实现了类似 GFS 和 MapReduce 的功能。
2006 年,Doug Cutting 将这些大数据相关的功能从 Nutch 中分离了出来,然后启动了一个独立的项目专门开发维护大数据技术,这就是后来赫赫有名的 Hadoop,主要包括 Hadoop 分布式文件系统 HDFS 和大数据计算引擎 MapReduce。Hadoop 发布之后,Yahoo 首先用了起来。大概又过了一年到了 2007 年,百度和阿里巴巴也开始使用 Hadoop 进行大数据存储与计算。
2008 年,Hadoop 正式成为 Apache 的顶级项目,后来 Doug Cutting 本人也成为了 Apache 基金会的主席。自此,Hadoop 作为软件开发领域的一颗明星冉冉升起。同年,专门运营 Hadoop 的商业公司 Cloudera 成立,Hadoop 得到进一步的商业支持。这个时候,Yahoo 的一些人觉得用 MapReduce 进行大数据编程太麻烦了,于是便开发了 Pig。
Pig 是一种脚本语言,使用类 SQL 的语法,开发者可以用 Pig 脚本描述要对大数据集上进行的操作,Pig 经过编译后会生成 MapReduce 程序,然后在 Hadoop 上运行。编写 Pig 脚本虽然比直接 MapReduce 编程容易,但是依然需要学习新的脚本语法。于是 Facebook 又发布了 Hive。
Hive 支持使用 SQL 语法来进行大数据计算,比如说你可以写个 Select 语句进行数据查询,然后 Hive 会把 SQL 语句转化成 MapReduce 的计算程序。这样,熟悉数据库的数据分析师和工程师便可以无门槛地使用大数据进行数据分析和处理了。
Hive 出现后极大程度地降低了 Hadoop 的使用难度,迅速得到开发者和企业的追捧。据说,2011 年的时候,Facebook 大数据平台上运行的作业 90% 都来源于 Hive。
在 Hadoop 早期,MapReduce 既是一个执行引擎,又是一个资源调度框架,服务器集群的资源调度管理由 MapReduce 自己完成。但是这样不利于资源复用,也使得 MapReduce 非常臃肿。于是一个新项目启动了,将 MapReduce 执行引擎和资源调度分离开来,这就是 Yarn。2012 年,Yarn 成为一个独立的项目开始运营,随后被各类大数据产品支持,成为大数据平台上最主流的资源调度系统。
同样是在 2012 年,UC 伯克利 AMP 实验室(Algorithms、Machine 和 People 的缩写)开发的 Spark 开始崭露头角。当时 AMP 实验室的马铁博士发现使用 MapReduce 进行机器学习计算的时候性能非常差,因为机器学习算法通常需要进行很多次的迭代计算,而 MapReduce 每执行一次 Map 和 Reduce 计算都需要重新启动一次作业,带来大量的无谓消耗。还有一点就是 MapReduce 主要使用磁盘作为存储介质,而 2012 年的时候,内存已经突破容量和成本限制,成为数据运行过程中主要的存储介质。Spark 一经推出,立即受到业界的追捧,并逐步替代 MapReduce 在企业应用中的地位。
一般说来,像 MapReduce、Spark 这类计算框架处理的业务场景都被称作批处理计算,因为它们通常针对以“天”为单位产生的数据进行一次计算,然后得到需要的结果,这中间计算需要花费的时间大概是几十分钟甚至更长的时间。因为计算的数据是非在线得到的实时数据,而是历史数据,所以这类计算也被称为大数据离线计算。
而在大数据领域,还有另外一类应用场景,它们需要对实时产生的大量数据进行即时计算,比如对于遍布城市的监控摄像头进行人脸识别和嫌犯追踪。这类计算称为大数据流计算,相应地,有 Storm、Flink、Spark Streaming 等流计算框架来满足此类大数据应用的场景。流式计算要处理的数据是实时在线产生的数据,所以这类计算也被称为大数据实时计算。
NoSQL 系统处理的主要也是大规模海量数据的存储与访问,所以也被归为大数据技术。NoSQL 曾经在 2011 年左右非常火爆,涌现出 HBase、Cassandra 等许多优秀的产品,其中 HBase 是从 Hadoop 中分离出来的、基于 HDFS 的 NoSQL 系统。
1.2 大数据应用发展史
1.2.1 大数据应用的搜索引擎时代
作为全球最大的搜索引擎公司,Google 也是我们公认的大数据鼻祖,它存储着全世界几乎所有可访问的网页,数目可能超过万亿规模,全部存储起来大约需要数万块磁盘。为了将这些文件存储起来,Google 开发了 GFS(Google 文件系统),将数千台服务器上的数万块磁盘统一管理起来,然后当作一个文件系统,统一存储所有这些网页文件。
Google 得到这些网页文件是要构建搜索引擎,需要对所有文件中的单词进行词频统计,然后根据 PageRank 算法计算网页排名。这中间,Google 需要对这数万块磁盘上的文件进行计算处理,,也正是基于这些需求,Google 又开发了 MapReduce 大数据计算框架。
1.2.2 大数据应用的数据仓库时代
曾经人们在进行数据分析与统计时,仅仅局限于数据库,在数据库的计算环境中对数据库中的数据表进行统计分析。并且受数据量和计算能力的限制,只能对最重要的数据进行统计和分析。这里所谓最重要的数据,通常指的都是给老板看的数据和财务相关的数据。
而 Hive 可以在 Hadoop 上进行 SQL 操作,实现数据统计与分析。也就是说,可以用更低廉的价格获得比以往多得多的数据存储与计算能力。可以把运行日志、应用采集数据、数据库数据放到一起进行计算分析,获得以前无法得到的数据结果,企业的数据仓库也随之呈指数级膨胀。
不仅是老板,公司中每个普通员工比如产品经理、运营人员、工程师,只要有数据访问权限,都可以提出分析需求,从大数据仓库中获得自己想要了解的数据分析结果。
1.2.3 大数据应用的数据挖掘时代
很早以前商家就通过数据发现,买尿不湿的人通常也会买啤酒,于是精明的商家就把这两样商品放在一起,以促进销售。除了商品和商品有关系,还可以利用人和人之间的关系推荐商品。如果两个人购买的商品有很多都是类似甚至相同的,不管这两个人天南海北相隔多远,他们一定有某种关系,比如可能有差不多的教育背景、经济收入、兴趣爱好。根据这种关系,可以进行关联推荐,让他们看到自己感兴趣的商品。
大数据还可以将每个人身上的不同特性挖掘出来,打上各种各样的标签:90 后、生活在一线城市、月收入 1~2 万、宅……这些标签组成了用户画像,并且只要这样的标签足够多,就可以完整描绘出一个人。除了商品销售,数据挖掘还可以用于人际关系挖掘。
1.2.4 大数据应用的机器学习时代
人们很早就发现,数据中蕴藏着规律,这个规律是所有数据都遵循的,过去发生的事情遵循这个规律,将来要发生的事情也遵循这个规律。一旦找到了这个规律,对于正在发生的事情,就可以按照这个规律进行测。
在过去,受数据采集、存储、计算能力的限制,只能通过抽样的方式获取小部分数据,无法得到完整的、全局的、细节的规律。而现在有了大数据,可以把全部的历史数据都收集起来,统计其规律,进而预测正在发生的事情。
1.3 大数据应用领域
医学影像智能识别
病历大数据智能诊疗
AI 外语老师
智能解题
舆情监控与分析
大数据风控
新零售
无人驾驶
2.分布式文件系统 HDFS
2.1 文件系统的基本概述
文件系统定义:文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易。
文件名:在文件系统中,文件名是用于定位存储位置。
元数据(Metadata):保存文件属性的数据,如文件名,文件长度,文件所属用户组,文件存储位置等。
数据块(Block):存储文件的最小单元。对存储介质划分了固定的区域,使用时按这些区域分配使用。
2.2HDFS 的概述
HDFS(Hadoop Distributed File System)基于 Google 发布的 GFS 论文设计开发。
HDFS 是 Hadoop 技术框架中的分布式文件系统,对部署在多台独立物理机器上的文件进行管理。
可用于多种场景,如: 网站用户行为数据存储。 生态系统数据存储。 气象数据存储。
2.3HDFS 的优点和缺点
其除具备其它分布式文件系统相同特性外,还有自己特有的特性:
高容错性:认为硬件总是不可靠的。
高吞吐量:为大量数据访问的应用提供高吞吐量支持。
大文件存储:支持存储 TB-PB 级别的数据。
2.4 不适用场景
低时间延迟数据访问的应用,例如几十毫秒范围。
原因:HDFS 是为高数据吞吐量应用优化的,这样就会造成以高时间延迟为代价。
大量小文件 。
原因:NameNode 启动时,将文件系统的元数据加载到内存,因此文件系统所能存储的文件总数受限于 NameNode 内存容量。,那么需要的内存空间将是非常大的。
多用户写入,任意修改文件。
原因:现在 HDFS 文件只有一个 writer,而且写操作总是写在文件的末尾。
2.4HDFS 的架构
HDFS 架构包含三个部分:NameNode,DataNode,Client。
NameNode:NameNode 用于存储、生成文件系统的元数据。运行一个实例。
DataNode:DataNode 用于存储实际的数据,将自己管理的数据块上报给 NameNode ,运行多个实例。
Client:支持业务访问 HDFS,从 NameNode ,DataNode 获取数据返回给业务。多个实例,和业务一起运行。
3.大数据计算框架 MapReduce
3.1. MapReduce 模型简介
MapReduce 同样是谷歌公司的 MapReduce 的开源实现,其要比谷歌的 MapReduce 的使用门槛低很多。MapReduce 将复杂的、运行于大规模集群上的并行计算过程高度地抽象到两个函数:Map 和 Reduce 函数。
主要思想:“分而治之”+计算向数据靠拢。一个存储在分布式文件系统中的大规模数据集,在处理之前将会被切分成为许多独立的小数据块,这小小的数据块会被多个 Map 任务并行处理。MapReduce 框架会为每个 Map 任务输入一个数据集,Map 任务的结果会继续作为 Reduce 任务的输入,最终由 Reduce 任务输出最后的结果,并写入分布式文件系统。前提条件:待处理的数据可以分解成为许多的小的数据集,而且每个小的数据集可以并行的进行处理。
计算向数据靠拢:在一个集群中,只要有可能,MapReduce 框架就会将 Map 程序就近地在 HDFS 数据所在的数据节点运行,即将计算节点和存储节点在一起运行。
3.2. Map 和 Reduce 函数
二者是 Hadoop 模型的核心,二者是由程序员开发者负责具体实现的。程序员只需要关注这两个函数如何编写,而不需要处理并行编程中的其他各种复杂的问题,如分布式存储、工作调度等都会由 MapReduce 框架进行处理。
3.2.1 Map 函数
输入来源于分布式文件系统的文件块,这些文件块的格式是任意的,可以是文档,也可以是二进制格式的。文件块是一系列元素的集合,这些元素的类型也是任意的。Map 函数将输入的元素转换为 <key,value>形式的键值对,键和值的类型也是任意的,但其中的键值不作为标志性属性,没有唯一性,不同的键值对的 key 值可以相同,一个 Map 函数可以生成多个具有相同 key 值的<key,value>对。
3.2.2 Reduce 函数
其输入为 Map 函数的结果,<key,List(value)>对,这种类型的键值对所代表的意思是 List(value)是一批同属于同一个 key 值的 value。Reduce 函数将一些列具有相同的键值的键值对以某种方式组合起来,输出处理后的键值对,输出的结果为一个文件。用户可以指定 Reduce 函数的个数。
4.大数据集群资源管理系统 Yarn
Yarn 的工作流程(MapReduce 为例)
我们向 Yarn 提交应用程序,包括 MapReduce ApplicationMaster、我们的 MapReduce 程序,以及 MapReduce Application 启动命令。
ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一个容器,并将 MapReduce ApplicationMaster 分发到这个容器上面,并在容器里面启动 MapReduce ApplicationMaster。
MapReduce ApplicationMaster 启动后立即向 ResourceManager 进程注册,并为自己的应用程序申请容器资源。
MapReduce ApplicationMaster 申请到需要的容器后,立即和相应的 NodeManager 进程通信,将用户 MapReduce 程序分发到 NodeManager 进程所在服务器,并在容器中运行,运行的就是 Map 或者 Reduce 任务。
Map 或者 Reduce 任务在运行期和 MapReduce ApplicationMaster 通信,汇报自己的运行状态,如果运行结束,MapReduce ApplicationMaster 向 ResourceManager 进程注销并释放所有的容器资源。
5.大数据仓库 Hive
hive 是构建在 hdfs 上的一个数据仓库(Data Warehouse)
hive 是 sql 解析引擎,将 sql 语句转化为 MR Job,然后在 hadoop 平台上运行
hive 中的表是纯逻辑表,就只是表的定义,也就是表的元数据,本质上来说就是存储在 hdfs 上的目录/数据。数据和表的定义分离。
hive 本身不存储数据,他完全依赖于 HDFS 和 MapReduce。
hive 是读多少写多少的,不支持对数据的改写和删除。
hive 中没有专门的数据格式,这个有用户指定,一般需要三个属性:
—— 行分割符:“\n”
——列分割符:"\t"
——读取文件数据的方法
评论