第3章 Hadoop的安装和使用 Hadoop是一个开源的、可运行于大规模集群上的分布式计算平台,它主要包含分布式 并行编程模型MapReduce和分布式文件系统HDFS 等功能,已在业内得到广泛的应用。 借助于Hadoop,程序员可以轻松地编写分布式并行程序,将其运行于计算机集群上,完成 海量数据的存储与处理分析。 本章首先简要介绍Hadoop的发展情况;然后,阐述安装Hadoop之前的一些必要准备 工作;最后,介绍安装Hadoop的具体方法,包括单机模式、伪分布式模式以及分布式模式。 1 Hp简介 3.adoo Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了系统底 层细节透明的分布式基础架构。Hadoop是基于Java语言开发的,具有很好的跨平台特性, 并且可以部署在廉价的计算机集群中。Hadoop的核心是HDFS 和MapReduce。 Apacop版本分为3代, op1.op2.op3. heHado分别是Hado0、Hado0和Hado0。第一 代Hadop包含0.x、21.22.其中,20.0.变成了稳 o20.0.x和0.x三大版本, 0.x最后演化成1.x, 定版,而0.x和0.x则增加了HDFSHA 等重要的新特性。第二代Hado23. 21.22.op包含0.x 和2.x两大版本,它们完全不同于Hadoop1.0,是一套全新的架构,均包含HDFS Feeain和YARN(YeohrRsucoitr) op2. drtotAnteeoreNegtao两个系统。Hado0是基于 JDK1.而JDK1.于是Hado8重 7开发的,7在2015 年4月已停止更新, op社区基于JDK1. 新发布一个新的Hadop版本, op3.到了Hado0以后, o也就是Hado0。因此, op3.JDK 版本 的最低依赖从1.8。Hadoop3.包括HDFS 7变成了1.0中引入了一些重要的功能和优化, 可擦除编码、多名称节点支持、任务级别的MapReduce本地优化、基于cgroup的内存和磁 盘I/O隔离等。本书采用Hado3. op3.5。 除了免费开源的ApacheHadoop以外,还有一些商业公司推出Hadoop的发行版。 2008 年,Cloudera成为第一个Hadoop商业化公司,并在2009 年推出第一个Hadoop发行 版。此后,很多大公司也加入了做Hadoop产品化的行列,如MapR、Hortonworks、星环等。 2018 年10 月,Cloudera和Hortonworks宣布合并。一般而言,商业化公司推出的Hadoop 发行版也是以ApacheHadoop为基础,但是前者比后者具有更好的易用性、更多的功能以 及更高的性能。 第3 章 Hadoop 的安装和使用 29 3.2 安装Hadoop前的准备工作 本节介绍安装Hadoop之前的一些准备工作,包括创建hadoop用户、更新APT、安装 SSH 和安装Java环境等。 3.2.1 创建hadoop用户 本书全部采用hadoop用户登录Linux系统,并为hadoop用户增加了管理员权限。在 前面的“第2章Linux系统的安装和使用”内容中,已经介绍了hadoop用户创建和增加权限 的方法,一定按照该方法创建hadoop用户,并且使用hadoop用户登录Linux系统,然后再 开始下面的学习内容。本书所有学习内容,都是采用hadoop用户登录Linux系统。 3.2.2 更新APT 本书第2章介绍了APT软件作用和更新方法,为了确保Hadoop安装过程顺利进行, 建议按照第2章介绍的方法,用hadoop用户登录Linux系统后打开一个终端,执行下面命 令更新APT软件: $ sudo apt-get update 3.2.3 安装SSH SSH 是SecureShell的缩写,是建立在应用层和传输层基础上的安全协议。SSH 是目 前较可靠、专为远程登录会话和其他网络服务提供安全性的协议。利用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,然后按提 30 大数据基础编程、实验和案例教程(第3 版) 示输入密码hadoop,就登录到本机了。 图3-1 SSH 登录提示信息 这里在理解上会有一点“绕弯”。也就是说,原本登录进入Linux系统以后,就是在本机 上,这时,在终端中输入的每条命令都是直接提交给本机去执行,然后,又在本机上使用 SSH 方式登录到本机,这时,在终端中输入的命令,是通过SSH 方式提交给本机处理。如 果换成包含两台独立计算机的场景,SSH 登录会更容易理解。例如,有两台计算机A 和B 都安装了Linux系统,计算机B上安装了SSH 服务端,计算机A 上安装了SSH 客户端,计 算机B的IP地址是59.77.16.33,在计算机A 上执行命令ssh59.77.16.33,就实现了通过 SSH 方式登录计算机B上面的Linux系统,在计算机A 的Linux终端中输入的命令,都会 提交给计算机B上的Linux系统执行,也就是说,在计算机A 上操作计算机B中的Linux 系统。现在只有一台计算机,就相当于计算机A 和B都在同一台机器上,所以理解起来就 会有点“绕弯”。 但是,这样登录需要每次输入密码,所以,需要配置成SSH 无密码登录会比较方便,而 且,在Hadoop集群中,名称节点要登录某台机器(数据节点)时,也不可能人工输入密码,所 以,也需要设置成SSH 无密码登录。 首先输入命令exit退出刚才的SSH,就回到了原先的终端窗口;然后可以利用sshkeygen 生成密钥,并将密钥加入授权中,命令如下: $ cd ~/.ssh/ #若没有该目录,先执行一次ssh localhost $ ssh-keygen -t rsa #会有提示,按Enter 键即可 $ cat ./id_rsa.pub >> ./authorized_keys #加入授权 此时,再执行sshlocalhost命令,无须输入密码就可以直接登录了,如图3-2所示。 图3-2 SSH 登录后的提示信息 3.2.4 安装Java环境 由于Hadoop本身是使用Java语言编写的,因此Hadoop的开发和运行都需要Java的 支持,对于Hadoop3.3.5而言,要求使用JDK1.8或者更新的版本。 访问Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads)下 载JDK1.8安装包。或者也可以访问本书官网,进入“下载专区”,在“软件”目录下找到文件 jdk-8u371-linux-x64.tar.gz并将其下载到本地。这里假设下载得到的JDK安装文件保存在 第3 章 Hadoop 的安装和使用 31 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-8u371-linux-x64.tar.gz -C /usr/lib/jvm 下面继续执行如下命令,设置环境变量: $vim ~/.bashrc 上面命令使用vim 编辑器打开了hadoop这个用户的环境变量配置文件,在这个文件 的开头位置,添加如下几行内容: export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_371 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_371" Java(TM) SE Runtime Environment (build 1.8.0_371-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.371-b11, mixed mode) 至此,就成功安装了Java环境。下面就可以进入Hadoop的安装。 3.3 安装Hadoop Hadoop包括3种安装模式。 (1)单机模式:只在一台机器上运行,存储是采用本地文件系统,没有采用HDFS。 (2)伪分布式模式:存储采用HDFS,但是HDFS的名称节点和数据节点都在同一台 32 大数据基础编程、实验和案例教程(第3 版) 机器上。 (3)分布式模式:存储采用HDFS,而且HDFS的名称节点和数据节点位于不同机 器上。本 节介绍Hadoop的具体安装方法,包括下载安装文件、单机模式配置、伪分布式模式 配置、分布式模式配置等。 3.3.1 下载安装文件 本书采用的Hadoop版本是3.3.5,可以到Hadoop官网下载安装文件(https://archive. apache.org/dist/hadoop/core/hadoop-3.3.5/),或者也可以到本书官网的“下载专区”中下载 安装文件,单击进入下载专区后,在“软件”这个文件夹中,找到文件hadoop-3.3.5.tar.gz,下 载到本地。由于本书全部采用hadoop用户登录Linux系统,所以,hadoop-3.3.5.tar.gz文件 会被保存到/home/hadoop/Downloads/目录下。 下载完安装文件以后,需要对文件进行解压。按照Linux系统使用的默认规范,用户安 装的软件一般都是存放在/usr/local/目录下。使用hadoop用户登录Linux系统,打开一个 终端,执行如下命令: $ sudo tar -zxvf ~/Downloads/hadoop-3.3.5.tar.gz -C /usr/local #解压到/usr/local 中 $ cd /usr/local/ $ sudo mv ./hadoop-3.3.5/ ./hadoop #将文件夹名改为hadoop $ sudo chown -R hadoop:hadoop ./hadoop #修改文件权限 Hadoop解压后即可使用,可以输入如下命令来检查Hadoop是否可用,成功则会显示 Hadoop版本信息: $ cd /usr/local/hadoop $ ./bin/hadoop version 3.3.2 单机模式配置 Hadoop默认模式为非分布式模式(本地模式),无须进行其他配置即可运行。Hadoop 附带了丰富的例子,运行如下命令可以查看所有例子: $ cd /usr/local/hadoop $ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.5 .jar 上述命令执行后,会显示所有例子的简介信息,包括grep、join、wordcount等。这里选 择运行grep例子,可以先在/usr/local/hadoop目录下创建一个文件夹input,并复制一些文 件到该文件夹下;然后,运行grep程序,将input文件夹中的所有文件作为grep的输入,让 grep程序从所有文件中筛选出符合正则表达式dfs[a-z.]+的单词,并统计单词出现的次 数;最后,把统计结果输出到/usr/local/hadoop/output文件夹中。完成上述操作的具体命 令如下: 第3 章 Hadoop 的安装和使用 33 $ cd /usr/local/hadoop $ mkdir input $ cp ./etc/hadoop/*.xml ./input #将配置文件复制到input 目录下 $ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop- mapreduce- examples- *.jar grep ./input ./output 'dfs[a-z.]+' $ cat ./output/* #查看运行结果 执行成功后,如图3-3所示,作业的相关信息会输出在屏幕上,输出的结果是符合正则 表达式的,单词dfsadmin出现了1次。 图3-3 grep程序运行结果 需要注意的是,Hadoop默认不会覆盖结果文件,因此,再次运行上面实例会提示出错。 如果要再次运行,需要先使用如下命令把output文件夹删除: $ rm -r ./output 3.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 34 大数据基础编程、实验和案例教程(第3 版) 在上面的配置文件中,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 中,数据会被冗余存储多份,以保证可靠性和可用性。但是,由于这里采用伪分布式模式,只 有一个节点,只可能有1个副本,因此设置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 如果格式化成功,会看到successfullyformatted的提示信息(见图3-4)。 如果在执行这一步时提示错误信息Error:JAVA_HOMEisnotsetandcouldnotbe found,则说明之前设置JAVA_HOME环境变量的时候,没有设置成功,按前面的教程先设 置好JAVA_HOME变量,否则,后面的过程都无法顺利进行。 第3 章 Hadoop 的安装和使用 35 图3-4 执行名称节点格式化后的提示信息 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:Couldnotresolvehostnamexxx的异常情 况,如图3-6所示。 图3-6 Hadoop启动后的错误提示信息 36 大数据基础编程、实验和案例教程(第3 版) 这个并不是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 若成功启动,则会列出如下进程(见图3-7):NameNode、DataNode和SecondaryNameNode。 图3-7 Hadoop启动成功以后的进程 如果看不到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-hadoopnamenode- DBLab-XMU.out 其中,DBLab-XMU 对应的是机器名(你的机器名可能不是这个名称),不过,实际上启动日 志信息是记录在下面这个文件中: /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 所以,应该查看这个扩展名为.log的文件,而不是.out文件。此外,每一次的启动日志 都是追加在日志文件之后,所以,需要拉到日志文件的最后面查看,根据日志记录的时间信 息,就可以找到某次启动的日志信息。 当找到属于本次启动的一段日志信息以后,出错的提示信息一般会出现在最后面,通常 是写着Fatal、Error、Warning或者JavaException的地方。可以在网上搜索一下出错信息, 寻找一些相关的解决方法。 如果执行jps命令后,找不到DataNode进程,则表示数据节点启动失败,可尝试如下的 方法(注意这时删除HDFS中原有的所有数据,如果原有的数据很重要,不要这样做,不过 第3 章 Hadoop 的安装和使用 37 对于初学者而言,通常这个时候不会有重要数据): $ ./sbin/stop-dfs.sh #关闭 $ rm -r ./tmp #删除tmp 文件,注意这时删除HDFS 中原有的所有数据 $ ./bin/hdfs namenode -format #重新格式化名称节点 $ ./sbin/start-dfs.sh #重启 5. 使用Web 界面查看HDFS 信息 Hadoop成功启动后,可以在Linux系统中(不是Windows系统)打开一个浏览器,在地 址栏输入地址http://localhost:9870(见图3-8),就可以查看名称节点和数据节点信息,还 可以在线查看HDFS中的文件。 图3-8 HDFS的Web管理界面 6. 运行Hadoop 伪分布式实例 上面的单机模式中,grep例子读取的是本地数据,伪分布式模式下,读取的则是分布式 文件系统HDFS上的数据。要使用HDFS,首先需要在HDFS中创建用户目录(本书全部 统一采用hadoop用户名登录Linux系统),命令如下: $ cd /usr/local/hadoop $ ./bin/hdfs dfs -mkdir -p /user/hadoop 上面的命令是分布式文件系统HDFS的操作命令,会在“第4章HDFS操作方法基础 编程”中做详细介绍,目前只需要按照命令操作即可。 接着需要把本地文件系统的/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 中 38 大数据基础编程、实验和案例教程(第3 版) 复制完成后,可以通过如下命令查看HDFS中的文件列表: $ ./bin/hdfs dfs -ls input 执行上述命令以后,可以看到input目录下的文件信息。现在就可以运行Hadoop自带 的grep程序,命令如下: $ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop- mapreduce- examples- 3.3.5. jar grep input output 'dfs[a-z.]+' 运行结束后,可以通过如下命令查看HDFS中的output文件夹中的内容: $ ./bin/hdfs dfs -cat output/* 执行结果如图3-9所示。 图3-9 在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时,无须进行名称节点的初始化(否则会出错),也就是说,不要再次 执行hdfsnamenode-format命令,每次启动Hadoop只需要直接运行start-dfs.sh命令 即可。 8. 配置PATH 变量 前面在启动Hadoop时,都要加上命令的路径,例如,./sbin/start-dfs.sh这个命令中就 带上了路径,实际上,通过设置PATH 变量,就可以在执行命令时,不用带上命令本身所在 的路径。例如,打开一个Linux终端,在任何一个目录下执行ls命令时,都没有带上ls命令 的路径,实际上,执行ls命令时,是执行/bin/ls这个程序,之所以不需要带上路径,是因为 第3 章 Hadoop 的安装和使用 39 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分布式计算能力才能真正发挥 作用。这 里使用3 个节点(两台物理机器)来搭建集群环境,主机名分别为hadoop01、 hadoop02和hadoop03。3个节点上的Hadoop组件分布如表3-1所示。 表3-1 Hadoop集群组件分布 名 称hadoop01 hadoop02 hadoop03 HDFS NameNode DataNode DataNode DataNode SecondaryNameNode YARN ResourceManager NodeManager NodeManager NodeManager 1. 安装虚拟机 此前,在2.2.3节安装Linux虚拟机这部分内容中,已经安装了虚拟机hadoop01,按照 相同的方法再安装另外两个虚拟机hadoop02和hadoop03,或者也可以采用“克隆”虚拟机 的方式快速生成两个新的虚拟机。由于hadoop02和hadoop03是从节点,不需要安装很多 的软件,所以,配置可以比hadoop01低一些,例如,对于hadoop02和hadoop03而言,内存只 40 大数据基础编程、实验和案例教程(第3 版) 需要配置4GB,磁盘只需要配置20GB。 安装好虚拟机hadoop02和hadoop03以后,参照3.2.2节的方法,首先创建hadoop用 户,然后使用hadoop用户登录Linux系统,安装SSH 服务端,并安装Java环境。 2. 网络配置 在Ubuntu中,在hadoop01节点上执行如下命令修改主机名: $ sudo vim /etc/hostname 执行上面命令后,就打开了/etc/hostname这个文件,这个文件里面记录了主机名。因 此,打开这个文件以后,里面就只有ubuntu这一行内容,可以直接删除,并修改为hadoop01 (注意是区分大小写的),然后,保存退出vim 编辑器,这样就完成了主机名的修改,需要重 启Linux系统才能看到主机名的变化。 要注意观察主机名修改前后的变化。在修改主机名之前,如果用hadoop登录Linux系 统,打开终端,进入Shell命令提示符状态,会显示如下内容: hadoop@ ubuntu:~$ 修改主机名并且重启Linux系统之后,用hadoop登录Linux系统,打开终端,进入 Shell命令提示符状态,会显示如下内容: hadoop@ hadoop01:~$ 同理,按照相同的方法,把虚拟机hadoop02 和hadoop03 中的主机名分别修改为 hadoop02和hadoop03,并重启Linux系统。 然后,使用ifconfig命令获取每台虚拟机的IP地址,具体命令如下: $ ifconfig 图3-10给出ifconfig命令的执行效果,从中可以看到,hadoop01的IP地址是192.168.91.128 (你的机器的IP地址可能和这个不同)。同理,可以查询到hadoop02的IP地址是192.168.91.129 (你的机器的IP地址可能和这个不同),hadoop03的IP地址是192.168.91.130(你的机器的 IP地址可能和这个不同)。 图3-10 ifconfig命令执行效果 需要注意的是,建议将每台机器的IP地址设置为固定IP地址,不要使用动态分配IP 地址,否则,每次重启系统以后有可能IP地址会动态变化,导致后面搭建的集群无法连接。 第3 章 Hadoop 的安装和使用 41 下面介绍把机器的IP地址设置为固定IP地址的方法。 在Ubuntu系统中新建一个终端,执行如下命令查询网关地址: $ netstat -nr 查询结果如图3-11所示,从图中可以看到,网关是192.168.91.2。 图3-11 查询网关地址 单击Ubuntu系统界面右上角的齿轮(见图3-12),在弹出的菜单中选择SystemSettings 命令。 图3-12 打开系统设置 在出现的界面中(见图3-13),单击Network按钮。 图3-13 打开网络设置 在出现的界面中(见图3-14),单击Options按钮。 在出现的界面中(见图3-15),在Method右边的下来列表中选择Manual,然后,把 Address设置为192.168.91.128,把Netmask设置为255.255.255.0,把Gateway设置为 192.168.91.2,把DNSservers设置为114.114.114.114,最后单击界面底部的Save按钮。然 后,重新启动Ubuntu系统,IP地址就生效了。注意,系统重启以后,一定要使用ifconfig命 令检查IP地址是否已经设置成功,同时,也要在Ubuntu中打开一个浏览器,测试一下是否 42 大数据基础编程、实验和案例教程(第3 版) 图3-14 单击Options按钮 可以正常访问网络(如访问百度网站)。 图3-15 IP地址设置界面 然后,在hadoop01中,执行如下命令打开并修改/etc/hosts文件: $ sudo vim /etc/hosts 可以在hosts文件中增加如下3条IP和主机名映射关系: 192.168.91.128 hadoop01 192.168.91.129 hadoop02 192.168.91.130 hadoop03 修改后的效果如图3-16所示。 需要注意的是,一般hosts文件中只能有一个127.0.0.1,其对应主机名为localhost,如 果有多余127.0.0.1映射,应删除,特别是不能存在127.0.0.1hadoop01这样的映射记录。 修改后需要重启Linux系统。 上面完成了hadoop01的配置,接下来要继续完成对其他节点的配置修改。参照上面的 第3 章 Hadoop 的安装和使用 43 图3-16 修改IP和主机名映射关系后的效果 方法,分别到hadoop02和hadoop03中,在hosts文件中增加如下3条IP 和主机名映射 关系: 192.168.91.128 hadoop01 192.168.91.129 hadoop02 192.168.91.130 hadoop03 修改完成以后,重新启动Linux系统。 需要在各个节点上都执行如下命令,测试是否相互ping得通,如果ping不通,后面就 无法顺利配置成功。在每个节点上都执行下面3条命令: $ ping hadoop01 -c 3 #只ping 3 次就会停止,否则要按组合键Ctrl+C 中断ping 命令 $ ping hadoop02 -c 3 $ ping hadoop03 -c 3 例如,在hadoop01节点上执行ping命令,如果ping通的话,会显示图3-17所示的 结果。 图3-17 使用ping命令的效果 3. SSH 无密码登录节点 必须要让hadoop01节点可以SSH 无密码登录到各个节点上(包括hadoop01可以 SSH 无密码登录自己)。 首先需要再次确认3个节点上已经安装了SSH 服务端,如果之前没有安装,需要执行 如下命令安装SSH 服务端(如果此前已经安装就不用重复安装): $ sudo apt-get install openssh-server 44 大数据基础编程、实验和案例教程(第3 版) 然后,生成hadoop01节点的公钥,如果之前已经生成过公钥(在3.3.3节安装伪分布式 模式的Hadoop时生成过一次公钥),必须要删除原来生成的公钥,重新生成一次,因为前面 对主机名进行了修改。在hadoop01节点执行如下命令: $ cd ~/.ssh #如果没有该目录,先执行一次ssh localhost $ rm ./id_rsa* #删除之前生成的公钥(如果已经存在) $ ssh-keygen -t rsa #执行该命令后,遇到提示信息,一直按Enter 键就可以 为了让hadoop01节点能够无密码SSH 登录本机,需要在hadoop01节点上执行如下命令: $ cat ./id_rsa.pub >> ./authorized_keys 完成后可以执行命令sshhadoop01来验证一下,可能会遇到提示信息,只要输入yes即 可,测试成功后,执行exit命令返回原来的终端。 接下来,在hadoop01节点将上公钥传输到hadoop02和hadoop03节点: $ scp ~/.ssh/id_rsa.pub hadoop@hadoop02:/home/hadoop/ $ scp ~/.ssh/id_rsa.pub hadoop@hadoop03:/home/hadoop/ 上面的命令中,scp是securecopy的简写,用于在Linux下进行远程复制文件,类似于 cp命令,不过,cp只能在本机中复制。执行scp时会要求输入hadoop02和hadoop03节点 上hadoop用户的密码,输入完成后会提示传输完毕,如图3-18所示。传输完成以后,在 hadoop02和hadoop03节点上的/home/hadoop目录下就可以看到文件id_rsa.pub了。 图3-18 执行scp命令的效果 接着在节点hadoop02和hadoop03上分别执行如下命令将SSH 公钥加入授权: $ mkdir ~/.ssh #如果不存在该文件夹需先创建,若已存在,则忽略本命令 $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys $ rm ~/id_rsa.pub #用完以后就可以删掉 这样,在hadoop01 节点上就可以无密码SSH 登录到各个节点了(包括hadoop01、 hadoop02和hadoop03),可在hadoop01节点上执行如下命令进行检验: $ ssh hadoop02 $ ssh hadoop03 执行该命令的效果如图3-19所示。 4. 下载安装文件 如果hadoop01节点上已经安装了Hadoop(如之前安装过伪分布式的Hadoop),需要 第3 章 Hadoop 的安装和使用 45 图3-19 ssh命令执行效果 先将其删除。 在hadoop01节点上下载Hadoop安装文件,并执行如下命令: $ sudo tar -zxvf ~/Downloads/hadoop-3.3.5.tar.gz -C /usr/local #解压到/usr/local 中 $ cd /usr/local/ $ sudo mv ./hadoop-3.3.5/ ./hadoop #将文件夹名改为hadoop $ sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限 5. 配置PATH 变量 在前面的伪分布式安装内容中,已经介绍过PATH 变量的配置方法。可以按照同样的 方法进行配置,这样就可以在任意目录中直接使用hadoop、hdfs等命令了。如果还没有配 置PATH 变量,那么需要在hadoop01节点上进行配置。首先执行命令vim ~/.bashrc,也 就是使用vim 编辑器打开~/.bashrc文件,然后,在该文件最上面的位置加入下面一行 内容: export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin 保存后执行命令source~/.bashrc,使配置生效。 6. 配置集群/分布式环境 在配置集群/分布式模式时,需要修改/usr/local/hadoop/etc/hadoop目录下的配置文 件,这里仅设置正常启动所必需的设置项,包括workers、core-site.xml、hdfs-site.xml、 mapred-site.xml和yarn-site.xml共5个文件,更多设置项可查看官方说明。 (1)修改文件workers。 需要把所有数据节点的主机名写入该文件,每行一个。把hadoop01节点中的workers 文件中原来的localhost删除,添加如下3行内容: hadoop01 hadoop02 hadoop03 (2)修改文件core-site.xml。 把hadoop01节点中的core-site.xml文件修改为如下内容: 46 大数据基础编程、实验和案例教程(第3 版) fs.defaultFS hdfs://hadoop01:9000 hadoop.tmp.dir file:/usr/local/hadoop/tmp Abase for other temporary directories. 各个配置项的含义可以参考前面伪分布式模式时的介绍,这里不再赘述。 (3)修改文件hdfs-site.xml。 对于Hadoop的分布式文件系统HDFS而言,一般都是采用冗余存储,冗余因子通常为 3,也就是说,一份数据保存3份副本,所以,dfs.replication的值设置为3。把hadoop01节点 中的hdfs-site.xml设置为如下内容: dfs.namenode.secondary.http-address hadoop03:50090 dfs.replication 3 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。 hadoop01节点中的/usr/local/hadoop/etc/hadoop目录下有一个mapred-site.xml,把 mapred-site.xml文件配置成如下内容: mapreduce.framework.name yarn mapreduce.jobhistory.address 第3 章 Hadoop 的安装和使用 47 hadoop01:10020 mapreduce.jobhistory.webapp.address hadoop01: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。 把hadoop01节点中的yarn-site.xml文件配置成如下内容: yarn.resourcemanager.hostname hadoop01 yarn.nodemanager.aux-services mapreduce_shuffle 上述5个文件全部配置完成以后,需要把hadoop01节点上的/usr/local/hadoop文件 夹复制到各个节点上。如果之前已经运行过伪分布式模式,建议在切换到集群模式之前首 先删除之前在伪分布式模式下生成的临时文件。具体来说,需要首先在hadoop01节点上执 行如下命令: $ cd /usr/local/hadoop $ sudo rm -r ./tmp #删除Hadoop 临时文件 $ sudo rm -r ./logs/* #删除日志文件 $ cd /usr/local $ tar -zcf ~/hadoop.master.tar.gz ./hadoop #先压缩再复制 $ cd ~ $ scp ./hadoop.master.tar.gz hadoop02:/home/hadoop $ scp ./hadoop.master.tar.gz hadoop03:/home/hadoop