第3章〓Hadoop的安装和使用Hadoop是一个开源的、可运行于大规模集群上的分布式计算平台,它主要包含分布式并行编程模型MapReduce和分布式文件系统HDFS等功能,已经在业内得到广泛的应用。借助于Hadoop,程序员可以轻松地编写分布式并行程序,将其运行于计算机集群上,完成海量数据的存储与处理分析。 本章首先简要介绍Hadoop的发展情况;其次,阐述安装Hadoop之前的一些必要准备工作;最后,介绍安装Hadoop的具体方法,包括单机模式、伪分布式模式以及分布式模式。 3.1Hadoop简介 Apache Hadoop版本分为3代,分别是Hadoop 1.0、Hadoop 2.0和Hadoop 3.0。第一代Hadoop包含0.20.x、0.21.x和0.22.x三大版本,其中,0.20.x最后演化成1.0.x,变成了稳定版,而0.21.x和0.22.x则增加了HDFS HA等重要的新特性。第二代Hadoop包含0.23.x和2.x两大版本,它们完全不同于Hadoop 1.0,是一套全新的架构,均包含HDFS Federation和YARN(Yet Another Resource Negotiator)两个系统。Hadoop 2.0是基于JDK 1.7开发的,而JDK 1.7在2015年4月已停止更新,于是Hadoop社区基于JDK1.8重新发布一个新的Hadoop版本,即Hadoop 3.0。因此,到了Hadoop 3.0以后,JDK版本的最低依赖从1.7变成了1.8。Hadoop 3.0中引入了一些重要的功能和优化,包括HDFS可擦除编码、多名称节点支持、任务级别的MapReduce本地优化、基于cgroup的内存和磁盘I/O隔离等。本书采用Hadoop 3.1.3。 除了免费开源的Apache Hadoop以外,还有一些商业公司推出Hadoop发行版。2008年,Cloudera成为第一个Hadoop商业化公司,并在2009年推出第一个Hadoop发行版。此后,很多大公司也加入了做Hadoop产品化的行列,如MapR、Hortonworks、星环等。2018年10月,Cloudera和Hortonworks宣布合并。一般而言,商业化公司推出的Hadoop发行版,也是以Apache Hadoop为基础,但是,前者比后者具有更好的易用性、更多的功能以及更高的性能。 3.2安装Hadoop前的准备工作 本节介绍安装Hadoop前的一些准备工作,包括创建hadoop用户、更新APT、安装SSH和安装Java环境等。大数据基础编程、实验和案例教程(第2版)第3章Hadoop的安装和使用3.2.1创建hadoop用户 本书全部采用hadoop用户登录Linux系统,并为hadoop用户增加了管理员权限。在第2章已经介绍了hadoop用户创建和增加权限的方法,一定要按照该方法先创建hadoop用户,并且使用hadoop用户登录Linux系统,然后再开始下面的学习。 3.2.2更新APT 第2章介绍了APT软件作用和更新方法,为了确保Hadoop安装过程顺利进行,建议按照第2章介绍的方法,用hadoop用户登录Linux系统后打开一个终端,执行下面命令更新APT软件:$ sudo apt-get update3.2.3安装SSH SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH由客户端和服务端的软件组成: 服务端是一个守护进程,它在后台运行并响应来自客户端的连接请求;客户端包含ssh程序以及像scp(远程复制)、slogin(远程登录)、sftp(安全文件传输)等其他的应用程序。 为什么在安装Hadoop之前要配置SSH呢?这是因为,Hadoop名称节点(NameNode)需要启动集群中所有机器的Hadoop守护进程,这个过程需要通过SSH登录来实现。Hadoop并没有提供SSH输入密码登录的形式,因此,为了能够顺利登录集群中的每台机器,需要将所有机器配置为“名称节点可以无密码登录它们”。 Ubuntu默认已安装了SSH客户端,因此,还需要安装SSH服务端,在Linux的终端中执行以下命令:$ sudo apt-get install openssh-server安装后,可以使用如下命令登录本机:$ ssh localhost执行该命令后会出现如图31所示的提示信息(SSH首次登录提示),输入yes,然后按提示输入密码hadoop,就登录到本机了。 图31SSH首次登录提示信息 这里在理解上会有一点“绕弯”。也就是说,原本登录Linux系统以后,就是在本机上,这时,在终端中输入的每条命令都是直接提交给本机去执行,然后,又在本机上使用SSH方式登录到本机,这时,在终端中输入的命令,是通过SSH方式提交给本机处理。如果换成包含两台独立计算机的场景,SSH登录会更容易理解。例如,有两台计算机A和B都安装了Linux系统,计算机B上安装了SSH服务端,计算机A上安装了SSH客户端,计算机B的IP地址是59.77.16.33,在计算机A上执行命令ssh 59.77.16.33,就实现了通过SSH方式登录计算机B上面的Linux系统,在计算机A的Linux终端中输入的命令,都会提交给计算机B上的Linux系统执行,即在计算机A上操作计算机B中的Linux系统。现在,只有一台计算机,就相当于计算机A和B都在同一台机器上,所以,理解起来就会有点“绕弯”。 由于这样登录需要每次输入密码,所以,需要配置成SSH无密码登录会比较方便。在Hadoop集群中,名称节点要登录某台机器(数据节点)时,也不可能人工输入密码,所以,也需要设置成SSH无密码登录。 首先输入命令exit退出刚才的SSH,就回到了原先的终端窗口;然后可以利用sshkeygen生成密钥,并将密钥加入授权中,命令如下:$ cd ~/.ssh/#若没有该目录,先执行一次ssh localhost $ ssh-keygen -t rsa#会有提示,按Enter键即可 $ cat ./id_rsa.pub >>./authorized_keys#加入授权此时,再执行ssh localhost命令,无须输入密码就可以直接登录了,如图32所示。 图32SSH登录后的提示信息 3.2.4安装Java环境 由于Hadoop本身是使用Java语言编写的,因此,Hadoop的开发和运行都需要Java的支持,对于Hadoop 3.1.3而言,要求使用JDK 1.8或者更新的版本。 访问Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads)下载JDK 1.8安装包,也可以访问本书官网,进入“下载专区”,在“软件”目录下找到文件jdk8u162linuxx64.tar.gz下载到本地。这里假设下载得到的JDK安装文件保存在Ubuntu系统的/home/hadoop/Downloads/目录下。 执行如下命令创建/usr/lib/jvm目录用来存放JDK文件:$cd /usr/lib $sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件执行如下命令对安装文件进行解压缩: $cd ~ #进入hadoop用户的主目录 $cd Downloads $sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm下面继续执行如下命令,设置环境变量: $vim ~/.bashrc上面命令使用vim编辑器打开了hadoop这个用户的环境变量配置文件,在这个文件的开头添加如下几行内容: export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH保存.bashrc文件并退出vim编辑器。然后,可继续执行如下命令让.bashrc文件的配置立即生效: $source ~/.bashrc这时,可以使用如下命令查看是否安装成功: $java -version如果能够在屏幕上返回如下信息,则说明安装成功: java version "1.8.0_162" Java(TM) SE Runtime Environment (build 1.8.0_162-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)至此,就成功安装了Java环境。下面就可以进入Hadoop的安装。 3.3安装Hadoop Hadoop包括3种安装模式。 (1) 单机模式。只在一台机器上运行,存储采用本地文件系统,没有采用HDFS。 (2) 伪分布式模式。存储采用HDFS,但是,HDFS的名称节点和数据节点都在同一台机器上。 (3) 分布式模式。存储采用HDFS,而且,HDFS的名称节点和数据节点位于不同机器上。 本节介绍Hadoop的具体安装方法,包括下载安装文件、单机模式配置、伪分布式模式配置、分布式模式配置。 3.3.1下载安装文件 本书采用的Hadoop版本是3.1.3,可以到Hadoop官网(http://mirrors.cnnic.cn/apache/hadoop/common/)下载安装文件,也可以到本书官网的“下载专区”中下载安装文件,进入“下载专区”后,在“软件”目录下找到文件hadoop3.1.3.tar.gz,下载到本地。下载的方法是,在Linux系统中(不是在Windows系统中),打开浏览器,一般自带了火狐(FireFox)浏览器。打开浏览器后,访问本书官网,下载hadoop3.1.3.tar.gz。火狐浏览器默认会把下载文件都保存到当前用户的下载目录,由于本书全部采用hadoop用户登录Linux系统,所以,hadoop3.1.3.tar.gz文件会被保存到“/home/hadoop/下载/”目录下。 需要注意的是,如果是在Windows系统下载安装文件hadoop3.1.3.tar.gz,则需要通过FTP软件上传到Linux系统的“/home/hadoop/下载/”目录下,这个目录是本书所有安装文件的中转站。 下载完安装文件后,需要对文件进行解压。按照Linux系统使用的默认规范,用户安装的软件一般都是存放在/usr/local/目录下。使用hadoop用户登录Linux系统,打开一个终端,执行如下命令:$ sudo tar -zxf ~/下载/hadoop-3.1.3.tar.gz -C /usr/local# 解压到/usr/local目录中 $cd /usr/local/ $ sudo mv ./hadoop-3.1.3/ ./hadoop#将文件夹名改为hadoop $ sudo chown -R hadoop ./hadoop #修改文件权限Hadoop解压后即可使用,可以输入如下命令来检查 Hadoop是否可用,成功则会显示 Hadoop版本信息:$cd /usr/local/hadoop $./bin/hadoop version3.3.2单机模式配置 Hadoop的默认模式为本地模式(非分布式模式),无须进行其他配置即可运行。Hadoop附带了丰富的例子,运行如下命令可以查看所有例子:$ cd /usr/local/hadoop $ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar上述命令执行后,会显示所有例子的简介信息,包括grep、join、wordcount等。这里选择运行grep例子,可以先在/usr/local/hadoop目录下创建一个文件夹input,并复制一些文件到该文件夹下;然后,运行grep程序,将 input文件夹中的所有文件作为grep的输入,让grep程序从所有文件中筛选出符合正则表达式“dfs[az.]+”的单词,并统计单词出现的次数;最后,把统计结果输出到/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-3.1.3.jar grep ./input ./output 'dfs[a-z.]+' $ cat ./output/#查看运行结果执行成功后结果如图33所示,输出了作业的相关信息,输出的结果是符合正则表达式的单词dfsadmin出现了1次。 图33grep程序运行结果 需要注意的是,Hadoop默认不会覆盖结果文件,因此,再次运行上面实例会提示出错。如果要再次运行,需要先使用如下命令把output文件夹删除:$rm -r ./output3.3.3伪分布式模式配置 Hadoop可以在单个节点(一台机器)上以伪分布式的方式运行,同一个节点既作为名称节点(NameNode),也作为数据节点(DataNode),读取的是HDFS中的文件。 1. 修改配置文件 需要配置相关文件,才能够让Hadoop在伪分布式模式下顺利运行。Hadoop的配置文件位于/usr/local/hadoop/etc/hadoop/目录下,进行伪分布式模式配置时,需要修改两个配置文件,即coresite.xml和hdfssite.xml。 可以使用vim编辑器打开coresite.xml文件,它的初始内容如下: 修改以后,coresite.xml文件的内容如下: hadoop.tmp.dir file:/usr/local/hadoop/tmp Abase for other temporary directories. fs.defaultFS hdfs://localhost:9000 在上面的配置文件中,hadoop.tmp.dir用于保存临时文件,若没有配置hadoop.tmp.dir这个参数,则默认使用的临时目录为/tmp/hadoohadoop,而这个目录在Hadoop重启时有可能被系统清理掉,导致一些意想不到的问题,因此,必须配置这个参数。fs.defaultFS这个参数用于指定HDFS的访问地址,其中,9000是端口号。 同样,需要修改配置文件hdfssite.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 在hdfssite.xml文件中,dfs.replication这个参数用于指定副本的数量,因为,在HDFS中,数据会被冗余存储多份,以保证可靠性和可用性。但是,由于这里采用伪分布式模式,只有一个节点,所以,只可能有一个副本,设置dfs.replication的值为1。dfs.namenode.name.dir用于设定名称节点的元数据的保存目录,dfs.datanode.data.dir用于设定数据节点的数据的保存目录,这两个参数必须设定,否则后面会出错。 配置文件coresite.xml和hdfssite.xml的内容,也可以直接到本书官网的“下载专区”下载,位于“代码”目录下的“第3章”子目录下的“伪分布式”子目录中。 需要指出的是,Hadoop的运行方式(如运行在单机模式下还是运行在伪分布式模式下)是由配置文件决定的,启动Hadoop时会读取配置文件,然后根据配置文件来决定运行在什么模式下。因此,如果需要从伪分布式模式切换回单机模式,只需要删除 coresite.xml中的配置项即可。 2. 执行名称节点格式化 修改配置文件以后,要执行名称节点的格式化,命令如下:$ cd /usr/local/hadoop $./bin/hdfs namenode -format如果格式化成功,会看到successfully formatted的提示信息(见图34)。 图34执行名称节点格式化后的提示信息 如果在执行这一步时提示错误信息“Error: JAVA_HOME is not set and could not be found”,则说明之前设置JAVA_HOME环境变量时,没有设置成功,要按前面的内容介绍先设置好 JAVA_HOME变量,否则,后面的过程都无法顺利进行。 3. 启动Hadoop 执行下面命令启动Hadoop:$ cd /usr/local/hadoop $ ./sbin/start-dfs.sh#start-dfs.sh是一个完整的可执行文件,中间没有空格如果出现如图35所示的SSH提示,输入yes即可: 图35启动Hadoop后的提示信息 启动时可能出现如下警告信息:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN这个警告提示信息可以忽略,并不会影响Hadoop正常使用。 如果启动 Hadoop时遇到输出非常多“ssh: Could not resolve hostname xxx”的异常情况,如图36所示。 图36Hadoop启动后的错误提示信息 这并不是SSH的问题,可以通过设置Hadoop环境变量来解决。首先,按Ctrl+C键中断启动过程;然后,使用vim编辑器打开文件~/.bashrc,在文件最上边的开始位置增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中,HADOOP_HOME 为 Hadoop的安装目录):export HADOOP_HOME=/usr/local/hadoop export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native保存该文件以后,务必先执行命令source ~/.bashrc使变量设置生效;然后,再次执行命令./sbin/startdfs.sh启动Hadoop。 Hadoop启动完成后,可以通过命令jps判断是否成功启动,命令如下:$ jps若成功启动,则会列出进程NameNode、DataNode和SecondaryNameNode。如果看不到SecondaryNameNode进程,先运行命令./sbin/stopdfs.sh关闭Hadoop相关进程;然后再次尝试启动。如果看不到NameNode或DataNode进程,则表示配置不成功,仔细检查之前的步骤,或通过查看启动日志排查原因。 通过startdfs.sh命令启动Hadoop以后,就可以运行MapReduce程序处理数据,此时是对HDFS进行数据读写,而不是对本地文件进行数据读写。 4. Hadoop无法正常启动的解决方法 一般可以通过查看启动日志来排查原因。启动时屏幕上会显示类似如下信息:DBLab-XMU: starting namenode, logging to /usr/local/hadoop/logs/hadoop- hadoop-namenode-DBLab-XMU.out其中,DBLabXMU对应的是机器名(你的机器名可能不是这个名称),不过,实际上启动日志信息记录在下面这个文件中:/usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log所以,应该查看后缀为.log的文件,而不是后缀.out的文件。此外,每次的启动日志都是追加到日志文件后,所以,需要拉到日志文件的最后面查看,根据日志记录的时间信息,就可以找到某次启动的日志信息。 当找到属于本次启动的一段日志信息以后,出错的提示信息一般会出现在最后面,通常是写着Fatal、Error、Warning或者Java Exception的地方。可以在网上搜索出错信息,寻找一些相关的解决方法。 如果执行jps命令后,找不到DataNode进程,则表示数据节点启动失败,可尝试如下的方法:$ ./sbin/stop-dfs.sh#关闭 $rm -r ./tmp # 删除 tmp 文件,注意: 这会删除 HDFS中原有的所有数据 $ ./bin/hdfs namenode -format #重新格式化名称节点 $ ./sbin/start-dfs.sh#重启注意: 这会删除 HDFS中原有的所有数据,如果原有的数据很重要,不要这样做,不过对于初学者而言,通常这时不会有重要数据。5. 使用Web界面查看HDFS信息 Hadoop成功启动后,可以在Linux系统中(不是Windows系统)打开一个浏览器,在地址栏输入地址http://localhost:9870(见图37)就可以查看名称节点和数据节点信息,还可以在线查看 HDFS 中的文件。 图37HDFS的Web管理界面6. 运行Hadoop伪分布式实例 在上面的单机模式中,grep例子读取的是本地数据,在伪分布式模式下,读取的则是HDFS上的数据。要使用HDFS,首先需要在HDFS中创建用户目录(本书全部统一采用hadoop用户名登录Linux系统),命令如下:$ cd /usr/local/hadoop $./bin/hdfs dfs -mkdir -p /user/hadoop上面的命令是HDFS的操作命令,会在第4章做详细介绍,目前只需要按照命令操作即可。 接着需要把本地文件系统的/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#把本地文件复制到HDFS中复制完成后,可以通过如下命令查看HDFS中的文件列表:$./bin/hdfs dfs -ls input执行上述命令以后,可以看到input目录下的文件信息。 现在就可以运行Hadoop自带的grep程序,命令如下:$./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'运行结束后,可以通过如下命令查看HDFS中的output文件夹中的内容:$./bin/hdfs dfs -cat output/执行结果如图38所示。 图38在Hadoop伪分布式模式下运行grep的结果 需要强调的是,Hadoop运行程序时,输出目录不能存在,否则会提示如下错误信息:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists因此,若要再次执行grep程序,需要执行如下命令删除HDFS中的output文件夹:$ ./bin/hdfs dfs -rm -r output#删除output文件夹7. 关闭Hadoop 如果要关闭Hadoop,可以执行下面命令:$ cd /usr/local/hadoop $./sbin/stop-dfs.sh下次启动Hadoop时,无须进行名称节点的初始化(否则会出错),也就是说,不要再次执行hdfs namenode format命令,每次启动Hadoop只需要直接运行startdfs.sh命令即可。 8. 配置PATH变量 前面在启动Hadoop时,都要加上命令的路径,例如,./sbin/startdfs.sh命令中就带上了路径,实际上,通过配置PATH变量,可以在执行命令时,不用带上命令本身所在的路径。例如,打开一个Linux终端,在任何一个目录下执行ls命令时,都没有带上ls命令的路径,实际上,执行ls命令时,是执行/bin/ls这个程序,之所以不需要带上路径,是因为Linux系统已经把ls命令的路径加入PATH变量中,当执行ls命令时,系统是根据PATH环境变量中包含的目录逐一进行查找,直至在这些目录下找到匹配的ls程序(若没有匹配的程序,则系统会提示该命令不存在)。 知道了这个原理以后,同样可以把startdfs.sh、stopdfs.sh等命令所在的目录/usr/local/hadoop/sbin,加入环境变量PATH中,这样,以后在任何目录下都可以直接使用命令startdfs.sh启动Hadoop,不用带上命令路径。具体操作方法是,首先使用vim编辑器打开~/.bashrc文件,然后在这个文件的最前面加入如下单独一行:export PATH=$PATH:/usr/local/hadoop/sbin在后面的学习过程中,如果要继续把其他命令的路径也加入PATH变量中,也需要继续修改~/.bashrc这个文件。当后面要继续加入新的路径时,只要用英文冒号“:”隔开,把新的路径加到后面即可,例如,如果要继续把/usr/local/hadoop/bin路径增加到PATH中,只要继续追加到后面,例如:export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin添加后,执行命令source ~/.bashrc使设置生效。设置生效后,在任何目录下启动Hadoop,都只要直接输入startdfs.sh命令即可。同理,停止Hadoop,也只需要在任何目录下输入stopdfs.sh命令即可。 3.3.4分布式模式配置 当Hadoop采用分布式模式部署和运行时,存储采用HDFS,而且,HDFS的名称节点和数据节点位于不同机器上。这时,数据就可以分布到多个节点上,不同数据节点上的数据计算可以并行执行,MapReduce分布式计算能力才能真正发挥作用。 为了降低分布式模式部署的难度,本书简单使用两个节点(两台物理机器)来搭建集群环境: 一台机器作为 Master节点,局域网IP地址为192.168.1.121;另一台机器作为 Slave 节点,局域网 IP 地址为192.168.1.122。由3个以上节点构成的集群,也可以采用类似的方法完成安装部署。 Hadoop集群的安装配置大致包括以下6个步骤。 (1) 选定一台机器作为 Master。 (2) 在Master节点上创建hadoop用户、安装SSH服务端、安装Java环境。 (3) 在Master节点上安装Hadoop,并完成配置。 (4) 在其他Slave节点上创建hadoop用户、安装SSH服务端、安装Java环境。 (5) 将Master节点上的/usr/local/hadoop目录复制到其他Slave节点上。 (6) 在Master节点上开启Hadoop。 上述这些步骤中,关于如何创建hadoop用户、安装SSH服务端、安装Java环境、安装Hadoop等过程,已经在前面介绍伪分布式模式配置时做了详细介绍,按照之前介绍的方法完成步骤(1)~(4),这里不再赘述。在完成步骤(1)~(4)的操作以后,才可以继续进行下面的操作。 1. 网络配置 假设集群所用的两个节点(机器)都位于同一个局域网内。如果两个节点使用的是虚拟机方式安装的Linux系统,那么两者都需要更改网络连接方式为“桥接网卡”模式(可以参考第2章介绍的网络连接设置方法),才能实现多个节点互连,如图39所示。此外,一定要确保各个节点的MAC地址不能相同,否则会出现IP地址冲突。在第2章曾介绍过采用导入虚拟机镜像文件的方式安装Linux系统,如果是采用这种方式安装Linux系统,则有可能出现两台机器的MAC地址是相同的,因为一台机器复制了另一台机器的配置。因此,需要改变机器的MAC地址,如图39所示,可以单击界面右边的“刷新”按钮随机生成 MAC 地址,这样就可以让两台机器的MAC地址不同了。 图39网络连接方式设置 网络配置完成以后,可以查看机器的IP地址(可以使用在第2章介绍过的ifconfig命令查看)。本书在同一个局域网内部的两台机器的IP地址分别是192.168.1.121和192.168.1.122。 由于集群中有两台机器需要设置,所以,在接下来的操作中,一定要注意区分Master节点和Slave节点。为了便于区分Master节点和Slave节点,可以修改各个节点的主机名,这样,在Linux系统中打开一个终端以后,在终端窗口的标题和命令行中都可以看到主机名,就比较容易区分当前是对哪台机器进行操作。在Ubuntu中,可在Master节点上执行如下命令修改主机名:$sudo vim /etc/hostname执行上面命令后,就打开了/etc/hostname文件,这个文件里面记录了主机名,例如,本书在第2章安装Ubuntu系统时,设置的主机名是dblabVirtualBox,因此,打开这个文件以后,里面就只有dblabVirtualBox这一行内容,可以直接删除,并修改为Master(注意是区分大小写的);再保存并退出vim编辑器,这样就完成了主机名的修改,需要重启Linux系统才能看到主机名的变化。 要注意观察主机名修改前后的变化。在修改主机名之前,如果用hadoop用户登录Linux系统,打开终端,进入Shell命令提示符状态,会显示如下内容:hadoop@dblab-VirtualBox:~$修改主机名并且重启系统之后,用hadoop用户登录Linux系统,打开终端,进入Shell命令提示符状态,会显示如下内容:hadoop@Master:~$可以看出,这时就很容易辨认出当前是处于Master节点上进行操作,不会和Slave节点产生混淆。 再执行如下命令打开并修改Master节点中的/etc/hosts文件:$sudo vim /etc/hosts可以在hosts文件中增加如下两条IP地址和主机名映射关系:192.168.1.121 Master 192.168.1.122 Slave1修改后的效果如图310所示。 图310修改IP地址和主机名映射关系后的效果 需要注意的是,一般hosts文件中只能有一个127.0.0.1,其对应主机名为localhost,如果有多余127.0.0.1映射,应删除,特别是不能存在127.0.0.1 Master这样的映射记录。修改后需要重启Linux系统。 上面完成了Master节点的配置,接下来要继续完成对其他Slave节点的配置修改。本书只有一个Slave节点,主机名为Slave1。参照上面的方法,把Slave节点上的/etc/hostname文件中的主机名修改为Slave1,同时,修改/etc/hosts的内容,在hosts文件中增加如下两条IP地址和主机名映射关系:192.168.1.121 Master 192.168.1.122 Slave1修改完成以后,重新启动Slave节点的Linux系统。 这样就完成了Master节点和Slave节点的配置,需要在各个节点上都执行如下命令,测试是否可以相互ping通,如果ping不通,后面就无法顺利配置成功:$ ping Master -c 3#只ping 3次就会停止,否则要按Ctrl+C键中断ping命令 $ping Slave1 -c 3例如,在Master节点上ping Slave1,如果ping通,会显示如图311所示的结果。 图311使用ping命令的效果 2. SSH无密码登录节点 必须要让Master节点可以SSH无密码登录到各个Slave节点上。首先,生成Master节点的公匙,如果之前已经生成过公匙,必须要删除原来生成的公匙,重新生成一次,因为前面对主机名进行了修改。具体命令如下:$ cd ~/.ssh#如果没有该目录,先执行一次ssh localhost $ rm ./id_rsa #删除原来生成的公匙(如果已经存在) $ ssh-keygen -t rsa#执行该命令后,遇到提示信息,一直按Etner键即可为了让Master节点能够SSH无密码登录本机,需要在Master节点上执行如下命令:$cat ./id_rsa.pub >>./authorized_keys完成后可以执行命令ssh Master来验证一下,可能遇到提示信息,只要输入yes即可,测试成功后,执行exit命令返回原来的终端。 其次,在Master节点将Master公匙传输到Slave1节点:$scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/上面的命令中,scp是secure copy的简写,用于在 Linux系统下进行远程复制文件,类似于cp命令,但是,cp只能在本机中复制。执行scp命令时会要求输入Slave1上hadoop用户的密码,输入完成后会提示传输完毕,如图312所示。 图312执行scp命令的效果 最后,在Slave1节点上将SSH公匙加入授权:$ mkdir ~/.ssh#如果不存在该文件夹需先创建,若已存在,则忽略本命令 $cat ~/id_rsa.pub >>~/.ssh/authorized_keys $ rm ~/id_rsa.pub#用完以后就可以删掉如果有其他Slave节点,也要执行将Master公匙传输到Slave节点以及在Slave节点上加入授权这两步操作。 这样,在Master节点上就可以SSH无密码登录到各个Slave节点,可在Master节点上执行如下命令进行检验:$ssh Slave1执行该命令的效果如图313所示。 图313ssh命令执行效果 3. 配置PATH变量 在前面的伪分布式模式配置中,已经介绍过PATH变量的配置方法。可以按照同样的方法进行配置,这样就可以在任意目录中直接使用hadoop、hdfs等命令了。如果还没有配置PATH变量,那么需要在Master节点上进行配置。首先执行命令vim ~/.bashrc,也就是使用vim编辑器打开~/.bashrc文件;然后,在该文件最上面加入下面一行内容:export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin保存后执行命令source ~/.bashrc,使配置生效。 4. 配置集群/分布式环境 在配置集群/分布式环境时,需要修改/usr/local/hadoop/etc/hadoop目录下的配置文件,这里仅设置正常启动所必需的设置项,包括workers、coresite.xml、hdfssite.xml、mapredsite.xml、yarnsite.xml共5个文件,更多设置项可查看官方说明。 1) 修改文件workers 需要把所有数据节点的主机名写入该文件,每行一个,默认为 localhost(即把本机作为数据节点),所以,在伪分布式模式配置时,就采用了这种默认的配置,使得节点既作为名称节点也作为数据节点。在进行分布式模式配置时,可以保留localhost,让Master节点同时充当名称节点和数据节点,也可以删掉localhost这行,让Master节点仅作为名称节点使用。 本书让Master节点仅作为名称节点使用,因此将workers文件中原来的localhost删除,只添加如下一行内容:Slave12) 修改文件coresite.xml 把coresite.xml文件修改为如下内容: fs.defaultFS hdfs://Master:9000 hadoop.tmp.dir file:/usr/local/hadoop/tmpAbase for other temporary directories. 各个配置项的含义可以参考前面伪分布式模式时的介绍,这里不再赘述。 3) 修改文件hdfssite.xml 对于HDFS而言,一般都是采用冗余存储,冗余因子通常为3,即一份数据保存3份副本。但是,本书只有一个Slave节点作为数据节点,即集群中只有一个数据节点,数据只能保存一份,所以,dfs.replication的值还是设置为 1。hdfssite.xml的具体内容如下: dfs.namenode.secondary.http-address Master:50090 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 4) 修改文件mapredsite.xml /usr/local/hadoop/etc/hadoop目录下有一个mapredsite.xml.template,需要修改文件名,把它重命名为mapredsite.xml,然后把mapredsite.xml文件配置成如下内容: mapreduce.framework.name yarn mapreduce.jobhistory.address Master:10020 mapreduce.jobhistory.webapp.address Master:19888 yarn.app.mapreduce.am.env HADOOP_MAPRED_HOME=/usr/local/hadoop mapreduce.map.env HADOOP_MAPRED_HOME=/usr/local/hadoop mapreduce.reduce.env HADOOP_MAPRED_HOME=/usr/local/hadoop 5) 修改文件 yarnsite.xml 把yarnsite.xml文件配置成如下内容: yarn.resourcemanager.hostname Master yarn.nodemanager.aux-services mapreduce_shuffle 上述5个文件全部配置完成以后,需要把Master节点上的/usr/local/hadoop文件夹复制到各个节点上。如果之前已经运行过伪分布式模式,建议在切换到集群模式之前首先删除之前在伪分布式模式下生成的临时文件。具体来说,需要首先在Master节点上执行如下命令:$cd /usr/local $ sudo rm -r ./hadoop/tmp#删除 Hadoop 临时文件 $ sudo rm -r ./hadoop/logs/ #删除日志文件 $ tar -zcf ~/hadoop.master.tar.gz ./hadoop #先压缩再复制 $cd ~ $scp ./hadoop.master.tar.gz Slave1:/home/hadoop然后在Slave1节点上执行如下命令:$ sudo rm -r /usr/local/hadoop# 删掉原有的Hadoop文件(如果存在) $sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local $sudo chown -R hadoop /usr/local/hadoop同样,如果有其他Slave节点,也要执行将hadoop.master.tar.gz传输到Slave节点以及在Slave节点解压文件的操作。 首次启动Hadoop集群时,需要先在Master节点执行名称节点的格式化(只需要执行这一次,后面再启动Hadoop时,不要再次格式化名称节点),命令如下:$ hdfs namenode -format现在就可以启动Hadoop了,启动需要在Master节点上进行,执行如下命令:$start-dfs.sh $start-yarn.sh $mr-jobhistory-daemon.sh start historyserver通过命令jps可以查看各节点所启动的进程。如果已经正确启动,则在Master节点上可以看到NameNode、ResourceManager、SecondaryNameNode和JobHistoryServer进程,如图314所示。 在Slave节点可以看到DataNode和NodeManager进程,如图315所示。 图314Master节点上启动的进程 图315Slave节点上启动的进程 缺少任一进程都表示出错。另外还需要在Master节点上通过命令hdfs dfsadmin report查看数据节点是否正常启动,如果屏幕信息中的Live datanodes不为 0,则说明集群启动成功。由于本书只有一个Slave节点充当数据节点,因此,数据节点启动成功以后,会显示如图316所示的信息。 图316通过dfsadmin查看数据节点的状态 也可以在Linux系统的浏览器中输入地址http://master:9870/,通过 Web 页面查看名称节点和数据节点的状态。如果不成功,可以通过启动日志排查原因。 这里再次强调,伪分布式模式和分布式模式切换时需要注意以下两点事项。 (1) 从分布式模式切换到伪分布式模式时,不要忘记修改workers配置文件。 (2) 在两者之间切换时,若遇到无法正常启动的情况,可以删除所涉及节点的临时文件夹,这样虽然之前的数据会被删掉,但能保证集群正确启动。所以,如果集群以前能启动,但后来启动不了,特别是数据节点无法启动,不妨试着删除所有节点(包括Slave节点)上的/usr/local/hadoop/tmp文件夹,再重新执行一次hdfs namenode format,再次启动即可。