本节将学习如何安装并运行Hadoop集群。
对于Hadoop发行版的选择,结合2.1节的内容,我们选择CDH5,该版本是目前生产环境中装机量最大的版本之一,涵盖了所有的Hadoop的主要功能和模块,稳定并且还有很多有用的新特性。下载地址为https://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.6.0.tar.gz。
Hadoop的运行模式有以下3种。
(1) 单机模式: 如果在不进行任何配置的情况下,这是Hadoop的默认模式,在这种模式下,本章第2节介绍的所有守护进程,如NameNode、DataNode、NodeManager、ResourceManager都变成了一个Java进程。
(2) 伪分布模式: 在这种模式下,所有的守护进程都运行在一个节点上,这种模式在一个节点上模拟了一个具有Hadoop完整功能的微型集群。
(3) 完全分布模式: 在这种模式下,Hadoop的守护进程运行在多个节点上,形成一个真正意义上的集群。
每种模式都有其优缺点。完全分布模式当然是使用Hadoop的最佳方式,但它需要最多的配置工作和架构所需要的机器集群。单机模式的配置工作是最简单的,但它与用户交互的方式不同于完全分布模式的交互方式。所以,对于一般学习者或者是受限于节点数目的读者,可以采用伪分布模式,虽然只有一个节点支撑整个Hadoop集群,但Hadoop在伪分布模式下的操作方式与其在完全分布模式下的操作几乎是完全相同的。本节将会介绍伪分布模式和完全分布模式的安装方法。
Hadoop的运行环境有以下两种。
(1)Windows:虽然目前Hadoop社区已经支持Windows,但由于Windows操作系统本身不太适合作为服务器操作系统,所以本书不介绍Windows下Hadoop的安装方式。
(2)Linux:Hadoop的最佳运行环境无疑是世界上最成功的开源操作系统Linux。Linux的发行版众多,常见的有CentOS、Ubuntu、RedHat等。CentOS(Community Enterprise Operating System,社区企业操作系统)是来自于Red Hat Enterprise Linux依照开放源代码 规定释出的源代码所编译而成,本书选择稳定且免费的CentOS 6.3 x86-64(64位)版本。
如果读者选择伪分布模式,只需准备1台物理机或者虚拟机。如果选择完全分布模式,那么需要准备两台以上的物理机或者虚拟机。
Hadoop的安装步骤大致分为8步。
(1)安装运行环境。
(2)修改主机名和用户名。
(3)配置静态IP地址。
(4)配置SSH无密码连接。
(5)安装JDK。
(6)配置Hadoop。
(7)格式化HDFS。
(8)启动Hadoop并验证安装。
读者如果有条件,可以在物理机上通过光盘安装的方式安装CentOS,但考虑到在实际情况中,并不一定有物理机安装的条件,这里介绍虚拟机安装的方式。
(1)安装虚拟化软件VMware Workstation 9,安装完成后,下载CentOS的镜像文件,下载地址为 http://centos.ustc.edu.cn/centos (中国科技大学镜像地址),进入VMware Workstation 9,如图2-6所示,单击最上面的“File”选项卡,选择“New Virtual Machine”选项。
图2-6 进入VMware Workstation 9
此时会进入创建新虚拟机向导,如图2-7所示,选择“Custom”,即自定义的设定方式,单击“Next”,选择虚拟机的硬件兼容性,我们此时选用默认配置进入并点击“Next”选择安装操作系统的方式。
图2-7 新建虚拟机向导
(2)为了模拟真实物理机安装操作系统的步骤,如图2-8所示,这里选择第3项 “I will install the operating system later”,单击“Next”进入选择要安装的操作系统。
图2-8 安装虚拟机操作系统
(3)如图2-9所示,选择Linux的CentOS 64-bit的版本。单击“Next”进入命名虚拟机的步骤。
图2-9 选择安装的操作系统
这里为了便于读者理解和记忆,如图2-10所示,命名为“master”,“Location”文本框中读者可以自行填写为保存虚拟机的本地磁盘路径。点击“Next”进入处理器设定环节。
图2-10 命名虚拟机
(4)这一步的设定将很大程度决定虚拟机的性能,在此建议,如果不是特别需要,不管Host(即读者使用的物理机)机器的处理器是几核,主频是多少,都分配为一个虚拟机一个物理核心,如图2-11所示。这样对Host机器的性能影响也不大,对于开发来说,Guest机器(即虚拟机)的性能也足够用了。点击“Next”为虚拟机分配内存。
图2-11 处理器设置
(5)这里还是本着够用和不影响Host机器为原则,一个虚拟机分配1024 MB内存,如图2-12所示。点击“Next”进入虚拟机的网络设定。
图2-12 内存设置
(6)如图2-13所示,一共有3种网络连接选项。
图2-13 网络连接
为了让其他节点能够访问Hadoop集群,这里选择桥接模式,点击“Next”进入I/O控制器。
(7)如图2-14所示,选择推荐配置即可,点击“Next”,进入虚拟机磁盘设置。
图2-14 I/O控制器设置
(8)如图2-15所示,选择默认配置即可,点击“Next”,进入硬盘接口设置。
图2-15 磁盘设置
(9)如图2-16所示,仍然选择默认选项“SCSI”,点击“Next”进入磁盘容量设置。
图2-16 磁盘接口设置
(10)如图2-17所示,设置虚拟机最大磁盘容量,默认20 GB。需要说明的是,这里不管填写多少,虚拟机占用磁盘的容量始终是实际消耗,也就是说这个数字仅仅是个上限,所以这里可以填大一点没有关系,推荐30 GB。下面的选项按照默认选项即可。点击“Next”进入虚拟机文件设置。
图2-17 容量设置
(11)在这一步中将设置存储虚拟机的文件的基本信息,如图2-18所示,vmdk是VMware可识别的格式,该文件保存了虚拟机的基本信息,只占极少的容量,真正存储虚拟机数据的文件是文件名为填写的文件名在文件名尾加上-s001、-s002的文件,依次类推,例如CentOS 64-bit-s001.vmdk,CentOS 64-bit-s002.vmdk。这些文件都存放于前面在命名虚拟机的步骤中填写的文件夹下,点击“Next”,进入虚拟机信息确认的步骤。
图2-18 虚拟机文件设置
(12)如图2-19所示,在这里会看到虚拟机的所有信息,如网络、计算资源、存储资源、名称等,如果读者觉得虚拟机的硬件设置有不合适的地方可以点击“Customize Hardware”,在这里仍然可以修改。点击“Finish”按钮完成整个虚拟机设置。
图2-19 创建虚拟机
(13)以上步骤等同于读者自己组装了台机器,现在需要将安装光盘放进Host机器的光驱,虚拟机的光驱设置默认是使用Host机器的光驱。如果读者采用镜像文件的安装方式,则需要在工作区左边的列表右键单击刚才配置的虚拟机,如图2-20所示。
图2-20 右键单击虚拟机
选择“Setting”选项,进入虚拟机设置界面,如图2-21所示,点击左边“Hardware”选项卡的“CD/DVD”选项,然后选中右边的“Use ISO image file”选项,点击“Browse”按钮,将准备好的Centos 6.3 x86-64的安装文件镜像选中,最后点击“OK”退出。
图2-21 虚拟机设置
(14)这时虚拟机的所有准备工作已经完成,剩下要做的就是启动虚拟机。单击选中刚才配置的虚拟机,点击工作区第二排的第一个如同播放的按钮,启动虚拟机,如图2-22所示。
图2-22 启动虚拟机
此时,虚拟机会自动被安装光盘(或者是镜像文件)引导至安装界面,由于安装步骤和物理机安装并无不同,在此就不介绍了。如果读者选择完全分布模式安装Hadoop,那么读者还需按照上面步骤,再准备多个一模一样的虚拟机,其中一台作为主节点(master node),其余作为从节点(slave node)。
为了统一开发环境,在这里需要修改主机名和用户名。
(1)修改用户名(root用户执行,所有节点都需执行)。执行“useradd hadoop”添加以hadoop为用户名的用户;执行“passwd hadoop”修改该用户的密码,密码统一设置为123456。
(2)修改主机名(root用户,所有节点都需要执行)。在安装CentOS的时候会输入一个主机名,但是我们仍然需要修改使其符合规范。执行“vi /etc/sysconfig/network”,会出现:
NETWORKING=yes HOSTNAME=your_computer_host_name ...
如果读者选择完全分布模式安装Hadoop,那么需要将一个节点的该文件中的“HOSTNAME”修改为“master”,其他节点的主机名修改为“slave1”、“slave2”、……。如果读者选择伪分布模式安装,那么只需要按照上面的步骤将节点的主机名修改为“master”。保存后退出文件编辑。
(3)为了让安装Hadoop的节点之间能够使用主机名进行互相访问,需要修改hosts文件(root用户执行,所有节点都需执行)。执行“vi /etc/hosts”,在文件末尾加上:
#填写IP地址与主机名 192.168.190.200 master #如果是完全分布模式还需要填写slave的IP地址和主机名 192.168.190.201 slave1 ...
修改后保存退出文件编辑,这样节点之间就可以通过主机名互相访问了。
由于Hadoop集群在启动时需要通过固定的主机名或者IP地址启动,所以我们必须对虚拟机配置静态IP地址。
修改ifcfg-em1文件(root用户执行,所有节点都需执行),执行命令:
vi /etc/sysconfig/network-scripts/ifcfg-em1
将文件修改为:
DEVICE="em1" BOOTPROTO="static" NM_CONTROLLED="yes" ONBOOT="yes" #TYPE="Ethernet" #下面为静态IP地址 IPADDR=192.168.190.200 NETMASK=255.255.0.0 #下面为网关IP地址 GATEWAY=192.168.1.1 DNS1=8.8.8.8
当前远程管理环境中最常使用的是SSH(Secure Shell)。SSH是一个可在应用程序中提供的安全通信的协议,通过SSH可以安全地进行网络数据传输,这得益于SSH采用的非对称加密体系,即对所有待传输的数据进行加密,保证数据在传输时不被恶意破坏、泄露和篡改。不过需要注意的是,Hadoop并不是通过SSH协议进行数据传输的,Hadoop仅仅是在启动和停止的时候需要主节点通过SSH协议将从节点上面的进程启动或停止。也就是说如果不配置SSH对Hadoop的使用没有任何影响,只需在启动和停止Hadoop的时候输入每个从节点的用户名的密码就行了,但是一旦集群的规模增大,这种方式无疑是不可取的,也不利于学习和调试。
在配置SSH无密码连接之前,先关闭防火墙。
执行以下命令(使用root用户执行,所有节点都需执行),关闭防火墙:
service iptables stop
可以通过以下命令永久关闭防火墙:
chkconfig iptables off
绝大多数操作系统已经附带了SSH,但以防万一,这里还是简单介绍一下。
安装SSH协议:
yum install ssh yum install rsync
rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。
启动SSH服务命令:
service sshd restart
检查SSH是否已经安装成功,可以先执行以下命令:
rpm -qa | grep openssh
如果出现下面的信息:
openssh-askpass-5.3p1-81.el6.x86_64 openssh-5.3p1-81.el6.x86_64 openssh-clients-5.3p1-81.el6.x86_64 openssh-server-5.3p1-81.el6.x86_64
再执行命令:
rpm -qa | grep rsync
如果出现以下信息:
rsync-3.0.6-9.el6.x86_64
说明SSH安装成功。
对于伪分布模式虽然只有一个节点,但也需要配置SSH无密码本机连接本机。在主节点执行“ssh-keygen -t rsa”,遇到提示回车即可,最后显示的图形是公钥的指纹加密。生成公钥后,需要将公钥发至本机的authorized_keys的列表,执行“ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@master”。
对于完全分布模式,有多个节点,但只需主节点无密码连接从节点,因此在主节点执行:
ssh-keygen -t rsa
遇到提示回车即可,将公钥发至从节点的authorized_keys的列表,执行:
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave1 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave2 ...
对于伪分布模式,在主节点执行“ssh master”,如果没有出现输入密码的提示,则安装成功。
对于完全分布模式,在主节点执行“ssh slave1”,如果没有出现输入密码的提示,则安装成功。如果读者发现按照上面步骤执行,仍然不成功,有可能是/home/hadoop/.ssh文件夹的权限问题。以hadoop用户执行:
chmod 700 /home/hadoop/.ssh chmod 644 /home/hadoop/.ssh/authorized_keys
由于Hadoop是由Java编写而成,所以运行环境需要Java支持,Hadoop需要Java 1.6以上支持。读者所装的CentOS可能预装了Open JDK,但是还是推荐用Oracle JDK,下载地址为 http://www.oracle.com/technetwork/Java/Javase/downloads/index.html 。
(1)卸载Open JDK(root用户执行,所有节点都需执行),查看目前系統的JDK,执行命令“rpm -qa | grep jdk”,如果出现openjdk,则需要卸载之,执行命令“yum -y remove xxx ”, xxx 为刚才执行“rpm -qa | grep jdk”返回的结果。
(2)安装Oracle JDK(root用户执行,所有节点都需执行),将JDK安装至/opt文件夹下,我们采用tar文件的方式安装,将jdk-7u80-linux-x64.tar.gz移到/opt文件夹下,执行:
tar -xzvf jdk-7u80-linux-x64.tar.gz
(3)配置环境变量(root用户执行,所有节点都需执行),对/etc/profile文件追加:
export JAVA_HOME=/opt/jdk1.7.0_80 export PATH=$PATH:$JAVA_HOME/bin
修改环境变量后,就能在任意路径下使用java命令。为了使环境变量立即生效,执行命令:
source /etc/profile
验证安装,执行:
java -version,
如果出现如下Java的版本信息,则说明安装成功。
java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
首先,从root用户取得/opt文件夹的权限(root用户执行,所有节点都需执行)。Hadoop的安装路径一般不推荐装在/home/hadoop文件夹下,推荐安装在/opt文件夹下。执行命令“chown -R hadoop /opt”。然后以hadoop用户将安装文件移到/opt下面。
下面我们分别介绍伪分布模式和完全分布模式的配置方式。
(1)解压文件(以hadoop用户在主节点执行),在/opt下执行:
tar -zxvf hadoop-2.6.0-cdh5.6.0
解压后的文件都会存放在/opt/ hadoop-2.6.0-cdh5.6.0下。
(2)修改配置文件(以hadoop用户在主节点执行),Hadoop的配置文件都在/opt/ hadoop-2.6.0-cdh5.6.0/etc/hadoop下,进入该文件夹下,会发现有若干配置文件,主要的配置文件已列在表2-5中。
表2-5 Hadoop配置文件
Hadoop的安装只涉及表2-5中的前6个文件。
(1)修改hadoop-env.sh。在文件hadoop-env.sh末尾追加环境变量:
export JAVA_HOME=/opt/jdk1.7.0_80 export HADOOP_HOME=/opt/hadoop-2.6.0-cdh5.6.0
(2)修改core-site.xml。修改core-site.xml为:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>fs.default.name</name> <value>hdfs://master:9000</value> </property> </configuration>
该项配置设置提供HDFS服务的主机名和端口号,也就是说HDFS通过master的9000端口提供服务,这项配置也指明了NameNode所运行的节点,即主节点。
(3)修改hdfs-site.xml。修改hdfs-site.xml为:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.name.dir</name> <value>/opt/hdfs/name</value> </property> <property> <name>dfs.data.dir</name> <value>/opt/hdfs/data</value> </property> </configuration>
dfs.replication配置项设置HDFS中文件副本数为3。HDFS会自动对文件做冗余处理,这项配置就是配置文件的冗余数,3为表示有两份冗余。dfs.name.dir配置项设置NameNode的元数据存放的本地文件系统路径,dfs.data.dir设置DataNode存放数据的本地文件系统路径。
(4)修改mapred-site.xml。修改mapred-site.xml为:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
该项配置指明了MapReduce计算框架基于YARN进行工作。
(5)修改yarn-site.xml。修改yarn-site.xml为:
<configuration> <property> <name>yarn.resourcemanager.address</name> <value>master:8080</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8082</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration>
该项配置设置指明了ResourceManager服务的主机名和端口号,另外还指明了mapreduce_shuffle的类。
(6)修改slaves文件。修改slaves文件为:
master
这样指明了主节点同时运行DataNode、NodeManager进程。
在伪分布模式配置的基础上,只需将slaves文件修改为:
slave1 slave2 ...
这样,运行DataNode和NodeManager的节点就变为slave1、slave2……,然后利用scp命令将安装文件夹分发到从节点的相同路径下:
scp -r /opt/hadoop-2.6.0-cdh5.6.0 hadoop@slave1:/opt scp -r /opt/hadoop-2.6.0-cdh5.6.0 hadoop@slave2:/opt ...
至此,Hadoop安装配置工作全部完成,为了能在任何路径下使用Hadoop命令,还需要配置环境变量(root用户执行,所有节点都需执行)。对文件/etc/profile追加如下信息:
export HADOOP_HOME=/home/hadoop/hadoop-2.6.0-cdh5.6.0 export PATH=$PATH:$HADOOP_HOME/bin
这样就不用每次都必须进入/opt/hadoop-2.6.0-cdh5.6.0/bin下面才能使用Hadoop的命令了。修改完成后,环境变量不会立即生效,需要执行命令(root用户执行,所有节点都需执行):
source /etc/profile
在第一次启动Hadoop之前,必须先将HDFS格式化。执行命令:
hadoop namenode -format
按照提示输入Y,格式化成功后会出现格式化成功的信息:
14/04/05 09:50:51 INFO common.Storage: Storage directory /opt/hdfs/name has been successfully formatted.
格式化Hadoop完成后,便可以启动Hadoop,启动Hadoop的命令非常简单,只需执行一个脚本。首先赋予脚本可执行权限(hadoop用户,所有节点都需执行),执行命令:
chmod +x -R /opt/hadoop-2.6.0-cdh5.6.0/sbin
然后执行启动脚本(hadoop用户,主节点执行),执行命令:
./opt/hadoop-2.6.0-cdh5.6.0/sbin/start-all.sh
执行完成后,执行jps命令查看进程是否启动成功,jps命令的作用是显示和Java有关的进程名和进程号,如果是伪分布模式,主节点会出现:
NameNode DataNode ResourceManager NodeManager SecondaryNameNode
也就是说,所有的进程都运行在一个节点。如果选择完全分布模式安装,在主节点会出现:
NameNode ResourceManager SecondaryNameNode
在slave1节点会出现:
DataNode NodeManager
我们以一个MapReduce作业来验证是否安装成功,这个MapReduce作业实现单词计数的功能,例如一篇文章内容为“data mining on data warehouse”,那么单词计数的统计结果为:
data 2 mining 1 on 1 warehouse 1
首先准备一个内容“data mining on data warehouse”的文本文件,命名为words,单词之间以空格分开,保存至/home/hadoop目录下。执行命令:
hadoop dfs -mkdir /user/hadoop/input 在HDFS创建一个目录 hadoop dfs -put /home/hadoop/words /user/hadoop/input 将文本文件上传至刚才创建的HDFS目录 hadoop jar /opt/hadoop-2.6.0-cdh5.6.0/share/hadoop/ mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.6.0.jar wordcount/user/hadoop/input/user/hadoop/output 执行MapReduce任务
最后一条命令是指用Hadoop自带的测试用例进行测试,第一个参数是测试用例名,第二个参数是输入文件,第三个是输出目录,以上执行完成后,再执行命令:
hadoop dfs -cat /user/hadoop/output/part-r-00000
看到如下输出,说明Hadoop安装成功:
data 2 mining 1 on 1 warehouse 1