Hadoop生态系统入门进阶之一

组成系统介绍
  • 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 中。
 
安装模式三种
  • 单机模式:安装简单,几乎不用做任何配置,但仅限于调试用途;
  • 伪分布模式:在单节点上同时启动 NameNode、DataNode、JobTracker、TaskTracker、Secondary Namenode 等 5 个进程,模拟分布式运行的各个节点;
  • 完全分布式模式:正常的 Hadoop 集群,由多个各司其职的节点构成。
 
环境搭建
1.使用sudo vi /etc/sysconfig/network
打开配置文件,根据实际情况设置该服务器的机器名,新机器名在重启后生效
2.sudo vi /etc/hosts 设置 IP 地址与机器名的映射   例如: 192.168.42.2 55a95997af1c hadoop
3.使用 ping 命令验证设置是否成功
4.关闭防火墙:使用 sudo service iptables status 查看防火墙状态。若弹出权限不足,可能防火墙已经关闭,请输入命令:chkconfig iptables --list 查看防火墙的状态 ;使用sudo chkconfig iptables off 关闭防火墙
5.关闭SElinux:使用 getenforce 命令查看是否关闭;修改 /etc/selinux/config 文件,将 SELINUX=enforcing 改为 SELINUX=disabled,执行该命令后重启机器生效
6.下载并解压Hadoop的安装包
7.进入 hdfs 目录中,使用chmod -R 755 data命令把 hdfs/data 设置为 755,否则 DataNode 会启动失败
8.进入 hadoop-1.1.2/conf 目录,打开配置文件 hadoop-env.sh
9.打开 core-site.xml 配置文件进行配置
10.配置hdfs-site.xml
11.配置mapped-site.xml

12.配置masters 和 slaves

13.cd /app/hadoop-1.1.2/bin 进行格式化 namenode  
./hadoop namenode -format
14:使用./start-all.sh。启动hadoop 使用jps查看Hadoop相关进程是否启动
 
HDFS原理
  • 高吞吐量访问:HDFS 的每个 Block 分布在不同的 Rack 上,在用户访问时,HDFS 会计算使用最近和访问量最小的服务器给用户提供。由于 Block 在不同的 Rack 上都有备份,所以不再是单数据访问,速度和效率是非常快的。另外 HDFS 可以并行从服务器集群中读写,增加了文件读写的访问带宽。
  • 高容错性:系统故障不可避免,如何做到故障之后的数据恢复和容错处理是至关重要的。HDFS 通过多方面保证数据的可靠性,多份复制并且分布到物理位置的不同服务器上,数据校验功能、后台的连续自检数据一致性功能都为高容错提供了可能。
  • 线性扩展:因为 HDFS 的 Block 信息存放到 NameNode 上,文件的 Block 分布到 DataNode 上,当扩充的时候仅仅添加 DataNode 数量,系统可以在不停止服务的情况下做扩充,不需要人工干预。
 
hdfs是 Master 和 Slave 的结构,分为 NameNode、Secondary NameNode 和 DataNode 三种角色
  • NameNode:在 Hadoop1.X 中只有一个 Master 节点,管理 HDFS 的名称空间和数据块映射信息、配置副本策略和处理客户端请求;
  • Secondary NameNode:辅助 NameNode,分担 NameNode 工作,定期合并 fsimage 和 fsedits 并推送给 NameNode,紧急情况下可辅助恢复 NameNode;
  • DataNode:Slave 节点,实际存储数据、执行数据块的读写并汇报存储信息给 NameNode;
 
hdfs读操作
  1. 客户端通过调用 FileSystem 对象的 open() 方法来打开希望读取的文件,对于 HDFS 来说,这个对象是分布文件系统的一个实例;
  2. DistributedFileSystem 通过使用 RPC 来调用 NameNode 以确定文件起始块的位置,同一 Block 按照重复数会返回多个位置,这些位置按照 Hadoop 集群拓扑结构排序,距离客户端近的排在前面;
  3. 前两步会返回一个 FSDataInputStream 对象,该对象会被封装成 DFSInputStream 对象,DFSInputStream 可以方便的管理 datanode 和 namenode 数据流,客户端对这个输入流调用 read() 方法;
  4. 存储着文件起始块的 DataNode 地址的 DFSInputStream 随即连接距离最近的 DataNode,通过对数据流反复调用 read() 方法,可以将数据从 DataNode 传输到客户端;
  5. 到达块的末端时,DFSInputStream 会关闭与该 DataNode 的连接,然后寻找下一个块的最佳 DataNode,这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流;
  6. 一旦客户端完成读取,就对 FSDataInputStream 调用 close() 方法关闭文件读取。
 
hdfs写操作
  1. 客户端通过调用 DistributedFileSystem 的 create() 方法创建新文件;
  2. DistributedFileSystem 通过 RPC 调用 NameNode 去创建一个没有 Blocks 关联的新文件,创建前 NameNode 会做各种校验,比如文件是否存在、客户端有无权限去创建等。如果校验通过,NameNode 会为创建新文件记录一条记录,否则就会抛出 IO 异常;
  3. 前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode 和 Datanode。客户端开始写数据到 DFSOutputStream,DFSOutputStream 会把数据切成一个个小的数据包,并写入内部队列称为“数据队列”(Data Queue);
  4. DataStreamer 会去处理接受 Data Queue,它先问询 NameNode 这个新的 Block 最适合存储在哪几个 DataNode 里,比如重复数是 3,那么就找到 3 个最适合的 DataNode,把他们排成一个 pipeline.DataStreamer 把 Packet 按队列输出到管道的第一个 Datanode 中,第一个 DataNode 又把 Packet 输出到第二个 DataNode 中,以此类推;
  5. DFSOutputStream 还有一个队列叫 Ack Quene,也是由 Packet 组成,等待 DataNode 的收到响应,当 Pipeline 中的所有 DataNode 都表示已经收到的时候,这时 Akc Quene 才会把对应的 Packet 包移除掉;
  6. 客户端完成写数据后调用 close() 方法关闭写入流;
  7. DataStreamer 把剩余的包都刷到 Pipeline 里然后等待 Ack 信息,收到最后一个 Ack 后,通知 NameNode 把文件标示为已完成。
 
