一、集群环境介绍
1.1系统环境说明及配置
本人是使用的小型的服务器集群,第一次配置使用了包括主节点在内的5台主机,详细说明见下表:
机器名称 | 系统环境 | ip地址 |
master.hadoop | CentOS 6.5 | 10.128.0.130 |
slave1.hadoop | CentOS 6.5 | 10.128.0.131 |
slave2.hadoop | CentOS 6.5 | 10.128.0.132 |
slave3.hadoop | CentOS 6.5 | 10.128.0.133 |
slave4.hadoop | CentOS 6.5 | 10.128.0.134 |
1.2关闭防火墙(每台主机都要配置)
[root@localhost~]#service iptables stop #关闭防火墙 [root@localhost~]#chkconfig iptables off #设置防火墙启动策略为开机不启动
1.3新建用户(每台主机都要配置)
进入系统,使用root用户登录,添加一个新的用户hadoop,并授予该用户权限
[root@localhost~]# useradd hadoop [root@localhost~]# passwd hadoop [root@localhost~]# chmod u +w /etc/sudoers [root@localhost~]# vim /etc/sudoers #在root ALL=(ALL)ALL下添加hadoop ALL=(ALL)ALL [root@slave2 ~]# chmod u -w /etc/sudoers
1.4设置静态IP(每台主机都要配置)
系统默认使用的是DHCP动态获取IP地址,为了方便集群机器之间相互通信,要设置静态ip地址。并修改主机名称
(1)修改/etc/sysconfig/network-scripts/ifcfg-eth0,如果不确定自己的网卡信息,可以使用ifconfig命令查看
ifcfg-eth0修改内容如下:
DEVICE 接口名(设备,网卡) BOOTPROTO IP的配置方法(static:固定IP, dhcpHCP, none:手动) HWADDR MAC地址 ONBOOT 系统启动的时候网络接口是否有效(yes/no) IPV6INIT IPV6是否有效(yes/no) TYPE 网络类型(通常是Ethemet) NETMASK 网络掩码 IPADDR IP地址 GATEWAY 默认网关IP地址
(2)修改主机名称,对/etc/sysconfig/network文件进行修改,修改如下:(以下是master节点的配置信息,如slave1节点HOSTNAME=slave1.hadoop)
NETWORKING=YES HOSTNAME=master.hadoop
NETWORKING 是否利用网络 GATEWAY 默认网关 IPGATEWAYDEV 默认网关的接口名 HOSTNAME 主机名 DOMAIN 域名
(3)配置hosts文件
/etc/hosts这个文件是用来配置主机的DNS服务信息,是记载主机和ip对应关系,配置好后可以用ip地址或者主机名称访问相应的主机。配置信息如下:
vim /etc/hosts
10.128.0.130 master.hadoop 10.128.0.131 slave1.hadoop 10.128.0.132 slave2.hadoop 10.128.0.133 slave3.hadoop 10.128.0.134 slave4.hadoop
二、SSH免密钥登录配置(重点)
大数据集群中的Linux主机之间需要频繁的通信,但是Linux在互相通信中需要进行用户身份认证们也就是输入密码。在集群不大的情况下,每次登录少量计算机进行输入密码认证,所需要的操作时间尚且不多。但是,如果集群是几十台、上百台,频繁的认证就会大大降低工作效率,因此,实际生产中的集群都需要进行面密钥登录配置。默认状态下,SSH连接是需要密码认证的,但是可以通过修改系统认证,使系统通信免除密码输入和SSH认证。
2.1Master节点的配置
首先,我们在终端生成密钥,命令是“ssh-keygen -t rsa”
[hadoop@master~]# ssh-keygen -t rsa
ssh-keygen是用来生成private和public密钥对的命令,将public密钥拷贝到远程主机后,就可以使用ssh无密码登录到另一台主机,-t rsa 指定加密算法(RSA是一种典型的非对称加密算法)。
接下来需要将公钥复制到.ssh目录,复制的目的是为了方便修改该文件的权限
[hadoop@master .ssh]#cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys [hadoop@master .ssh]#chmod 600 ~/.ssh/authorized_keys
最后将authorized_keys文件复制到所有的Slave节点
[hadoop@master .ssh]#scp ~/.ssh/authorized_keys hadoop@slave1:~/ [hadoop@master .ssh]#scp ~/.ssh/authorized_keys hadoop@slave2:~/ [hadoop@master .ssh]#scp ~/.ssh/authorized_keys hadoop@slave3:~/ [hadoop@master .ssh]#scp ~/.ssh/authorized_keys hadoop@slave4:~/
2.2Slave节点的配置(所有Slave节点都要配置,且配置过程相同),以下以Slave1为例
首先,我们还是在终端生成密钥,命令是“ssh-keygen -t rsa”
[hadoop@slave1~]# ssh-keygen -t rsa
接下来需要将公钥复制到.ssh目录
[hadoop@slave1 .ssh]#cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys [hadoop@slave1 .ssh]#chmod 600 ~/.ssh/authorized_keys
至此,主机到子节点免登陆密钥配置完毕,可以使用ssh slave1验证一下,如果登录成功,并且无需输入登录密码,证明配置成功。
2.3Slave节点到Master免密钥登录
slave节点到master节点免密钥登录的原理一样,只不过过程是相反的,就是把slave节点到公钥追加到master的".ssh"文件夹下的"authorized_keys"中
我们以slave1为例,对master进行面密钥登录
(1)slave1节点配置
[hadoop@slave1 .ssh]# ssh-keygen -t rsa [hadoop@slave1 .ssh]# scp ~/.ssh/authorized_keys hadoop@master:~/
(2)master节点配置
[hadoop@master~]# cat ~/id_rsa.pub >> ~/.ssh/authorized_keys [hadoop@master~]# rm ~/id_rsa.pub
至此slave1节点到master节点的面密钥登录配置完成,最后,测试一下ssh master,如果登录成功,并且无需输入登录密码,证明配置成功。
三、JAVA环境安装
3.1安装JDK(每个节点都要安装)
由于Hadoop平台是基于Java环境的,因此,我们必须在Linux主机上安装JDK。
打开终端,切换成root用户(注意,安装JDK必须使用root用户权限)。在usr目录下创建java子目录,然后将jdk压缩包放到该文件夹下,进行解压
[root@master~]# mkdir /usr/java [root@master~]# tar -zxvf jdk-8u172-linux-x64.tar.gz
3.2配置环境变量
编辑“/etc/profile”文件,在文件中添加如下内容:
export JAVA_HOME=/usr/java/jdk1.8.0_60 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin修改完成后保存并退出,执行 source /etc/profile 命令使其配置立即生效。(注意:profile文件谨慎修改,修改错误将导致部分命令不能使用,解决方案见后续博客)
3.3验证
输入 java -version命令,如下图所示:
图3.1jdk安装环境测试
四、Hadoop集群安装
4.1解压Hadoop安装包
[hadoop@master~]#tar -zxf hadoop/hadoop-2.7.1.tar.gz -C ~/local/opt
4.2设置环境变量
[hadoop@master~]#vim /etc/profile
export HADOOP_HOME=/usr/hadoop export PATH=$PATH :$HADOOP_HOME/bin
[hadoop@master~]#source /etc/profile
4.3配置hadoop环境变量
(1)配置hadoop-env.sh文件
[hadoop@master~]#vim /usr/cx/hadoop-2.7.1/etc/hadoop/hadoop-env.sh
在文件的末尾加入下列内容:
export JAVA_HOME=/usr/cx/jdk1.8.0_60编辑完毕,保存并退出。
(2)配置核心组件文件
Hadoop的核心组件文件是core-site.xml,配置信息如下:
<configuration> /*这里的值指的是默认的HDFS路径*/ <property> <name>fs.defaultFS</name> <value>hdfs://10.128.0.130:9000</value> </property> /*缓冲区大小:io.file.buffer.size默认是4KB*/ <property> <name>io.file.buffer.size</name> <value>131072</value> </property> /*临时文件夹路径*/ <property> <name>hadoop.tmp.dir</name> <value>file:/data1/hadooptmp</value> <description>Abase for other temporary directories. </description> </property> </configuration>
(3)配置文件系统
Hadoop的文件系统配置文件是hdfs-site.xml,配置信息如下:
<configuration> /*配置主节点名和端口号*/ <property> <name>dfs.namenode.secondary.http-address</name> <value>10.128.0.130:9001</value> </property> /*配置从节点名和端口号*/ <property> <name>dfs.namenode.name.dir</name> <value>file:/data1/hdfs/namenode</value> </property> /*配置datanode的数据存储目录*/ <property> <name>dfs.datanode.data.dir</name> <value>file:/data1/hdfs/datanode</value> </property> /*配置副本数*/ <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>这里的dfs.replication是HDFS数据块的副本数,系统默认值是3,超过3的数是没有意义的,因为HDFS的最大副本数就是3.
(4)配置MapReduce计算框架文件
在hadoop-2.7.1/etc/hadoop子目录下,系统已经有了一个mapred-site.xml.template文件,我们需要将其复制并改名,命令是“cp ~/hadoop-2.7.1/etc/hadoop/mapred-site.xml.template ~/hadoop-2.7.1/etc/hadoop/mapred-site.xml,文件修改内容如下所示:
<configuration> /*hadoop对map-reduce运行框架一共提供了3种实现,在mapred-site.xml中通过"mapreduce.framework.name"这个属性来设置为"classic"、"yarn"或者"local"*/ <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapred.job.tracker</name> <value>10.128.0.130:9002</value> <!-- Default Port: 9001. --> </property> </configuration>
(5)配置yarn-site.xml文件
Yarn站点的配置文件为yarn-site.xml,修改内容如下:
<configuration> <!-- Site specific YARN configuration properties --> <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> /*resourcemanager的地址*/ <property> <name>yarn.resourcemanager.address</name> <value>10.128.0.130:8032</value> </property> /*调度器的端口*/ <property> <name>yarn.resourcemanager.scheduler.address</name> <value>10.128.0.130:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>10.128.0.130:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>10.128.0.130:8033</value> <property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>10.128.0.130:8033</value> <property> </configuration>
(6)配置Master的slaves文件(只需配置master节点即可)
slaves文件是Hadoop集群的Slave节点列表,集群启动的时候根据该列表启动集群中的节点。该文件中可以配置主机名也可以配置ip地址,配置信息如下:
slave1.hadoop slave2.hadoop slave3.hadoop slave4.hadoop
(7)配置Master的masters文件
master.hadoop
至此,master节点配置完毕,其余slave节点可以用scp命令将hadoop安装文件复制到各个主机,需要注意的是各个slave节点的profile文件要手动进行配置,配置信息参照master节点的profile文件。
五、Hadoop集群的启动
5.1格式化文件系统(只需在master节点执行一次)
在master节点上使用如下命令格式化:
hadoop namenode -format如果没有出现错误信息,则说明格式化成功。如果格式化失败,需要重新格式化(注意:不可在格式化失败后继续执行格式化),详细操作见另一篇博客。
5.2启动和关闭Hadoop
完成格式化后即可启动Hadoop了,可以使用sbin子目录下的start-all.sh命令启动Hadoop集群;
start-all.sh
关闭Hadoop集群
stop-all.sh实际上,Hadoop系统建议放弃使用start-all.sh和stop-all.sh一类的命令,而改用start-dfs.sh和start-yarn.sh命令。
5.3验证Hadoop集群是否启动成功
在终端执行jps命令查看Hadoop是否启动成功,在master节点,执行jps,如下如所示:
注:本人在集群中还安装有其它组件,所有除了hadoop进程还有其它进程。master节点的hadoop相关进程为:NameNode、SecondaryNameNode、ResourceManager和Jps。
在slave1节点,执行jps,如下如所示:
图5.2 slave1节点进程
注:slave1节点的hadoop相关进程为:NodeManager、DataNode、Jps。
我们可以通过Web界面监视系统状况,在浏览器中输入 http://10.128.0.130:50070,如下图所示:
图5.3 利用Web方式检测Hadoop运行状态
六、在Hadoop集群中运行程序
下面我们使用Hadoop自带的MapReduce程序,验证分布式计算是否可用。
(1)我们在本地创建"wordtest.txt"文本文件,然后提交到hdfs系统中,命令如下(HDFS基本命令见另一篇博客):
hadoop fs -put /root/wordtest.txt /user/root/input/wordtest.txt
wordtest.text文件内容如下:
good better best never it rest till good is better and better is best
(2)运行,命令如下:
hadoop jar /usr/cx/hadoop-2.7.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /user/root/input/wordtest.txt /user/root/output3
图6.1 运行hadoop-mapreduce-examples-2.7.1.jar程序
注:
wordcount:程序的类名;
/user/root/input/wordtest.txt:文件输入路径;
/user/root/output3:文件输出路径,该目录不可提前创建,否则会出现错误。
使用“hadoop fs -ls /user/root/output3”查看输出文件:
图6.2 输出文件
使用“hadoop fs -cat /user/root/output3/part-r-00000”查看结果,如下图所示:
图6.3 结果