第二章-大数据处理框Hadoop
文章目录
Hadoop简介
Hadoop概念
Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了系统底层细节透明的分布式基础架构。Hadoop被公认为行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力
Hadoop是基于Java语言开发的,具有很好的跨平台特性,并且可以部署在廉价的计算机集群中。Hadoop可以支持多种编程语言:C/C++、Java、Python 等。
Hadoop的核心是分布式文件系统HDFS(Hadoop Distributed File System)和 MapReduce。
Hadoop是一个能够对大量数据进行分布式处理的软件框架,并且是以一种可靠、高效、可伸缩的方式进行处理的,它具有以下几个方面的特性:
- 高可靠性
- 高效性
- 高可扩展性
- 高容错性
- 成本低
Hadoop凭借其突出的优势,已经在各个领域得到了广泛的应用,而互联网领域是其应用的主阵地
- Facebook主要将Hadoop平台用于日志处理、推荐系统和数据仓库等方面
- 国内采用Hadoop的公司主要有百度、阿里、网易、华为、中国移动等,其中,阿里的Hadoop 集群比较大
Hadoop在企业中的应用架构:
Hadoop版本
Apache Hadoop版本演变:
- Hadoop1.0
- Hadoop0.20.x
- Hadoop0.21.x
- Hadoop0.22.x
- Hadoop2.0
- Hadoop0.23.x
- Hadoop2.x
- Hadoop3.0
- Hadoop3.x
Hadoop 3.x 版本还没有经过充分的测试,可能还存在些问题。目前还是推荐使用 Hadoop 2.x 版本。
Hadoop1.0 的核心组件仅包括 MapReduce 和 HDFS,存在单一名称节点、单一命名空间、资源管理效率低等问题。Hadoop2.0 中设计了HDFS HA,提供名称节点热备机制;设计了HDFS Federation,管理多个命名空间;设计了新的资源管理框架 YARN。
Hadoop优化与发展
Hadoop的优化与发展主要体现在两个方面:
- Hadoop 自身两大核心组件 MapReduce 和 HDFS 的架构设计改进
- Hadoop 生态系统其它组件的不断丰富,加入了Pig、Tez、Spark 等新组件
组件 | 功能 | 解决的问题 |
---|---|---|
Pig | 处理大规模数据的脚本语言,用户只需要编写几条简单的语句,系统会自动转换为 MapReduce 作业 | 抽象层次低,需要手工编写大量代码 |
Spark | 基于内存的分布式并行编程框架,具有较高的实时性,并且较好支持迭代计算 | 延迟高,而且不适合执行迭代计算 |
Oozie | 工作流和协作服务引擎,协调Hadoop上运行的不同任务 | 没有提供作业(Job)之间依赖关系管理机制,需要用户自己处理作业之间依赖关系 |
Tez | 支持DAG作业的计算框架,对作业的操作进行重新分解和组合,形成一个大的DAG作业,减少不必要操作 | 不同的MapReduce任务之间存在重复操作,降低了效率 |
Kafka | 分布式发布订阅消息系统,不同类型的分布式系统可以统一接入到Kafka,实现和Hadoop各个组件之间的不同类型数据的实时高效交换 | Hadoop生态系统中各个组件和其他产品之间缺乏统一的、高效的数据交换中介 |
Hadoop生态系统
Hadoop的项目结构不断丰富发展,已经形成一个丰富的Hadoop生态系统
数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。
数据仓库与数据库的主要区别在于:
- 数据库是面向事务的设计,数据仓库是面向主题设计的
- 数据库一般存储在线交易数据,数据仓库存储的一般是历史数据
- 数据库设计是尽量避免冗余,数据仓库在设计是有意引入冗余
- 数据库是为捕获数据而设计,数据仓库是为分析数据而设计
Hive
Hive是一个构建于 Hadoop 顶层的数据仓库工具,支持大规模数据存储、分析,具有良好的可扩展性,某种程度上可以看作是用户编程接口,本身不存储和处理数据。
- 依赖分布式文件系统 HDFS 存储数据
- 依赖分布式并行计算模型 MapReduce 处理数据
- 定义了简单的类似 SQL 的查询语言——HiveQL,用户可以通过编写的 HiveQL 语句运行 MapReduce 任务
- 可以很容易把原来构建在关系数据库上的数据仓库应用程序移植到 Hadoop 平台上
Hive本身提供了一系列对数据进行提取、转换、加载(ETL)的工具,可以存储、查询和分析存储在Hadoop中的大规模数据,这些工具能够很好地满足数据仓库各种应用场景。
Hive在很多方面和传统的关系数据库类似,但是它的底层依赖的是 HDFS 和 MapReduce,所以在很多方面又有别于传统数据库。
对比 | Hive | 传统数据库 |
---|---|---|
数据插入 | 支持批量导入 | 支持单条和批量导入 |
数据更新 | 不支持 | 支持 |
索引 | 支持 | 支持 |
执行延迟 | 高 | 低 |
扩展性 | 好 | 有限 |
Hive应用实例:WordCount
- 采用 Hive 实现 WordCount 算法需要编写较少的代码量
- 在 MapReduce 的实现中,需要进行编译生成 jar 文件来执行算法,而在 Hive 中不需要。HiveQL 语句的最终实现需要转换为 MapReduce 任务来执行,这都是由 Hive 框架自动完成的,用户不需要了解具体实现细节
Hive在企业大数据分析平台中的应用,有时候 Pig 可以作为 Hive 的替代工具。
Pig
Pig是一个基于Hadoop的大规模数据分析平台,它简化了 Hadoop 常见的工作任务。Pig可加载数据、表达转换数据以及存储最终结果,Pig内置的操作使得半结构化数据变得有意义(如日志文件)。同时Pig可扩展使用Java中添加的自定义数据类型并支持数据转换。
- 提供类似 SQL 的查询语言Pig Latin
- 允许用户通过编写简单的脚本来实现复杂的数据分析,而不需要编写复杂的MapReduce应用程序
- Pig会自动把用户编写的脚本转换成MapReduce作业在 Hadoop集群上运行,而且具备对生成的MapReduce程序进行自动优化的功能
- Hive一般处理的是结构化的数据,Pig可以处理非结构化数据。处理流程: LOAD-> 转换 ->STORE/DUMP
Tez: 支持DAG作业的计算框架。核心思想是将 Map 和 Reduce 两个操作进一步拆分,分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的 DAG 作业。
Hadoop重要组件
Hadoop生态系统重要组件
组件 | 功能 |
---|---|
HDFS | 分布式文件系统 |
MapReduce | 分布式并行编程模型 |
YARN | 资源管理和调度器 |
Tez | 运行在 YARN 之上的下一代 HAdoop 查询处理框架 |
Hive | Hadoop 上的数据仓库 |
HBase | Hadoop 上的非关系型的分布式数据库 |
Pig | 一个基于 Hadoop 的大规模数据分析平台,提供类似 SQL 的查询语言 Pig Latin |
Sqoop | 用于在 Hadoop 与传统数据库之间进行数据传递 |
Oozie | Hadoop 上的工作流管理系统 |
Zookeeper | 提供分布式协调一致性服务 |
Storm | 流计算框架 |
Flume | 一个高可用的,高可靠,分布式的海量日志采集、聚合和传输的系统 |
Ambari | Hadoop 快速部署工具,支持Apache Hadoop集群的供应、管理和监控 |
Kafka | 一种高吞吐量的分布式发布订阅消息系统,可以处理消费者规模的网站中的所有动作流数据 |
Spark | 类似于Hadoop MapReduce的通用并行框架 |
Hadoop集群部署
Hadoop安装方式:
- 单机模式:Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。
- 伪分布式模式:Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
- 分布式模式:使用多个节点构成集群环境来运行 Hadoop
Hadoop框架中最核心的设计是为海量数据提供存储的 HDFS 和对数据进行计算的 MapReduce。MapReduce的作业主要包括:
- 从磁盘或从网络读取数据,即IO密集工作
- 计算数据,即CPU密集工作
Hadoop集群的整体性能取决于CPU、内存、网络以及存储之 间的性能平衡。因此运营团队在选择机器配置时要针对不同 的工作节点选择合适硬件类型。
一个基本的 Hadoop 集群中的节点主要有:
- NameNode:负责协调集群中的数据存储
- DataNode:存储被拆分的数据块
- JobTracker:协调不同机器上数据计算任务
- TaskTracker:负责执行由 JobTracker 指派的任务
- SecondaryNameNode:帮助 NameNode 收集文件系统运行的状态信息
在集群中,大部分的机器设备是作为 Datanode和 TaskTracker 工作的。NameNode提供整个 HDFS 文件系统的 NameSpace(命名 空间)管理、块管理等所有服务,很多元数据是直接保存在 内存中的,因此需要更多的RAM,与集群中的数据块数量 相对应,并且需要优化 RAM 的内存通道带宽。SecondaryNameNode在小型集群中可以和 NameNode 共用一台机器,较大的群集可以采用与NameNode相同的硬件。
Hadoop集群规模可大可小,初始时,可以从一个较小规模的集群开始,比如包含10个节点,然后,规模随着存储器和计算需求的扩大而扩大。
对于一个小的集群,名称节点(NameNode)和 JobTracker 运行在单个节点上,通常是可以接受的。但是,随着集群和存储在HDFS 中的文件数量的增加,名称节点需要更多的主存,这时,名称节点和 JobTracker 就需要运行在不同的节点上。
第二名称节点(SecondaryNameNode)会和名称节点可以运行在 相同的机器上,但是,由于第二名称节点和名称节点几乎具有相同的主存需求,因此,二者最好运行在不同节点上。
普通的Hadoop集群结构由一个两阶网络构成。每个机架(Rack)有30-40个服务器,配置一个1GB的交换机,并向上传输到一个核心交换机或者路由器(1GB或以上)。