MapReduce简介:
MapReduce 框架的核心步骤主要分两部分:Map 和 Reduce。当你向 MapReduce 框架提交一个计算作业时,它会首先把计算作业拆分成若干个 Map 任务,然后分配到不同的节点上去执行,每一个 Map 任务处理输入数据中的一部分,当 Map 任务完成后,它会生成一些中间文件,这些中间文件将会作为 Reduce 任务的输入数据。Reduce 任务的主要目标就是把前面若干个 Map 的输出汇总到一起并输出。
 
流程分析---map过程
1.每个输入分片会让一个 map 任务来处理,默认情况下,以 HDFS 的一个块的大小(默认为 64M)为一个分片,当然我们也可以设置块的大小。map 输出的结果会暂时放在一个环形内存缓冲区中(该缓冲区的大小默认为 100M,由 io.sort.mb 属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的 80%,由 io.sort.spill.percent 属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件;
2.在写入磁盘之前,线程首先根据 reduce 任务的数目将数据划分为相同数目的分区,也就是一个 reduce 任务对应一个分区的数据。这样做是为了避免有些 reduce 任务分配到大量数据,而有些 reduce 任务却分到很少数据,甚至没有分到数据的尴尬局面。其实分区就是对数据进行 hash 的过程。然后对每个分区中的数据进行排序,如果此时设置了 Combiner,将排序后的结果进行 Combia 操作,这样做的目的是让尽可能少的数据写入到磁盘;
3.当 map 任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并。合并的过程中会不断地进行排序和 combia 操作,目的有两个:
  • 尽量减少每次写入磁盘的数据量
  • 尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。为了减少网络传输的数据量,这里可以将数据压缩,只要将 mapred.compress.map.out 设置为 true 就可以了
4.将分区中的数据拷贝给相对应的 reduce 任务。有人可能会问:分区中的数据怎么知道它对应的 reduce 是哪个呢?其实 map 任务一直和其父 TaskTracker 保持联系,而 TaskTracker 又一直和 JobTracker 保持心跳。所以 JobTracker 中保存了整个集群中的宏观信息。只要 reduce 任务向 JobTracker 获取对应的 map 输出位置就可以了。
流程分析---reduce过程
1.Reduce 会接收到不同 map 任务传来的数据,并且每个 map 传来的数据都是有序的。如果 reduce 端接受的数据量相当小,则直接存储在内存中(缓冲区大小由 mapred.job.shuffle.input.buffer.percent 属性控制,表示用作此用途的堆空间的百分比),如果数据量超过了该缓冲区大小的一定比例(由 mapred.job.shuffle.merge.percent 决定),则对数据合并后溢写到磁盘中;
2.随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。其实不管在 map 端还是 reduce 端,MapReduce 都是反复地执行排序、合并操作;
3.合并的过程中会产生许多的中间文件(写入磁盘了),但 MapReduce 会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到 reduce 函数。
MapReduce工作机制
1.在集群中的任意一个节点提交 MapReduce 程序;
2.JobClient 收到作业后,JobClient 向 JobTracker 请求获取一个 Job ID;
3.将运行作业所需要的资源文件复制到 HDFS 上(包括 MapReduce 程序打包的 JAR 文件、配置文件和客户端计算所得的输入划分信息),这些文件都存放在 JobTracker 专门为该作业创建的文件夹中,文件夹名为该作业的 Job ID;
4.获得作业 ID 后,提交作业;
5.JobTracker 接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度,当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个 map 任务,并将 map 任务分配给 TaskTracker 执行;
6.对于 map 和 reduce 任务,TaskTracker 根据主机核的数量和内存的大小有固定数量的 map 槽和 reduce 槽。这里需要强调的是:map 任务不是随随便便地分配给某个 TaskTracker 的,这里有个概念叫:数据本地化(Data-Local)。意思是:将 map 任务分配给含有该 map 处理的数据块的 TaskTracker 上,同时将程序 JAR 包复制到该 TaskTracker 上来运行,这叫“运算移动,数据不移动”;
7.TaskTracker 每隔一段时间会给 JobTracker 发送一个心跳,告诉 JobTracker 它依然在运行,同时心跳中还携带着很多的信息,比如当前 map 任务完成的进度等信息。当 JobTracker 收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当 JobClient 查询状态时,它将得知任务已完成,便显示一条消息给用户;
8.运行的 TaskTracker 从 HDFS 中获取运行所需要的资源,这些资源包括 MapReduce 程序打包的 JAR 文件、配置文件和客户端计算所得的输入划分等信息;
9.TaskTracker 获取资源后启动新的 JVM 虚拟机;
10.运行每一个任务;
posted @ 2019-10-16 15:08  Lei、Sunny  阅读(267)  评论(0编辑  收藏  举报