Hadoop相关基础知识
在暑期期间,在腾讯互娱部门实习的经历让我有机会接触到了许多相关知识。为了进一步学习和掌握这些技术,我抽空时间整理了一些资料,并撰写了一篇个人心得文章作为总结。由于我对这一领域的知识还不够深入,因此其中大部分内容参考了网络上的相关资源。
1. Hadoop项目框架

2. Hadoop
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在无需深入掌握分布式底层细节的情况下编写分布式程序。充分运用集群的力量进行高速运算和存储。
Hadoop运行了一个分布式文件存储系统(Hadoop Distributed File System),简称HDFS。该系统具有很高的容错能力,并被设计为能够在经济实惠的硬件架构上运行;同时支持处理海量数据应用所需的高吞吐量数据访问功能。
从核心设计角度来看,Hadoop架构主要由两个关键组件构成:即分布式文件存储系统(HDFS)和大规模数据处理引擎(MapReduce)。分布式文件存储系统(HDFS)实现了对海量数据的高效存储功能,并通过MapReduce这一强大的并行计算框架实现了对这些数据的处理能力。
3. HDFS
HDFS(即Hadoop分布式文件系统),它具备极强的容错能力,并运行于低成本设备上。该系统能够实现高效的海量数据读写能力,并特别适用于处理大规模数据集(large data set)的应用场景。
HDFS的设计特点是:
大数据文件特别适合存放T级别及以上的大文件或堆积成山的大数据文件的存储
2、数据按块划分,在Hadoop分布式文件系统(HDFS)中会将每个完整的大型数据文件均匀分割成多个小数据块,并分配到不同的计算节点上。其主要目的在于,在读取数据时能够同时从多个计算节点中获取不同的数据块。相较于仅由单一计算节点完成的数据读取操作而言,在这种分布式架构下运行的效率提升了显著程度。
流式数据访问采用了一次性批量 writes followed by repeated reads, 这种模式与传统 files differ significantly, as it prohibits dynamic modifications to the file content. Instead, it mandates that once data is written, the file must remain unchanged unless new data is appended at the end.
廉价硬件下,HDFS可以通过普通PC实现分布式文件存储功能,通过这种机制,一些公司只需配置几十台廉价计算机即可建立一个大数据集群
硬件故障现象存在时,HDFS系统认为可能存在多台计算机出现故障风险,为此,该系统会自动执行冗余机制,即通过复制文件数据到其他几个备用节点上,从而实现当其中一个主机会发生故障时无法访问本地存储的数据时,能够快速从其他副本中恢复数据
HDFS的关键元素:
Block:将一个文件进行分块,通常是64M。
Name节点负责存储整个文件系统中的目录信息、文件元数据以及分块数据。通常由单一专用主机来完成这一任务。若该专用主机发生故障或不可用,则会导致整个名节点失效。自Hadoop 2.x系列版本引入活性稳定模式后,在主节点出现故障时,默认会切换至备用节点继续执行任务。
DataNode:分布在廉价的计算机上,用于存储Block块文件。

