第3章Hadoop大数据处理架构Apache Hadoop是一个开源软件框架,可安装在一个计算机集群中,使计算机可彼此通信并协同工作,以高度分布式的方式共同存储和处理大量数据。Hadoop实现了MapReduce计算模型和分布式文件系统HDFS等功能。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。本章主要介绍Hadoop特性、Hadoop生态系统及其各个组件,以及Hadoop的安装与使用等。
3.1Hadoop概述3.1.1Hadoop简介Hadoop简介
Hadoop这个名字不是一个缩写,而是一个虚构的名字。Hadoop是基于Java语言开发的,可以部署在廉价的计算机集群上的开源的、可靠的和可扩展的分布式并行计算框架,具有很好的跨平台特性。Hadoop的核心是HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)和MapReduce(分布式并行计算编程模型)。HDFS设计成能可靠地在集群中大量机器之间存储大量的文件,它以块序列的形式存储文件,文件中除了最后一个块,其他块都有相同的大小。使用数据块存储数据文件的好处: 一个文件的大小可以大于网络中任意一个磁盘的容量,文件的所有块不需要存储在同一个磁盘上,可以利用集群上的任意一个磁盘进行存储;数据块更适合用于数据备份,进而提供数据容错能力和提高可用性。MapReduce的主要思想是Map(映射)和Reduce(归约)。MapReduce并行计算编程模型能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果。MapReduce模型将数据分布存储、数据通信、容错处理等并行计算涉及的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。
3.1.2Hadoop特性
Hadoop是一个能够让用户轻松架构和使用的分布式计算平台,用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。它主要有以下5个特性。
1. 高可靠性
Hadoop成立之初就是假设计算元素和存储会失败,它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。
2. 高扩展性
Hadoop是在可用的计算机集群间分配数据并完成计算任务的,这些集群可以方便地扩展到数以千计的节点中。
3. 高效性
Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态负载平衡。因此,处理速度非常快。
4. 高容错性
Hadoop能够自动将数据保存为多个副本,并且能够自动将失败的任务重新分配。
5. 低成本
与一体机、商用数据仓库以及QlikView、SpotView等数据集市相比,Hadoop是开源的,项目的软件成本因此大大降低。
此外,Hadoop可运行在廉价的集群上,普通用户也很容易用自己的PC搭建Hadoop运行环境。
HDFS的优点: 适合大文件存储,支持TB、PB级的数据存储;可以构建在廉价的机器上,并有一定的容错和恢复机制;支持流式数据访问,一次写入,多次读取非常高效。
HDFS的缺点: 不适合大量小文件存储;不适合并发写入,不支持随机修改;不支持随机读等低延时的访问方式。
大数据技术(微课版)第3章Hadoop大数据处理架构3.2Hadoop生态系统
Hadoop是一个能够对大量数据进行分布式处理的软件框架。Hadoop的核心是HDFS和MapReduce,Hadoop 2.0还包括YARN。Hadoop 2.0的生态系统如图31所示。
图31Hadoop 2.0的生态系统
3.2.1Hadoop分布式文件系统
Hadoop分布式文件系统是Hadoop项目的核心之一,是针对谷歌文件系统(Google File System,GFS)的开源实现。HDFS是Hadoop体系中数据存储管理的基础。HDFS是一个高度容错的系统,能检测和应对硬件故障,可运行在低成本的通用硬件上。HDFS简化了文件的一致性模型,通过流式数据访问,适合带有大型数据集的应用程序。
3.2.2MapReduce分布式计算模型
MapReduce是一种分布式计算模型,用于进行大数据量的计算。其中,Map对数据集上的独立元素进行指定的操作,生成键值对形式的中间结果。Reduce对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。MapReduce这样的功能划分,非常适合在大量计算机组成的分布式并行环境里进行数据处理。Apache Hadoop 的MapReduce的经典架构 (MRv1)如图32所示。
图32MapReduce的经典架构 (MRv1)
在 MapReduce框架中,有两种类型的节点: 一种称为 JobTracker 的Master节点,只有一个,它协调在集群上运行的所有作业,分配要在TaskTracker节点上运行的Map和Reduce任务;另一种称为TaskTracker 的Slave节点,有多个,它们运行JobTracker分配的任务并定期向JobTracker报告进度。
Map Task: 该节点主要是将读入输入数据文件阶段解析出的键值对交给用户编写map函数处理,并产生一系列新的键值对。
Reduce Task: 从Map Task的执行结果进行排序,将数据按照分组传递给用户编写的reduce函数处理。
3.2.3Hive数据仓库
Hive是建立在Hadoop之上的数据仓库,依赖于HDFS存储数据。数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。Hive可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为 MapReduce任务运行。使用SQL来快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive由Facebook公司开发,在某种程度上可以看成是用户编程接口,本身并不存储和处理数据,依赖于HDFS存储数据,依赖MapReduce处理数据。有类SQL语言HiveQL,不完全支持SQL标准,例如不支持更新操作、索引和事务,其子查询和连接操作也存在很多限制。
3.2.4HBase分布式数据库
HBase是一个建立在HDFS之上的高可靠性、高性能、面向列和可伸缩的分布式数据库,提供了对结构化、半结构化和非结构化大数据的实时读写和随机访问能力。HBase的主要技术特点如下。
(1) 容量大。一个表可以有数十亿行,上百亿列。当关系数据库的单个表的记录在亿级时,则查询和写入的性能都会呈现指数级下降,而HBase对于单表存储百亿或更多的数据都没有性能问题。
(2) 无固定模式(表结构不固定)。列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
(3) 列式存储。用户可以将数据表的列组合成多个列族(Column Family),HBase可将所有记录的同一个列族下的数据集中存放。由于查询操作通常是基于列名进行的条件查询,可把经常查询的列组成一个列族,查询时只需要扫描相关列名下的数据,避免了关系数据库基于行存储的方式下需要扫描所有行的数据记录,可大大提高访问性能。
(4) 稀疏性。空列并不占用存储空间,表可以设计得非常稀疏。
(5) 数据类型单一。HBase中的数据都是字符串。
3.2.5Zookeeper分布式协调服务
ZooKeeper是Hadoop和HBase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括配置维护、命名服务、分布式同步和组服务等。
Zookeeper主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,通过维护和监控存储的数据的状态变化,从而达到基于数据的集群管理。
Zookeeper可以保证如下分布式一致性特性。
(1) 顺序一致性。从同一个客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到Zookeeper中去。
(2) 原子性。所有事务请求的处理结果在整个集群中所有的机器上的应用情况是一致的。
(3) 单一视图。无论客户端连接的是哪个Zookeeper服务器,其看到的服务器数据模型都是一致的。
(4) 可靠性。一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来,除非有另一个事务又对其进行了变更。
(5) 实时性。在一定的时间内,客户端最终一定能够从服务端上读取到最新的数据状态。
3.2.6Sqoop数据导入导出工具
Sqoop是SQLtoHadoop的缩写,是一个Hadoop和关系数据库之间进行数据导入导出的工具。借助Sqoop可把一个关系数据库(如MySQL和Oracle等)中的数据导入到Hadoop的HDFS、Hive和HBase等数据存储系统中,也可以把这些存储系统中的数据导入到关系数据库中。
Sqoop数据导入导出的功能是通过将导入或导出命令翻译成MapReduce程序来实现的,翻译出的MapReduce中主要是对 InputFormat 和 OutputFormat 进行定制。
3.2.7Pig数据分析
Pig是一个基于Hadoop的大规模数据分析工具,它提供的类SQL叫Pig Latin,该语言的编译器会把类SQL的数据分析请求,转换为一系列经过优化处理的MapReduce。
Pig在MapReduce的基础上创建了更简单的过程语言抽象,为Hadoop应用程序提供了一种更加接近结构化查询语言(SQL)的接口。不需要编写单独的MapReduce应用程序,可以用Pig Latin语言写一个脚本,在集群中自动并行处理与分发该脚本。
Pig是一种大规模数据集的脚本语言,MapReduce的开发周期长,代码编写复杂,而Pig可以用几行代码轻松处理TB级的数据。Pig Latin可完成排序、过滤、求和、分组和关联等操作,支持自定义函数。Pig的运行方式有Grunt Shell方式、脚本方式和嵌入式方式。
3.2.8Mahout数据挖掘算法库
Mahout的主要目的是实现可伸缩的机器学习算法(就是算法的MapReduce化),但也不一定要求基于Hadoop平台,核心库中某些非分布式的算法也具有很好的性能。Mahout的目标是帮助开发人员快速创建具有机器智能的应用程序。
Mahout现在已经包含了聚类、分类、推荐引擎(协同过滤)和频繁集挖掘等广泛使用的数据挖掘方法。除了算法,Mahout还包含数据的输入输出工具、与其他存储系统(如数据库、MongoDB 或Cassandra)集成等数据挖掘支持架构。
3.2.9Flume日志收集工具
Flume是Cloudera提供的一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的工具,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接收方(可定制)的能力。
Flume的3个核心组件是Source、Channel和Sink。Source 用于采集数据,Source是产生数据流的地方,同时Source会将产生的数据流传输到Channel,这个有点类似于Java I/O部分的Channel。Channel用于桥接Source和Sink,类似于一个队列。Sink从Channel收集数据,将数据写到目标源(可以是下一个Source,也可以是HDFS或者HBase)。
Flume数据传输的基本单元Event以事件的形式将数据从源头送至目的地。
Flume的传输过程: Source监控某个文件,文件产生新的数据,拿到该数据后,将数据封装在一个Event中,并放到Channel中进行提交,然后Sink从Channel队列中拉取数据,然后写入HDFS或者HBase中。
3.2.10Oozie作业流调度系统
Oozie是一个管理Hadoop作业、可伸缩、可扩展和可靠的工作流调度系统,它内部定义了3种作业: Workflow工作流作业,由一系列动作构成的有向无环图(Directed Acyclic Graph,DAG);Coordinator协调器作业,按时间频率周期性触发Oozie工作流的作业;Bundle作业,管理协调器作业。
简单来说,Workflow是对要进行的顺序化工作的抽象,Coordinator是对要进行的顺序化的Workflow的抽象,Bundle是对一堆Coordinator的抽象。
3.2.11Spark分布式内存计算
Spark是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP Lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架。Spark拥有Hadoop MapReduce所具有的优点,但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS。因此,Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
Spark是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
尽管创建Spark是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在Hadoop文件系统中并行运行。通过名为Mesos的第三方集群框架可以支持此行为。Spark可用来构建大型的、低延迟的数据分析应用程序。
3.2.12Tez有向无环图计算
Hadoop的MapReduce计算模型将计算过程抽象成Map和Reduce两个阶段,并通过Shuffle机制将两个阶段连接起来。但在一些应用场景中,为了套用MapReduce模型解决问题,不得不将问题分解成若干个有依赖关系的子问题,每个子问题对应一个MapReduce作业,最终所有这些作业形成一个有向无环图。在该DAG中,由于每个节点是一个MapReduce作业,因此它们均会从HDFS上读一次数据和写一次数据(默认写3份),即使中间节点产生的数据仅是临时数据。很显然,这种计算方式是低效的,会产生大量不必要的磁盘和网络I/O。
为了更高效地运行存在依赖关系的作业(例如Pig和Hive产生的MapReduce作业),减少磁盘和网络I/O,Hortonworks开发并开源了DAG计算框架Tez。
Tez源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分。Map被拆分成Input、Processor、Sort、Merge和Output,Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,通过灵活组合这些分解后的操作来产生新的操作,这些新的操作经过一些控制程序组装后,可形成一个大的DAG作业。
Tez提供了一套富有表现力的数据流定义API,通过该API用户能够描述他们所要运行计算的有向无环图。相比于使用多个MapReduce任务,Tez数据流定义API通过使用MRR模式,即一个单独的Map就可以有多个Reduce阶段,这样数据流可以在不同的处理器之间流转,不需要把任何内容写入HDFS(将会被写入磁盘,但这仅仅是为了设置检查点),与之前相比这种方式性能提升显著。
3.2.13Storm流数据处理
数据有静态数据和流数据。企业为了支持决策分析而构建的数据仓库系统,其中存放的大量历史数据是静态数据。技术人员可以利用数据挖掘和联机分析处理工具从静态数据中找到对企业有价值的信息。
流数据是一组顺序、大量、快速和连续到达的数据序列,流数据可被视为一个随时间延续而无限增长的动态数据集合。流数据的4个特点: 数据实时到达;数据到达次序独立,不受应用系统控制;数据规模宏大且不能预知其最大值;数据一经处理,除非特意保存,否则不能被再次取出处理,或者再次提取数据代价昂贵。流输出处理广泛应用于网络监控、传感器网络、航空航天、气象测控和金融服务等领域。
流式处理(Stream Processing)是针对批处理(Batch Processing)来讲的,即它们是两种截然不同的数据处理模式,具有不同的应用场合和不同的特点。
(1) 批处理适用于大数据处理的场合。需要等到整个分析处理任务完成,才能获得最终结果。整个过程耗时比较长,获得最终分析处理结果延迟较大。
(2) 流式数据处理模式强调数据处理的速度,主要原因在于流数据产生的速度很快,需要及时处理掉。流式处理系统能对新到达的数据进行及时处理,所以它能够给决策者提供最新的事物发展变化的趋势,以便对突发事件进行及时响应,调整应对措施。
3.3Hadoop的安装与使用3.3.1安装Hadoop前的准备工作本教程使用在虚拟机上安装的Ubuntu16.04 64位作为安装Hadoop的Linux系统环境,安装的Hadoop版本号是Hadoop 2.7.1。在安装Hadoop之前需要做一些准备工作: 创建Hadoop用户、更新APT、安装SSH和安装Java环境等。
1. 创建hadoop用户
如果安装Ubuntu时不是用的hadoop用户,那么需要增加一个名为hadoop的用户,这样做是为了方便后续软件的安装。
首先打开一个终端(可以使用Ctrl+Alt+t组合键),输入如下命令创建hadoop用户: sudo useradd -m hadoop -s /bin/bash这条命令创建了可以登录的hadoop用户,并使用/bin/bash作为Shell。
sudo是Linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt、reboot和su等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。当使用sudo命令时,就需要输入当前使用用户的密码。
接着使用如下命令为hadoop用户设置登录密码,可简单地将密码设置为hadoop,以方便记忆,按提示输入两次密码: sudo passwd hadoop可为hadoop用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题,命令如下: sudo adduser hadoop sudo最后使用su hadoop 切换到用户hadoop,或者注销当前用户,选择hadoop登录。
2. 更新apt软件
切换到hadoop用户后,先更新apt软件,后续会使用apt安装软件,如果没更新可能有一些软件安装不了,执行如下命令: sudo apt-get update3. 安装SSH、配置SSH无密码登录
SSH为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH为建立在应用层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH是由客户端和服务端的软件组成,它在后台运行并响应来自客户端的连接请求,客户端包含ssh程序以及像scp(远程复制)、slogin(远程登录)和sftp(安全文件传输)等其他应用程序。SSH的工作机制大致是本地的客户端发送一个连接请求到远程的服务端,服务端检查申请的包和IP地址再发送密钥给SSH的客户端,本地再将密钥发回给服务端,自此连接建立。
Hadoop的名称节点(NameNode)需要通过SSH来启动Slave列表中各台主机的守护进程。由于SSH需要用户密码登录,但Hadoop并没有提供SSH输入密码登录的形式,因此,为了能够在系统运行中完成节点的免密码登录和访问,需要将Slave列表中各台主机配置为名称节点免密码登录它们。配置SSH的主要工作是创建一个认证文件,使得用户以public key方式登录,而不用手工输入密码。Ubuntu默认已安装了SSH client,此外还需要安装SSH server: sudo apt-get install openssh-server安装后,可以使用如下命令登录本机: ssh localhost此时会有登录提示,要求用户输入yes以便确认进行连接。输入yes,然后按提示输入密码hadoop,这样就可以登录到本机。但这样登录是需要每次输入密码的,下面将其配置成SSH无密码登录,配置步骤如下:
1) 执行如下命令生成密钥对cd ~/.ssh/ #若没有该目录,要先执行一次ssh localhost
ssh-keygen -t rsa #生成密钥对,会有提示,都按Enter键即可2) 加入授权cat ./id_rsa.pub >> ./authorized_keys #加入授权此时,再执行ssh localhost命令,不用输入密码就可以直接登录了。
4. 安装Java环境
(1) 下载JDK: jdk8u181linuxx64.tar.gz。
(2) 将JDK解压到 /opt/jvm/文件夹中。
操作步骤: $ sudo mkdir /opt/jvm #创建目录
$ sudo tar -zxvf/home/hadoop/下载/jdk-8u181-linux-x64.tar.gz -C /opt/jvm(3) 配置JDK的环境变量,打开/etc/profile文件(sudo vim /etc/profile),在文件末尾添加如下语句: export JAVA_HOME=/opt/jvm/jdk1.8.0_181
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH保存后退出,执行如下命令使其立即生效: $ source /etc/profile查看是否安装成功: 在终端执行java version,出现如图33所示的界面说明JDK安装成功。
图33执行java version的结果
3.3.2下载Hadoop安装文件
Hadoop2可以通过http://mirrors.cnnic.cn/apache/hadoop/common/下载,一般选择下载最新的稳定版本,即下载stable下的hadoop2.x.y.tar.gz这个格式的文件,这是编译好的,另一个包含src的则是Hadoop源代码,需要进行编译才可使用。
若Ubuntu系统使用虚拟机的方式安装,则使用虚拟机中的Ubuntu自带Firefox浏览器在网站中选择hadoop2.7.1.tar.gz下载,就能把Hadoop文件下载到虚拟机Ubuntu中。火狐浏览器默认会把下载文件都保存到当前用户的下载目录,即会保存到“/home/当前登录用户名/下载/”目录下。
下载安装文件之后,需要对文件进行解压。按照Linux系统使用的默认规范,用户安装的软件一般都是存放在/usr/local目录下。使用hadoop用户登录Linux系统,打开一个终端执行如下命令: sudo tar -zxf ~/下载/hadoop-2.7.1.tar.gz -C /usr/local#解压到/usr/local目录中
cd /usr/local/
sudo mv ./hadoop-2.7.1/ ./hadoop#将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop #修改文件权限其中,“~/”表示的是/home/ hadoop/这个目录。
Hadoop解压后即可使用。输入如下命令来检查Hadoop是否可用,成功则会显示Hadoop版本信息: cd /usr/local/hadoop
./bin/hadoop version相对路径与绝对路径: 本文后续出现的./bin/和./etc/等包含“./”的路径,均为相对路径,以/usr/local/hadoop为当前目录。例如在/usr/local/hadoop目录中执行./bin/hadoop version等同于执行/usr/local/hadoop/bin/hadoop version。
3.3.3Hadoop单机模式配置
Hadoop默认的模式为非分布式模式(独立、本地),解压后无须进行其他配置就可运行,非分布式即单Java进程。Hadoop单机模式只在一台机器上运行,存储采用本地文件系统,而不是分布式文件系统。无需任何守护进程(Daemon),所有的程序都在单个JVM上执行。在单机模式下调试MapReduce程序非常高效方便,这种模式适宜用在开发阶段。
Hadoop不会启动NameNode、DataNode、JobTracker和TaskTracker等守护进程,Map()和Reduce()任务作为同一个进程的不同部分来执行。
Hadoop附带了丰富的例子,运行如下命令可以查看所有的例子: cd /usr/local/hadoop
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1
.jar上述命令执行后,会显示所有例子的简介信息,包括wordcount、terasort、join和grep等。这里选择运行单词计数wordcount例子,单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为 MapReduce版Hello World,单词计数主要完成的功能是统计一系列文本文件中每个单词出现的次数。可以先在/usr/local/hadoop目录下创建一个文件夹input,并复制一些文件到该文件夹下;然后运行wordcount程序,将input文件夹中的所有文件作为wordcount的输入;最后把统计结果输出到/usr/local/hadoop/output文件夹中。完成上述操作的具体命令如下: cd /usr/local/hadoop
mkdir input #创建文件夹
cp ./etc/hadoop/.xml ./input #将配置文件复制到input目录下
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-.jar wordcount ./input ./output
cat ./output/ #查看运行结果注意: Hadoop默认不会覆盖结果文件,因此,再次运行上面实例会提示出错。如果要再次运行,需要先使用如下命令把output文件夹删除: rm -r ./output3.3.4Hadoop伪分布式模式配置
Hadoop可以在单个节点(一台机器)上以伪分布式的方式运行,同一个节点既作为名称节点(NameNode),也作为数据节点(DataNode),读取的是HDFS的文件。
1. 修改配置文件
需要配置相关文件,才能够使Hadoop在伪分布式模式下运行。Hadoop的配置文件位于/usr/local/hadoop/etc/hadoop/中,进行伪分布式模式配置时,需要修改两个配置文件,即coresite.xml和hdfssite.xml。
可以使用vim编辑器打开coresite.xml文件: vim /usr/local/hadoop/etc/hadoop/core-site.xmlcoresite.xml文件的初始内容如下:
修改以后,coresite.xml文件的内容如下:
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
fs.defaultFS
hdfs://localhost:9000
在上面的配置文件中,hadoop.tmp.dir用于保存临时文件。fs.defaultFS这个参数,用于指定HDFS的访问地址,其中9000是端口号。
同样,需要修改配置文件hdfssite.xml,修改后的内容如下:
dfs.replication
1
dfs.namenode.name.dir
file:/usr/local/hadoop/tmp/dfs/name
dfs.datanode.data.dir
file:/usr/local/hadoop/tmp/dfs/data
在hdfssite.xml文件中,dfs.replication这个参数用于指定副本的数量,这是因为HDFS出于可靠性和可用性方面的考虑,冗余存储多份,以便发生故障时仍能正常执行。但由于这里采用伪分布式模式,总共只有一个节点,所以,只可能有一个副本,因此设置dfs.replication的值为1。dfs.namenode.name.dir用于设定名称节点的元数据的保存目录,dfs.datanode.data.dir用于设定数据节点的数据保存目录。
注意: Hadoop的运行方式(如运行在单机模式下还是运行在伪分布式模式下)是由配置文件决定的,启动Hadoop时会读取配置文件,然后根据配置文件来决定运行在什么模式下。因此,如果需要从伪分布式模式切换回单机模式,只需要删除coresite.xml中的配置项即可。
2. 执行名称节点格式化
修改配置文件以后,要执行名称节点的格式化,命令如下: cd /usr/local/hadoop
./bin/hdfs namenode -format3. 启动Hadoop
执行下面命令启动Hadoop: cd /usr/local/hadoop
./sbin/start-dfs.sh4. 使用Web页面查看HDFS信息
Hadoop成功启动后,可以在Linux系统中打开一个浏览器,在地址栏输入http://localhost: 50070就可以查看名称节点和数据节点信息,如图34所示,还可以在线查看HDFS中的文件。
图34使用Web页面查看HDFS信息
5. 运行Hadoop伪分布式实例
要使用HDFS,首先需要在HDFS中创建用户目录,命令如下: cd /usr/local/hadoop
./bin/hdfs dfs -mkdir -p /user/hadoop接着需要把本地文件系统的/usr/local/hadoop/etc/hadoop目录中的所有xml文件作为输入文件,复制到分布式文件系统HDFS中的/user/hadoop/input目录中,命令如下: cd /usr/local/hadoop
./bin/hdfs dfs -mkdir input#在HDFS中创建hadoop用户对应的input目录
./bin/hdfs dfs -put ./etc/hadoop/.xml input#把本地文件复制到input目录中现在可以运行Hadoop中自带的WordCount程序,命令如下: ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-.jar wordcount input output运行结束后,可以通过如下命令查看HDFS中output文件夹中的内容: ./bin/hdfs dfs -cat output/需要强调的是,Hadoop运行程序时,输出目录不能存在,否则会提示错误信息。因此,若要再次执行wordcount程序,需要执行如下命令删除HDFS中的output文件夹: ./bin/hdfs dfs -rm -r output# 删除 output 文件夹6. 关闭Hadoop
如果要关闭Hadoop,可以执行如下命令: cd /usr/local/hadoop
./sbin/stop-dfs.sh7. 配置PATH变量
前面在启动Hadoop时,都是先进入/usr/local/hadoop目录中,再执行./sbin/startdfs.sh,实际上等同于运行/usr/local/hadoop/sbin/startdfs.sh。实际上,通过设置PATH变量,可以在执行命令时,不用带上命令本身所在的路径。例如,打开一个Linux终端,在任何一个目录下执行ls命令时,都没有带上ls命令的路径,实际上,执行ls命令时,是执行/bin/ls这个程序,之所以不需要带上路径,是因为Linux系统已经把ls命令的路径加入到PATH变量中,当执行ls命令时,系统是根据PATH这个环节变量中包含的目录位置,逐一进行查找,直至在这些目录位置下找到匹配的ls程序(若没有匹配的程序,则系统会提示该命令不存在)。
同样可以把startdfs.sh、stopdfs.sh等命令所在的目录/usr/local/hadoop/sbin加入到环境变量PATH中,这样,以后在任何目录下都可以直接使用命令startdfs.sh启动Hadoop,不用带上命令路径。具体操作方法是,首先使用vim编辑器打开~/.bashrc这个文件,然后在这个文件的最前面位置加入如下单独一行: export PATH=$PATH:/usr/local/hadoop/sbin如果要继续把其他命令的路径也加入到PATH变量中,就需要修改~/.bashrc这个文件,在上述路径的后面用英文冒号隔开,把新的路径加到后面即可。
添加后,执行命令source ~/.bashrc使设置生效。然后在任何目录下只要直接输入startdfs.sh就可启动Hadoop。停止Hadoop只要输入stopdfs.sh命令即可。
3.3.5Hadoop分布式模式配置
考虑机器的性能,本书简单使用两个虚拟机来搭建分布式集群环境: 一个虚拟机作为Master节点,另一个虚拟机作为Slave1节点。由3个及以上节点构建分布式集群,也可以采用类似的方法完成安装部署。
Hadoop集群的安装配置大致包括以下步骤。
(1) 在Master节点上创建hadoop用户,安装SSH服务端,安装Java环境。
(2) 在Master节点上安装Hadoop,并完成配置。
(3) 在Slave1节点上创建hadoop用户,安装SSH服务端,安装Java环境。
(4) 把Master节点上的/usr/local/hadoop目录复制到Slave1节点上。
(5) 在Master节点上开启Hadoop。
根据前面讲述的内容完成步骤(1)~(3),然后,继续下面的操作。
1. 网络配置
由于本分布式集群搭建是在两个虚拟机上进行,需要将两个虚拟机的网络连接方式都改为“桥接网卡”模式,如图35所示,以实现两个节点的互连。一定要确保各个节点的MAC地址不能相同,否则会出现IP地址冲突。
图35网络连接方式设置
网络配置完成以后,通过ifconfig命令查看两个虚拟机的IP地址,本书所用的Master节点的IP地址为192.168.0.115,所用的Slave1节点的IP地址为192.168.0.114。
在Master节点上执行如下命令修改Master节点中的/etc/hosts文件: # vim /etc/hosts在hosts文件中增加如下两条IP地址和主机名映射关系,即集群中两个节点与IP地址的映射关系:192.168.0.115 Master
192.168.0.114 Slave1需要注意的是,hosts文件中只能有一个127.0.0.1,其对应的主机名为localhost,如果有多余127.0.0.1映射,应删除。修改后需要重启Linux系统。
参照Master节点的配置方法,修改Slave1节点中的/etc/hosts文件,在hosts文件中增加如下两条IP地址和主机名映射关系: 192.168.0.115 Master
192.168.0.114 Slave1修改完成以后,重启Slave1的Linux系统。
这样就完成了Master节点和Slave节点的配置,然后需要在两个节点上测试是否相互ping得通,如果ping不通,后面就无法顺利配置成功。$ ping Slave1 -c 3#在Master上ping 3次Slave1,否则要按Ctrl+C中断ping命令
$ ping Master -c 3#在Slave1上ping 3次Master如在Master节点上ping 3次Slave1,如果ping通的话,会显示下述信息: PING Slave1 (192.168.0.114) 56(84) bytes of data.
64 bytes from Slave1 (192.168.0.114): icmp_seq=1 ttl=64 time=1.78 ms
64 bytes from Slave1 (192.168.0.114): icmp_seq=2 ttl=64 time=0.634 ms
64 bytes from Slave1 (192.168.0.114): icmp_seq=3 ttl=64 time=0.244 ms
--- Slave1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2018ms
rtt min/avg/max/mdev = 0.244/0.887/1.785/0.655 ms2. SSH无密码登录Slave1节点
必须要让Master节点可以SSH无密码登录Slave1节点。首先,生成Master节点的公钥,具体命令如下: $ cd ~/.ssh
$ rm ./id_rsa #删除之前生成的公钥(如果已经存在)
$ ssh-keygen -t rsa #Master生成公钥,执行后,遇到提示信息,一直按Enter键就可以Master节点生成公钥的界面如图36所示。
图36Master节点生成公钥的界面
为了让Master节点能够无密码SSH登录本机,需要在Master节点上执行如下命令: $ cat ./id_rsa.pub >> ./authorized_keys执行上述命令后,可以执行命令ssh Master来验证一下,遇到提示信息,输入yes即可,测试成功的界面如图37所示,执行exit命令返回原来的终端。
图37ssh Master测试成功的界面
接下来在Master节点将上述生成的公钥传输到Slave1节点: $ scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/上面的命令中,scp是secure copy的简写,用于在Linux上进行远程复制文件。执行scp时会要求输入Slave1上hadoop用户的密码,输入完成后会提示传输完毕,执行过程如下:hadoop@Master:~/.ssh$ scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
hadoop@Slave1's password:
id_rsa.pub100%395 0.4KB/s 00:00接着在Slave1节点上将SSH公钥加入授权: hadoop@Slave1:~$ mkdir ~/.ssh#若~/.ssh不存在,可通过该命令进行创建
hadoop@Slave1:~$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys执行上述命令后,在Master节点上就可以无密码SSH登录到Slave1节点了,可在Master节点上执行如下命令进行检验: $ ssh Slave1执行ssh Slave1命令的效果如图38所示。
图38执行ssh Slave1命令的效果3. 配置PATH变量
在Master节点上配置PATH变量,以便在任意目录中可直接使用hadoop和hdfs等命令。执行vim ~/.bashrc命令,打开~/.bashrc文件,在该文件最上面的位置加入下面一行内容,注意之后要加上“: ”:export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin保存后执行命令source ~/.bashrc使配置生效。
4. 配置分布式环境
配置分布式环境时,需要修改/usr/local/hadoop/etc/hadoop目录下的5个配置文件,具体包括slaves、coresite.xml、hdfssite.xml、mapredsite.xml和yarnsite.xml。
1) 修改slaves文件
需要把所有数据节点的主机名写入该文件,每行一个,默认为localhost(即把本机作为数据节点)。所以,在伪分布式配置时,就采用了这种默认的配置,使得节点既作为名称节点又作为数据节点。在进行分布式配置时,可以保留localhost,让Master节点既充当名称节点又充当数据节点,或者删除localhost这一行,让Master节点仅作为名称节点使用。执行vim/usr/local/hadoop/etc/hadoop/slaves命令,打开/usr/local/hadoop/etc/hadoop/slaves文件,由于只有一个Slave节点Slave1,本书让Master节点既充当名称节点又充当数据节点,因此,在文件中添加如下两行内容: localhost
Slave12) 修改coresite.xml文件
coresite.xml文件用来配置Hadoop集群的通用属性,包括指定namenode的地址和指定使用Hadoop临时文件的存放路径等。把coresite.xml文件修改为如下内容:
fs.defaultFS
hdfs://Master:9000
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
3) 修改hdfssite.xml文件
hdfssite.xml文件用来配置HDFS的属性,包括指定HDFS保存数据的副本数量,指定HDFS中NameNode的存储位置,指定HDFS中DataNode的存储位置等。本书让Master节点既充当名称节点又充当数据节点,此外还有一个Slave节点Slave1,即集群中有两个数据节点,所以dfs.replication的值设置为2。hdfssite.xml的具体内容如下:
dfs.namenode.secondary.http-address
Master:50090
dfs.replication
2
dfs.namenode.name.dir
file:/usr/local/hadoop/tmp/dfs/name
dfs.datanode.data.dir
file:/usr/local/hadoop/tmp/dfs/data
4) 修改mapredsite.xml文件
/usr/local/hadoop/etc/hadoop目录下有一个mapredsite.xml.template文件,需要修改文件名称,把它重命名为mapredsite.xml: $ cd /usr/local/hadoop/etc/hadoop
$ mv mapred-site.xml.template mapred-site.xml
$ vim mapred-site.xml#打开mapred-site.xml文件然后把mapredsite.xml文件配置成如下内容:
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
Master:10020
mapreduce.jobhistory.webapp.address
Master:19888