本着温故知新、抛砖引玉的态度,接下来的时间里将对Hadoop及其相关组件发表一个学习总结性的系列文章。因本人非技术出身,所学均来源于网络,难免有不严谨甚至错误之处,恳请大家指正。
1 、Hadoop是什么?
1.1 、场景解释版(非严谨)
某家刚起步的电商公司A
张三接到一个任务:统计下某商品上线后的销售总额是多少?张三觉得这个需求简单呀,只需要写几句简单的SQL就可以完美的完成任务。
一年后,A公司有了一定的用户
为了能实现精细化运营,公司不仅仅记录了一些重要的结构化数据(如用户信息、订单信息、商品信息等),同时也通过埋点的形式对旗下的APP进行了用户行为(用户看了哪些商品、点击了哪些运营位等)的数据采集,并把采集来的数据文件存在指定的文件系统内。
张三接到了一个任务:统计上个月点击过“汇源肾宝”运营位,并且在当月购买的用户数。张三心想这个任务依旧很轻松,毕竟目前的用户行为数据文件也才2G左右,然后写了个计算程序去读取文件系统内的数据文件,整个计算过程大概只用了几分钟就完成了任务。
半年后,张三接到了另外一个任务,统计去年全年购买过“汇源肾宝”的用户所处年龄段。张三还是用上次的计算程序进行统计,但是前前后后大概用了1个小时才得出结论,但是也勉强的完成了任务。张三觉得这样效率太低,就向公司申请了更好的电脑,提升了运行效率,把此类的计算耗时保持在5分钟以内,就这样在接下来的一段时间内满足了公司内部的分析统计需求。
随着业务的发展,A公司已经初具规模
随着公司的用户、产品、交易额越来越多,采集来的用户行为数据也成指数级的暴增,张三的电脑也在一直更新迭代,虽说硬件已经达到最顶级了,但是经常耗时几小时才能满足一个业务的统计需求。直到有一天,数据来到了PB(1PB=1048576GB)级别,张三崩溃了,同时他也意识到原来的数据存储方式和计算方式已经不能满足当下的需求,于是他通过各种途径找寻解决之道。直到他看完一本名为《Hadoop--解决存储海量数据和分析海量数据实践》(虚构)一书后,他哭了,终于找到了解决方案——分布式计算(Hadoop是其中的一种)。他很懊悔,当初自己只知道通过提升电脑的硬件来提成运算效率,却没有想到把计算任务分成几个部分,然后利用多台电脑去执行不同的部分,最后再汇总的方法,这样就可以节约整体计算时间,大大提高计算效率。
1.2 、专业解释版(额,也不是真的专业)
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。(摘抄于百度百科)
Hadoop是由java语言编写的,在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架,其核心部件是HDFS(分布式文件系统)、MapReduce(一种计算模型,可以简单的理解为一种用于大数据的计算引擎)、Yarn(资源管理框架,用于整个hadoop集群资源与任务的调度,可以使MapReduce更稳定、更高效的运行)。
HDFS可以理解为一个分布式的,有冗余备份的,可以动态扩展的用来存储大规模数据的大硬盘。结合前面的场景故事,HDFS就是用于存放数据文件的系统,只不过它是把一个大的文件先分成若干个部分后,分别存储至不同的计算机上,后面会专门写一篇关于HDFS的详细讲解文章,此处就不再赘述了。
MapReduce理解成为一个计算引擎,按照MapReduce的规则编写Map计算/Reduce计算的程序,可以完成计算任务。
举一个与前面场景故事相关的简单例子,来初步了解什么是MapReduce。
张三曾接到统计去年全年购买过“汇源肾宝”的用户所处年龄段的任务。
假设当时他是这样做的:写了一个程序,先遍历去年的数据文件,然后找到在去年所有购买过“汇源肾宝”的用户,并且记录下他们的年龄,最后把符合各年龄段的用户数进行汇总统计,就可以得到各个年龄段的用户数的个数。但是这种方法比较耗时,毕竟就一个程序在执行这个任务。当然他也可以编写一个多线程程序,并发的去执行这个任务,这种方法肯定比前面提到的方法效率高,但是写一个多线程程序要困难的多,不仅需要同步共享数据,还要防止两个线程重复统计,这对于张三来说肯定是一个有难度、并且工作量大的任务。
但是在hadoop框架下,可以使用MapReduce来执行这个任务就容易的多,大致过程为:数据文件被分成若干部分存在HDFS上(分布在不同的计算机中),然后每一台计算机执行一个MapReduce去计算他保存的这部分数据,找出去年购买过“汇源肾宝”的用户,并且把他们的年龄记录下来。比如计算机A统计完他的数据后,20岁的用户数有20个、30岁的用户数有30个,计算机B统计完他的数据后,20岁的用户数有22个、30岁的用户数有30个、33岁的用户数有60个......,这个阶段可以简单的理解为map阶段。然后把所有的计算机统计的数据进行汇总就可以得到所有年龄的用户数分别是多少个,假设最后汇总结果为,20岁 :1000个、30岁 :700个、33岁 :1200个,那么这个阶段可以简单的理解为reduce阶段。在整个过程中张三只需要实现Map和Reduce这两个函数(即按照什么键值对去统计、汇总),不用去管数据文件如何切分、统计不重复、汇总不遗漏等等。所以这种分布式运算的方式肯定比原来的更快,而且由于底层的技术实现封装,又保证了分布式运算的准确性、便利性。同样后面会专门写一篇关于MapReduce的详细讲解文章,此处就不再赘述了。
Yarn是一种 Hadoop 资源管理器,提高集群环境下的资源利用率,这些资源包括内存,磁盘,网络,IO等。它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度。通过Yarn,不同计算框架(MapReduce、Spark、Tez、Storm)可以共享同一个HDFS集群上的数据,享受整体的资源调度。后面同样也会专门写一篇关于Yarn的文章,此处就不再赘述了。
2 、Hadoop架构
Hadoop由HDFS、YARN、MapReduce、HBase、Hive和ZooKeeper等成员组成,如下图所示:
各主要组件的简单介绍:
1)HDFS
一个提供高可用的获取应用数据的分布式文件系统,后续会详细讲解。
2)YARN
一种 Hadoop 资源管理器,提高集群环境下的资源利用率,后续会详细讲解。
3)MapReduce
一个并行处理大数据集的编程模型,后续会详细讲解。
4)HBase
一个可扩展的分布式数据库,支持大表的结构化数据存储。是一个建立在 HDFS 之上的,面向列的 NoSQL数据库,用于快速读/写大量数据,后续会详细讲解。
5)Hive
一个建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具;可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制,后续会详细讲解。
Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许不熟悉 MapReduce 的开发人员也能编写数据查询语句,然后这些语句被翻译为 Hadoop 上面的 MapReduce 任务。
6)Mahout
可扩展的机器学习和数据挖掘库。它提供的 MapReduce 包含很多实现方法,包括聚类算法、回归测试、统计建模。目前对此模块不了解,后续能力允许的情况下会做简要说明。
7)Pig
一个支持并行计算的高级的数据流语言和执行框架。它是 MapReduce 编程的复杂性的抽象。Pig 平台包括运行环境和用于分析 Hadoop 数据集的脚本语言(PigLatin)。其编译器将 PigLatin 翻译成 MapReduce 程序序列,目前对此模块不了解,后续能力允许的情况下会做简要说明
8)Zookeeper
—个应用于分布式应用的高性能的协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括配置维护、域名服务、分布式同步、组服务等,后续会详细讲解。
9)Ambari
一个基于 Web 的工具,用来供应、管理和监测 Hadoop 集群,包括支持 HDFS、MapReduceAHive、HCatalog、HBase、ZooKeeperAOozie、Pig 和 Sqoop ,目前对此模块不了解,后续能力允许的情况下会做简要说明。
Ambari 也提供了一个可视的仪表盘来查看集群的健康状态,并且能够使用户可视化地查看 MapReduce、Pig 和 Hive 应用来诊断其性能特征。
10)Sqoop
一个连接工具,用于在关系数据库、数据仓库和 Hadoop 之间转移数据。Sqoop 利用数据库技术描述架构,进行数据的导入/导出;利用 MapReduce 实现并行化运行和容错技术,后续会详细讲解。
11)Flume
提供了分布式、可靠、高效的服务,用于收集、汇总大数据,并将单台计算机的大量数据转移到 HDFS。它基于一个简单而灵活的架构,并提供了数据流的流。它利用简单的可扩展的数据模型,将企业中多台计算机上的数据转移到 Hadoop,后续会详细讲解。
传送门
Hadoop系列文章(二)数据产品经理有必要了解的HDFS
Hadoop系列文章(三)数据产品经理有必要了解的MapReduce
Hadoop系列文章(四)数据产品经理有必要了解的YARN