4. MapReduce
GFS 和 BigTable 为我们提供了处理能力强劲且高并发的服务。
然而,并行编程并非所有程序员都能轻易掌握的高难度技能。
如果我们的应用无法实现 concurrent processing,
那么 GFS 和 BigTable 也无法发挥其应有的作用。
MapReduce 的核心价值在于它能够帮助那些不擅长 parallel programming 的开发者最大限度地释放 distributed computing 的潜力。
简要说明MapReduce是一种将大操作分解为多个较小操作框架(这些大操作与小操作本质上相同仅规模大小不同),在使用该框架时用户只需确定如何划分这些小操作并明确每个子操作的具体内容即可
例子:统计词频
如果我想了解近十年计算机论文中最活跃的研究领域变化情况的话,那我收集完论文后该如何处理呢
方法一:我可以用一个小程序来进行逐一扫描所有的论文内容,并计算每个单词在整个论文中的频率分布情况;通过这种方法分析后就能识别出哪些词汇在整体中使用频率最高。
该方法在样本量较小时具有较好的效果。此外,该方法实现相对容易。该方法能够有效应对这一问题。
方法二:写一个多线程程序,并发遍历论文。
从理论上讲,该问题可以被高度并行处理。这是因为对一个文件的统计不会干扰到另一个文件的统计过程。当机器配置为多核或具备多处理器功能时,在这种情况下,方法二相比而言效率更高一些。然而编写一个多线程程序相比而言更加复杂,在编写过程中必须自行实现对共享数据的同步机制以确保数据的一致性与安全性
方法三:把作业交给多个计算机去完成。
采用方案一的程序后,在多台服务器上进行任务分配会更加高效。具体来说,在方案实施中需要将任务分解为N个独立的部分,并分别分配至N台服务器上运行。该方案运行效率较高(大约能在几秒内完成),然而其实施过程较为繁琐:必须手动复制代码至其他服务器上,并需将数据集手动分割为多个子集;最终整合最终结果将是耗时且复杂的过程(当然我们也可以再编写一个集成模块来自动处理这些整合步骤)。
方法四:让MapReduce来帮帮我们吧!
MapReduce本质上相当于方法三,在具体实现过程中需要解决的关键问题是:如何分割文件集合、如何复制必要的执行脚本以及如何整合最终的计算结果。也就是说,在整个流程中,我们只需为用户提供一个特定的任务模块(即用户的执行脚本),其余的处理逻辑和资源管理工作将由MapReduce系统自动完成。
在讲解MapReduce的工作原理之前, 先阐述主要涉及的两个关键函数及其相关的MapReduce伪代码
3. map函数和reduce函数
map函数和reduce函数是交给用户实现的,这两个函数定义了任务本身。
map函数负责接收一组键值对,并生成一组中间的键值对。MapReduce框架会负责将这些具有相同键的中间结果传递给一个reduce函数。
该操作接收一个键参数,并关联的一组输入集合;随后通过汇总运算生成一个规模缩减后的集合体;此集合体通常仅包含一个元素或为空集。
在统计词频的过程中,在具体的案例中,“map”函数接收的键是文件名,默认情况下接收文件内容作为值。 map会逐一处理每个单词,并生成相应的中间键值对<单词, "1">表示该单词出现了一次。 当多个记录共享相同的关键词时(例如都是某个特定的单词), MapReduce会将这些记录传递给 reduce 函数进行汇总处理。 reduce 函数会接收该关键词并返回对应的计数字符串"1"的数量之和。 最后所有的关键词及其总计数会被写入到用户的指定存储位置(如HDFS或GFS系统),完成整个计算流程。
4. MapReduce是如何工作的

