作者:QQweiqiang_850 | 来源:互联网 | 2023-05-27 15:01
【Hadoop】实验楼-Haddop基础入门1Hadoop介绍ApacheHadoop软件库是一个框架,允许在集群服务器上使用简单的编程模型对大数据集进行分布式处理
【Hadoop】实验楼-Haddop基础入门
1 Hadoop 介绍
Apache Hadoop 软件库是一个框架,允许在集群服务器上使用简单的编程模型对大数据集进行分布式处理。Hadoop 被设计成能够从单台服务器扩展到数以千计的服务器,每台服务器都有本地的计算和存储资源。Hadoop 的高可用性并不依赖硬件,其代码库自身就能在应用层侦测并处理硬件故障,因此能基于服务器集群提供高可用性的服务。
2 Hadoop 生态系统
经过多年的发展形成了 Hadoop1.X 生态系统,其结构如下图所示:
- HDFS:Hadoop 生态圈的基本组成部分是 Hadoop 分布式文件系统(HDFS)。HDFS 是一种分布式文件系统,数据被保存在计算机集群上,HDFS 为 HBase 等工具提供了基础。
- MapReduce:Hadoop 的主要执行框架是 MapReduce,它是一个分布式、并行处理的编程模型,MapReduce 把任务分为 map(映射)阶段和 reduce(化简)阶段。由于 MapReduce 工作原理的特性,Hadoop 能以并行的方式访问数据,从而实现快速访问数据。
- Hbase:HBase 是一个建立在 HDFS 之上,面向列的 NoSQL 数据库,用于快速读 / 写大量数据,HBase 使用 Zookeeper 进行管理。
- Zookeeper:用于 Hadoop 的分布式协调服务。Hadoop 的许多组件依赖于 Zookeeper,它运行在计算机集群中,用于管理 Hadoop 集群。
- Pig:它是 MapReduce 编程的复杂性的抽象。Pig 平台包括运行环境和用于分析 Hadoop 数据集的脚本语言 (Pig Latin),其编译器将 Pig Latin 翻译成 MapReduce 程序序列。
- Hive:类似于 SQL 高级语言,用于运行存储在 Hadoop 上的查询语句,Hive 让不熟悉 MapReduce 的开发人员也能编写数据查询语句,然后这些语句被翻译为 Hadoop 上面的 MapReduce 任务。像 Pig 一样,Hive 作为一个抽象层工具,吸引了很多熟悉 SQL 而不是 Java 编程的数据分析师。
- Sqoop:一个连接工具,用于在关系数据库、数据仓库和 Hadoop 之间转移数据。Sqoop 利用数据库技术描述架构,进行数据的导入 / 导出;利用 MapReduce 实现并行化运行和容错技术。
- Flume:提供了分布式、可靠、高效的服务,用于收集、汇总大数据,并将单台计算机的大量数据转移到 HDFS。它基于一个简单而灵活的架构,利用简单的可扩展的数据模型,将企业中多台计算机上的数据转移到 Hadoop 中。
3 Hadoop1.X 伪分布安装
Hadoop 安装有如下三种方式:
- 单机模式:安装简单,几乎不用做任何配置,但仅限于调试用途。
- 伪分布模式:在单节点上同时启动 NameNode、DataNode、JobTracker、TaskTracker、Secondary Namenode 等 5 个进程,模拟分布式运行的各个节点。
- 完全分布式模式:正常的 Hadoop 集群,由多个各司其职的节点构成。
4 HDFS
4.1 原理
HDFS(Hadoop Distributed File System)是一个分布式文件系统。它具有高容错性并提供了高吞吐量的数据访问,非常适合大规模数据集上的应用,它提供了一个高度容错性和高吞吐量的海量数据存储解决方案。
- 高吞吐量访问:HDFS 的每个 Block 分布在不同的 Rack 上,在用户访问时,HDFS 会计算使用最近和访问量最小的服务器给用户提供。由于 Block 在不同的 Rack 上都有备份,所以不再是单数据访问,速度和效率是非常快的。另外 HDFS 可以并行从服务器集群中读写,增加了文件读写的访问带宽。
- 高容错性:系统故障不可避免,如何做到故障之后的数据恢复和容错处理是至关重要的。HDFS 通过多方面保证数据的可靠性,多份复制并且分布到物理位置的不同服务器上,数据校验功能、后台的连续自检数据一致性功能都为高容错提供了可能。
- 线性扩展:因为 HDFS 的 Block 信息存放到 NameNode 上,文件的 Block 分布到 DataNode 上,当扩充的时候仅仅添加 DataNode 数量,系统可以在不停止服务的情况下做扩充,不需要人工干预。
4.2 HDFS 架构
如上图所示 HDFS 是 Master 和 Slave 的结构,分为 NameNode、Secondary NameNode 和 DataNode 三种角色。
- NameNode:在 Hadoop1.X 中只有一个 Master 节点,管理 HDFS 的名称空间和数据块映射信息、配置副本策略和处理客户端请求。
- Secondary NameNode:辅助 NameNode,分担 NameNode 工作,定期合并 fsimage 和 fsedits 并推送给 NameNode,紧急情况下可辅助恢复 NameNode。
- DataNode:Slave 节点,实际存储数据、执行数据块的读写并汇报存储信息给 NameNode。
4.3 HDFS 读操作
- 客户端通过调用 FileSystem 对象的
open()
方法来打开希望读取的文件,对于 HDFS 来说,这个对象是分布式文件系统的一个实例; - DistributedFileSystem 通过使用 RPC 来调用 NameNode 以确定文件起始块的位置,同一 Block 按照重复数会返回多个位置,这些位置按照 Hadoop 集群拓扑结构排序,距离客户端近的排在前面;
- 前两步会返回一个 FSDataInputStream 对象,该对象会被封装成 DFSInputStream 对象,DFSInputStream 可以方便的管理 datanode 和 namenode 数据流,客户端对这个输入流调用
read()
方法; - 存储着文件起始块的 DataNode 地址的 DFSInputStream 随即连接距离最近的 DataNode,通过对数据流反复调用
read()
方法,可以将数据从 DataNode 传输到客户端; - 到达块的末端时,DFSInputStream 会关闭与该 DataNode 的连接,然后寻找下一个块的最佳 DataNode,这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流;
- 一旦客户端完成读取,就对 FSDataInputStream 调用
close()
方法关闭文件读取。
4.4 HDFS 写操作
- 客户端通过调用 DistributedFileSystem 的
create()
方法创建新文件; - DistributedFileSystem 通过 RPC 调用 NameNode 去创建一个没有 Blocks 关联的新文件,创建前 NameNode 会做各种校验,比如文件是否存在、客户端有无权限去创建等。如果校验通过,NameNode 会为创建新文件记录一条记录,否则就会抛出 IO 异常;
- 前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode 和 Datanode。客户端开始写数据到 DFSOutputStream,DFSOutputStream 会把数据切成一个个小的数据包,并写入内部队列称为“数据队列”(Data Queue);
- DataStreamer 会去处理接受 Data Queue,它先问询 NameNode 这个新的 Block 最适合存储在哪几个 DataNode 里,比如重复数是 3,那么就找到 3 个最适合的 DataNode,把他们排成一个 pipeline。DataStreamer 把 Packet 按队列输出到管道的第一个 Datanode 中,第一个 DataNode 又把 Packet 输出到第二个 DataNode 中,以此类推;
- DFSOutputStream 还有一个队列叫 Ack Quene,也是由 Packet 组成,等待 DataNode 的收到响应,当 Pipeline 中的所有 DataNode 都表示已经收到的时候,这时 Akc Quene 才会把对应的 Packet 包移除掉;
- 客户端完成写数据后调用
close()
方法关闭写入流; - DataStreamer 把剩余的包都刷到 Pipeline 里然后等待 Ack 信息,收到最后一个 Ack 后,通知 NameNode 把文件标示为已完成。
5 Hive
5.1 Hive 介绍
Hive 是 Facebook 开发的构建于 Hadoop 集群之上的数据仓库应用,它提供了类似于 SQL 语法的 HQL 语句作为数据访问接口,这使得普通分析人员应用 Hadoop 的学习曲线变小,Hive 有如下特性:
- Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并使用 sql 语句转换为 MapReduce 任务进行运行。其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析。
- Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 的开发者来开发自定义的 Mapper 和 Reducer 处理内建的 Mapper 和 Reducer 无法完成的复杂分析工作。
5.2 Hive 与关系数据库的区别
使用 Hive 的命令行接口很像操作关系数据库,但是 Hive 和关系数据库还是有很大的不同, Hive 与关系数据库的区别具体如下:
- Hive 和关系数据库存储文件的系统不同,Hive 使用的是 Hadoop 的 HDFS(Hadoop 的分布式文件系统),关系数据库则是服务器本地的文件系统。
- Hive 使用的计算模型是 MapReduce,而关系数据库则是自身的计算模型。
- 关系数据库都是为实时查询的业务进行设计的,而 Hive 则是为海量数据做数据挖掘设计的,实时性很差;实时性的区别导致 Hive 的应用场景和关系数据库有很大的不同。
- Hive 很容易扩展自己的存储能力和计算能力,这个是继承 Hadoop 的,而关系数据库在这个方面相比起来要差很多。
5.3 Hive 架构
由上图可知,Hadoop 的 MapReduce 是 Hive 架构的根基。Hive 架构包括如下组件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、Metastore 和 Driver(Complier、Optimizer 和 Executor),这些组件分为两大类:服务端组件和客户端组件。
服务端组件:
Driver 组件
:该组件包括 Complier、Optimizer 和 Executor,它的作用是将 HiveQL(类 SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的 MapReduce 计算框架。Metastore 组件
:元数据服务组件,这个组件存储 Hive 的元数据,Hive 的元数据存储在关系数据库里,Hive 支持的关系数据库有 derby 和 mysql。元数据对于 Hive 十分重要,因此 Hive 支持把 metastore 服务独立出来,安装到远程的服务器集群里,从而解耦 Hive 服务和 metastore 服务,保证 Hive 运行的健壮性。Thrift 服务
:Thrift 是 facebook 开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,Hive 集成了该服务,能让不同的编程语言调用 hive 的接口。
客户端组件:
CLI
:command line interface,命令行接口。Thrift 客户端
:上面的架构图里没有写上 Thrift 客户端,但是 Hive 架构的许多客户端接口是建立在 Thrift 客户端之上,包括 JDBC 和 ODBC 接口。WEBGUI
:Hive 客户端提供了一种通过网页的方式访问 hive 所提供的服务。这个接口对应 Hive 的 hwi 组件(hive web interface),使用前要启动 hwi 服务。