这篇论文中的流程图采用了图形化表示方式
MapReduce框架会将用户的输入数据文件分割成M块(其中M由用户自定义设定),每一块数据通常在16至64MB之间(如图所示,在左侧部分将文件分割为split0至split4块)。随后系统会通过fork机制将应用程序分配至集群上的其他节点进行处理。
在某个user program的副本中存在一个特殊角色称作 master 账户其余则被标记为 worker 账户 master 通常负责协调资源并根据可用状态将工作分配给空闲 worker 环境下这些 worker 的数量同样可通过用户设定来调节
负责执行Map作业的worker依次读取各自对应的分片输入数据。由变量M确定数量的一组Map作业与split一一对应;从输入数据中提取出键值对,并将每个键值对则会被传递给map函数作为处理对象;生成的中间键值对将暂时存储在内存缓冲区中。
缓存机制中的中间键值对会被定期地存储到本地磁盘中,并按照一定规则划分为R个区域(其中R为用户自行设定),在未来的阶段中, 每个分区将与相应的Reduce作业相联系;这些关键值对的位置信息将被传递给Master节点, Master节点则负责将这些信息转发至对应的Reduce worker以完成数据处理流程
Master会负责将 Reduce 作业的任务分配给各个 worker,并确定它们各自处理哪些数据分区。(肯定不止一个地方)每个 Map 任务生成的关键-值对可能会被随机地分配到 R 个不同的区域。当该 Reduce worker 收集并接收完自己负责的所有关键-值对后,
接着会对这些收集来的关键-值对进行排序处理,
以确保相同关键项的所有对应值会被集中在一起。
由于不同的关键项可能被分配到同一个区域或同一个 Reduce 任务中,
所以这种排序操作变得必要。
该reducer处理排序后的中间键值对;针对每一个唯一的键;将其与其相关的值传递给reducer函数;其结果会被收集到该分区的输出文件中。
一旦所有Map和Reduce作业已完成,则主节点将启动合法运行状态下的User程序,并使MapReduce函数调用返回该程序所对应的代码。
所有执行完毕后,MapReduce输出放在了R个分区的输出文件中(分别对应一个Reduce作业)。用户通常并不需要合并这R个文件,而是将其作为输入交给另一个MapReduce程序处理。整个过程中,输入数据是来自底层分布式文件系统(GFS)的,中间数据是放在本地文件系统的,最终输出数据是写入底层分布式文件系统(GFS)的。而且我们要注意Map/Reduce作业和map/reduce函数的区别:Map作业处理一个输入数据的分片,可能需要调用多次map函数来处理每个输入键值对;Reduce作业处理一个分区的中间键值对,期间要对每个不同的键调用一次reduce函数,Reduce作业最终也对应一个输出文件。
我认为将流程划分为三个阶段更为合理。第一个阶段主要进行准备工作,具体包括第1步与第2步的操作内容;第二个阶段则涉及第3步至第6步的任务安排;第三个阶段主要是收尾工作,在此期间系统会整合所有作业结果并将其存入指定的输出文件中。在第一个阶段中负责数据拆分与复制用户的程序任务的是MapReduce核心组件;而第二个阶段则由自定义的映射与归约函数主导执行过程;第三个阶段则主要负责整合并处理最终结果的相关操作
5. 词频是怎么统计出来的
在第四节的基础上, 我们便能够掌握第三节的代码运行机制. 假设我们定义M=5, R=3, 并且共有6台计算节点, 其中一台为Master节点.

该图表展示了MapReduce实现单词频率统计的过程。因为map worker的数量不足,在处理分片1、3和4后产生了中间键值对。一旦所有中间值都已经生成完毕,则Reduction作业会依次读取相应的分区并计算最终的统计结果。
5. HIVE
什么是Hive?
Hive作为一个基于Hadoop的数据仓库工具,在处理结构化数据时会将这些文件转换为表格形式,并允许使用类似于SQL的语言进行查询操作。
**•本质是将 SQL转换为MapReduce程序 **
为什么使用Hive?
人员学习成本太高 项目周期要求太短 我只是需要一个简单的环境
MapReduce如何搞定 复杂查询好难 Join如何实现
•操作接口采用类 SQL语法,提供快速开发的能力
•避免了去写 MapReduce,减少开发人员的学习成本
•扩展功能很方便
**

**
Hive 与传统数据库对比
**

**
6. HBase
HBase是什么?
HBase是一个构建在HDFS上的分布式列存储系统 ;
HBase是基于Google BigTable模型开发的,典型的key/value 系统;
HBase作为Apache Hadoop生态系统的核心组件之一,并主要用于大规模组织化的数据存储。
从逻辑上讲,HBase将数据按照表、行和列进行存储。
与Hadoop相同的是,在Hbase中目标也是通过横向扩展来实现
HBase表的特点
大 :一个表可以有数十亿行,上百万列;
该数据表设计为无模式结构,在每一行中都包含一个有序排列且可排序的主要键以及多个可增减的字段;这些字段可以根据具体需求灵活增添至同一表中的不同行中,每一种主键对应着不同的列,在同一表中的不同行中可能具有截然不同的列组合。
面向列 :面向列(族)的存储和权限控制,列(族)独立检索;
稀疏 :空(null)列并不占用存储空间,表可以设计的非常稀疏;
在每个单元中定义的数据可包含多个不同版本,在这些版本中,默认情况下每个条目都会被赋予一个唯一的标识符,在单元格被插入时生成
数据类型单一 :Hbase中的数据都是字符串,没有类型。

HBase的数据模型
其中, RowKey 被定义为一种 Byte 数组, 在表中每一行记录都赋予一个唯一的标识符以实现便捷的定位查找. 其设计对数据管理至关重要.
Column Family :列族,拥有一个名称(string),包含一个或者多个相关列
该列族归于某一特定的columnFamily,并包含familyName: columnName键值对;支持动态添加每一条记录。
Version Number :类型为Long,默认值是系统时间戳,可由用户自定义
Value(Cell) :Byte array
每个column family存储在HDFS上的一个单独文件中,空值不会被保存。
Key 和 Versionnumber在每个 column family中均有一份;
HBase 为每个值维护了多级索引,即:<key, column family, column name, timestamp>
HBase的存储方式
物理存储:
1、 Table中所有行都按照row key的字典序排列 ;
2、 Table在行的方向上分割为多个Region ;
3、Regions依据规模划分成多个部分,在初始阶段每个表中仅包含一个single region。随着数据量的不断增加,在某个阈值之前区域尺寸会持续扩大。一旦达到该阈值时会将当前区域平均分成两个新的regions,并随后产生越来越多的regions数量。
4、 代表Hbase中的分布式存储方案和负载均衡机制的基本组成部分

虽然Region被视为分布式存储中的最小单元之一,但它并非数据存储的基本单位。Region由一个或多个Stor构成,每一个store都负责管理特定的数据族。每一个store进一步包含了一个memStor以及零个或多个StorFile。每个StorFile中包含有相应的HDFile,而memStor则存放在内存中,剩余的StorFile则储存在HDFS上。
StoreFile以HFile格式保存在HDFS上


HBase的架构及其组件

Hbase基本组件说明:
Client
涉及与HBase交互的方式,并管理缓存机制用于加速对HBase的数据访问;例如记录区域(Region)的位置信息
Master
1. 为Region server分配region(Table在行的方向上分割为多个Region)
2. 负责Region server的负载均衡
3. 发现失效的Region server并重新分配其上的region(zookeeper)
4. 管理用户对table的增删改查操作
Region Server
1. Regionserver维护region,处理对这些region的IO请求 `
Regionserver会处理即将在运行过程中变得过大的区域(当表中的行数增加到某个阈值时,区域的大小超过限制就会被划分)
Zookeeper作用(个人理解相当于一个容灾机制)
采用选举机制以确保无论何时主节点始终唯一,在Master启动后自动加入ZooKeeper注册表中。
2. 存贮所有Region的寻址入口
3. 实时监控Region server的上线和下线信息。并实时通知给Master
4. 存储HBase的schema和table元数据(这个schema应该怎么理解?)
部署Zookeeper后会使Master不再成为单点故障(除非所有服务器同时崩溃)

7. pig
什么是pig?
pig作为一个以Hadoop为基础的大规模数据分析平台存在,
pig支持了一种被称为 Pig Latin 的 SQL-LIKE 语言,
该语言的编译器将类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。
pig提供了更为简便的操作界面来处理海量数据并行计算的需求。
pig的特点
1、深入研究海量数据集;其中涉及的ad hoc分析是指特定问题定制设计的解决方案。
基于集群计算架构运行的YahooPig提供了一种多层次抽象结构,在这个架构下显著简化了并行计算流程,并使得普通用户能够轻松使用这一技术;该系统中的多层抽象机制自动地将用户的查询转换为有效的并行评估计划,并在物理集群上执行这些计划;
3、提供类似 SQL 的操作语法;
4、开放源代码;
pig的主要用户 yahoo twitter
8. Zookeeper
ZooKeeper以其名称暗示它是用来管理某种特定类型的资源或事务的应用程序,在实际操作中被用来管管大象(Hadoop)、蜜蜂(Hive)以及小猪(Pig)。在Apache Hbase、Apache Solr以及LinkedIn等多个项目中都采用了这一工具。这是一个分布式的、开源的分布式应用程序协调服务系统,在其设计中基于Fast Paxos算法实现了同步服务功能,并负责配置管理和命名服务等功能以支持多种分布式应用的发展需求。
Zookeeper 可以被视为Hadoop的一个整体监控模块。当 namenode 或 HMaster 发生故障时,在这种情况下, Zookeeper 将执行选举新的主节点。
9. Hive/pig与HBase的区别
Hive的底层可以是HBase或者HDFS上存储的文件。
Hive的主要功能是将HQL语言转换为MapReduce程序的形式,并通过这种方式帮助数据分析师高效地处理大数据场景下的复杂查询需求。这种转换过程使得开发团队无需面对繁琐的Java编程工作。然而由于每一次单独的Hive查询都需要耗费较长时间(即使针对规模较小的数据表),因此其性能特点并不适合用于Web应用程序的后端数据库服务
相对于MySQL而言,HBase同样具备强大的功能与优势,例如像淘宝这样的平台就已经采用了这一技术方案进行开发和部署。
基于HDFS构建的分布式数据库系统,HBase能够高效地管理并处理海量数据,其存储规模可比MySQL高出约一个到两个数量级。
相比于传统数据库而言,HBase的数据安全性较高,运行过程中不容易发生数据丢失或丢失风险较低。
值得注意的是,HBase的设计理念与现有的一些数据库体系存在显著差异,它特别注重提高查询效率。
具体来说,在结构上与现有的一些数据库体系不同,HBase将表的数据直接存储于物理层面,而不依赖于传统的逻辑化分区划分方式。
这种设计使得其特别适合用于构建实时查询所需的索引结构,从而提升了整体系统的响应速度和性能。
由于Pig和Hive依赖于JavaAPIs,对于开发者而言可能会显得繁琐且容易出错,并限制了Java程序员在Hadoop环境下编程的灵活应对能力。因此,Hadoop为此提供了多种解决方案,使Hadoop编程变得更加便捷。
作为第一种面向大数据处理的编程语言,Pig通过简化Hadoop的传统工作流程实现了高效的数据处理能力。该系统能够读取并加载大量结构化和半结构化数据,提供强大的运算能力来重新组织这些信息,并将处理后的元数据存储起来。其内部操作使其在分析半结构化数据时具有重要意义(例如日志文件)。此外,该系统还允许开发者利用Java中的高级特性扩展自身功能,并支持复杂的数据转换过程。
Hive作为处理海量数据的应用程序,在其运行环境中承担着数据仓库的角色。
通过叠加特定的数据架构到普通文件系统上,并允许用户使用类似于SQL的语言进行高效的数据分析。
与Pig类似,在可扩展性方面也表现出色。
这两种技术往往令人感到困惑,在处理静态的数据结构以及那些需要频繁进行分析的工作时表现得尤为出色。特别适合用于处理数据仓库的任务类似于SQL的应用场景下能够提供一种理想的解决方案——即与Hadoop结合使用且与BI工具相得益彰的技术平台。Pig系统通过提供将大量散乱分布的数据高效聚合的能力极大地提升了数据分析效率并简化了复杂的流程管理过程。相较于其他技术如直接调用Hadoop Java APIs而言 Pig系统因其更直观易懂且操作简便的特点赢得了广泛的应用与认可这就是为何它是吸引开发者的主要原因所在
