一、集群安装条件前置

在虚拟机上先准备一个机子  按用前面【安装单机hadoop】 已完成安装jdk,hadoop和ssh、网络等配置环境等。

虚拟机和操作系统

环境:ubuntu14 + hadoop2.6+jdk1.7+ssh

虚拟机:(vmware10)

 

二、集群安装环境设置

Hadoop的安装为分布式模式,考虑到实际条件集群机定为3台(2台也可以)。

(1)克隆3个ubuntu实例

先关闭当前虚拟机实例,在虚拟机工具栏上点击【虚拟机】|【管理】|【克隆】,打开克隆虚拟机向导窗口点击【下一步】|【下一步】,其中克隆类型选择【创建完整克隆】,点击【下一步】,填写【虚拟机名称】|【位置】,【完成】克隆。

hadoop 集群搭建方式 hadoop集群搭建步骤_NAT

hadoop 集群搭建方式 hadoop集群搭建步骤_xml_02

hadoop 集群搭建方式 hadoop集群搭建步骤_xml_03

 

(2)设置3台机子的hostname

先正确设置各虚拟机的hostname 执行命令

sudo   gedit   /etc/hostname

将文件中的名称改成想要的机器名,如 hadoop01, hadoop02, hadoop03。

hadoop 集群搭建方式 hadoop集群搭建步骤_NAT_04

 

(3)设置3台机子的hosts文件

修改3台虚拟机hosts文件都是一样 执行命令

sudo  gedit  /etc/hosts

在hosts文件添加如下内容

192.168.150.128  hadoop01
192.168.150.129  hadoop02
192.168.150.130  hadoop03

这样,就不用记IP了。也可以只修改一台,其他使用scp命令拷贝hosts文件。

hadoop 集群搭建方式 hadoop集群搭建步骤_hadoop 集群搭建方式_05

 

(4)设置虚拟机的静态ip

修改3台主机设置静态ip,在hadoop0x上也要参考设置修改成具体的ip

sudo  gedit   /etc/network/interfaces

打开文件修改成已下内容(hadoop01)

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.150.128
netmask 255.255.255.0
network 192.168.150.0
boardcast 192.168.150.255
gateway 192.168.150.2

打开文件修改成已下内容(hadoop02)

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.150.129
netmask 255.255.255.0
network 192.168.150.0
boardcast 192.168.150.255
gateway 192.168.150.2

打开文件修改成已下内容(hadoop03)

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.150.130
netmask 255.255.255.0
network 192.168.150.0
boardcast 192.168.150.255
gateway 192.168.150.2

 

(5)配置NAT网络

1)虚拟机网络设置

在虚拟机工具栏上点击【编辑机】|【虚拟机网络编辑】,如果没有NAT模式的网络就点击【添加网络】,然后Wnet信息修改为【NAT模式】,设置子网为【192.168.150.0】,点击【NAT设置】按钮如图【NAT设置图】,点击【DCHP设置】按钮如图【DCHP设置图】,点击【应用】按钮和【确认】按钮。

hadoop 集群搭建方式 hadoop集群搭建步骤_NAT_06

NAT设置图:

hadoop 集群搭建方式 hadoop集群搭建步骤_NAT_07

DCHP设置图:

hadoop 集群搭建方式 hadoop集群搭建步骤_hadoop 集群搭建方式_08

2)设置虚拟计算机NAT

选择【我的计算机】的一个虚拟机,鼠标右键选择【设置】,选择【网络适配器】,在右侧【网络连接】点击【自定义】然后选择【NAT模式】的网络,点击【确定】按钮保存

hadoop 集群搭建方式 hadoop集群搭建步骤_hadoop 集群搭建方式_09

hadoop 集群搭建方式 hadoop集群搭建步骤_hadoop_10

 

(6)重启检验网络

重启一次系统生效 

每个虚拟机执行命令

ping hadoop01
ping hadoop02
ping hadoop03

正常的话,应该能ping通 。如果不能ping通,重新设置NAT网络。

 

(7)配置DNS服务器(虚拟机能上网忽略这个步骤)

如果不能上网,需要修改/etc/resolv.conf文件,配置DNS服务器

执行命令

sudo  gedit   /etc/resolv.conf

修改文件添加如下配置

nameserver  8.8.8.8  8.8.4.4  
nameserver  124.172.174.13

 

(8)配置ssh免密码登录

配置ssh免密码登录是让各节点能自动通过安全认证,不影响正常通讯。

1)安装SSH(已安装的忽略)

安装ssh有两种方式:

A.在ubuntu上在线安装

执行命令

sudo  apt-get  install  ssh 
sudo  apt-get  update

B.离线安装

在网上下载离线包,拷贝到ubuntu中按照离线包中的安装说明在本地进行安装

2)配置ssh的实现

配置ssh的实现思路:

在每台机子上都使用ssh-keygen生成public key,private key 所有机子的public key都拷到一台机子如hadoop01上

在hadoop01上生成一个授权key文件authorized_keys 最后把authorized_keys拷给所有集群中的机子,就能保证无密码登录

1、在所有虚拟机上,在当前用户目录下生成公钥、私钥对

执行命令

cd  /home/mk       
ssh-keygen  -t  rsa  -P ''

hadoop 集群搭建方式 hadoop集群搭建步骤_hadoop_11

2、导入公钥

执行hadoop01命令

cat  .ssh/id_rsa.pub  >  .ssh/authorized_keys

执行完以后,可以在本机上测试下,用ssh连接自己

执行命令

ssh hadoop01
#成功登陆则退出
exit

如果提示要输入密码, 查看authorized_keys文件权限, 如果是属于其他用户的, 需要修改该文件给其他用户权限

执行命令

chmod  644  .ssh/authorized_keys

修改文件权限,然后再测试下

ssh hadoop01

如果不需要输入密码,就连接成功,表示ok,一台机器已经搞定了。

 

tip:出现问题尝试解决

请先检查SSH服务是否启动,如果没启动,请启动!

如果没有.ssh目录则创建一个:

执行命令

cd  /home/mk 
mkdir   .ssh

如无权限,使用命令修改要操作文件夹的owner为当前用户:

执行命令

sudo  chown  -R  mk  /home/mk

3、在其它机器上生成公钥、密钥,并将公钥文件复制到hadoop01

执行命令:

#在hadoop0x上:
scp  .ssh/id_rsa.pub   mk@hadoop01:/home/mk/id_rsa_1.pub

#在slave2上:
scp  .ssh/id_rsa.pub  mk@hadoop01:/home/mk/id_rsa_2.pub

hadoop01中,查看下/home/mk目录,应该有二个新文件id_rsa_1.pub、id_rsa_2.pub 在hadoop01上,导入这二个公钥

执行命令
 

cat id_rsa_1.pub >> .ssh/authorized_keys 
cat id_rsa_2.pub >> .ssh/authorized_keys

这样,hadoop01这台机器上,就有所有3台机器的公钥了。

4、将hadoop01上的“最全”公钥,复制到其它机器

在hadoop01上 执行命令

scp .ssh/authorized_keys  mk@hadoop02:/home/mk/.ssh/authorized_keys 
scp .ssh/authorized_keys  mk@hadoop02:/home/mk/.ssh/authorized_keys

修改其它机器上authorized_keys文件的权限 hadoop02以及hadoop03机器上,均执行命令

chmod  600  .ssh/authorized_keys

5、验证

在每个虚拟机上,均用命令  ssh+其它机器的hostname 都能正常无密码连接成功 执行命令

ssh  hadoop01
ssh  hadoop02
ssh  hadoop03

6、SSH免密码设置失败解决
A.权限问题
.ssh目录,以及/home/当前用户 需要700权限,参考以下操作调整

sudo   chmod   777   ~/.ssh
sudo  chmod 700  /home/当前用户

.ssh目录下的authorized_keys文件需要600或644权限,参考以下操作调整

sudo chmod   644   ~/.ssh/authorized_keys

B.StrictModes问题

sudo gedit /etc/ssh/sshd_config
#找到
#StrictModes yes
#改成
StrictModes no

如果还不行,可以用ssh -vvv 目标机器ip 查看详情

 

三、配置hadoop集群

一共有7个文件要修改:
hadoop-2.6.0/etc/hadoop/hadoop-env.sh
hadoop-2.6.0/etc/hadoop/yarn-env.sh
hadoop-2.6.0/etc/hadoop/core-site.xml
hadoop-2.6.0/etc/hadoop/hdfs-site.xml
hadoop-2.6.0/etc/hadoop/mapred-site.xml
hadoop-2.6.0/etc/hadoop/yarn-site.xml
hadoop-2.6.0/etc/hadoop/slaves
执行命令

cd /home/mk/soft/hadoop-2.6.0

(1) hadoop-env.sh 、yarn-env.sh

这二个文件主要是修改JAVA_HOME改成实际本机jdk所在目录位置

执行命令

gedit  etc/hadoop/hadoop-env.sh

gedit  etc/hadoop/yarn-env.sh

打开文件找到下面这行的位置,改成(jdk目录位置,大家根据实际情况修改)

export JAVA_HOME=/home/mk/soft/jdk1.7.0_80

在 hadoop-env.sh中加上这句:

export HADOOP_PREFIX=/home/mk/soft/hadoop-2.6.0

(2)core-site.xml

 参考下面的内容修改:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <property>
   <name>fs.defaultFS</name>
   <value>hdfs://hadoop01:9000</value>       
 </property>
 <property>
     <name>hadoop.tmp.dir</name>
     <value>/home/mk/tmp</value>
 </property> 
</configuration>

注:/home/mk/tmp 目录如不存在,则先mkdir手动创建
core-site.xml的完整参数请参考 
http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/core-default.xml(3)hdfs-site.xml

参考下面的内容修改:

<?xml version="1.0" encoding="UTF-8"?>
   <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
   <configuration>
     <property>
       <name>dfs.datanode.ipc.address</name>
       <value>0.0.0.0:50020</value>
     </property>
     <property>
       <name>dfs.datanode.http.address</name>
      <value>0.0.0.0:50075</value>
    </property>  
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/home/mk/data/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/mk/data/datanode</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop02:9001</value>
    </property>    
    <property>
      <name>dfs.replication</name>
      <value>1</value>
    </property>
    <property> 
      <name>dfs.permissions</name> 
      <value>false</value> 
    </property>
 </configuration>

(4)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>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop01:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop01:19888</value>
    </property>
</configuration>

mapred-site.xml的完整参数请参考 http://hadoop.apache.org/docs/r2.6.0/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

(5)yarn-site.xml

<?xml version="1.0"?>
<configuration> 
    <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> 
    <property>
        <name>yarn.resourcemanager.scheduler.address</name> 
        <value>hadoop01:8030</value> 
    </property> 
    <property> 
        <name>yarn.resourcemanager.resource-tracker.address</name> 
        <value>hadoop01:8025</value> 
    </property>
    <property> 
        <name>yarn.resourcemanager.address</name>
        <value>hadoop01:8040</value>
    </property> 
</configuration>

(6)slaves

执行命令

gedit slaves

编辑该文件,输入

hadoop02
hadoop03

这样只有hadoop02,hadoop03上有datanode进程。

hadoop 1.x与2.x相比, 1.x中的很多参数已经被标识为过时,具体可参考 http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/DeprecatedProperties.html

(7)修改/etc/profile设置环境变量

执行命令

sudo gedit /etc/profile

打开/etc/profile,添加hadoop配置内容。注意CLASSPATH,PATH是在原来的配置项上添加hadoop的包路径

export HADOOP_HOME=/home/mk/soft/hadoop-2.6.0
export  CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.6.0.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0.jar:$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$PATH

使profile文件修改配置生效

source /etc/profile

(8)分发到集群的其它机器

把hadoop-2.6.0文件夹连同修改后的配置文件,通过scp拷贝到其它2台机器上。

执行命令

scp -r /home/mk/soft/hadoop-2.6.0/  mk@hadoop02:/home/mk/soft/hadoop-2.6.0
scp -r /home/mk/soft/hadoop-2.6.0/  mk@hadoop03:/home/mk/soft/hadoop-2.6.0

hadoop02、hadoop03上的hadoop临时目录(tmp)及数据目录(data),仍然要先手动创建。

(9)测试hadoop配置

在hadoop01上启用 NameNode测试
执行命令

hdfs namenode -format

先格式化
15/02/12 21:29:53 INFO namenode.FSImage: Allocated new BlockPoolId: BP-85825581-192.168.187.102-1423747793784
15/02/12 21:29:53 INFO common.Storage: Storage directory /home/hadoop/tmp/dfs/name has been successfully formatted.
等看到执行信息有has been successfully formatted表示格式化ok

 

四、启动hadoop集群

(1)启动HDFS

执行命令

HADOOP_HOME/sbin/start-dfs.sh

启动完成后,输入jps查看进程

执行命令

jps

2283  NameNode

如果看到上面NameNode进程,表示hadoop01节点成功

(2)启动yarn

执行命令

start-yarn.sh

jps

4363  ResourceManager

2283  NameNode

如果看到上面2个进程,表示 yarn启动完成。

(3)停止

执行命令

stop-dfs.sh
stop-yarn.sh

保存退出停掉刚才启动的服务

 

五、测试Hadoop服务

(1)hadoop01节点上,重新启动
执行命令

start-dfs.sh
start-yarn.sh

hadoop01节点上有几下2个进程:
3421 ResourceManager
3412 NameNode

hadoop02上有几下3个进程:

3214 SecondaryNameNode
3243 DataNode
3249 NodeManager

hadoop03上有几下2个进程:
2324 DataNode
2342 NodeManager

(2)web界面检查hadoop

hdfs管理界面    http://hadoop01:50070/
yarn的管理界面不再是原来的50030端口而是8088  http://hadoop01:8088/ 
 
(3)查看hadoop状态
hdfs dfsadmin -report 查看hdfs的状态报告
yarn  node -list   查看yarn的基本信息

 

六、其他问题

1.若namenode上的core-site.xml中的fs.defaultFS缺失,则启动时会报错。

2.若各机器上的yarn-site.xml中的yarn.resourcemanager.resource-tracker.address缺失,
    虽然resourcemanager与nodemanager进程能够正常启动,但是在执行yarn node -list会出现node数量为0的情况。
 
2.若各机器上的yarn-site.xml中的yarn.resourcemanager.scheduler.address或yarn.resourcemanager.address缺失,则在运行job时,
    会卡在INFO mapreduce.Job: Job job_1422695884569_0001 running in uber mode : false
 

七、使用hadoop集群运行例子

同样的例子比单机模式时间长

(1)运行自带mapreduce例子grep
执行命令

hadoop fs -mkdir /input
hadoop fs -put $HADOOP_HOME/etc/hadoop/*.xml  /input  
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep /input /output 'dfs[a-z.]+'
hadoop fs -get /output  /home/hadoop/output

 查看结果

cat output/*

1 dfsadmin  
得到和单机一样的结果,'dfs'只出现一次

(2)运行自带mapreduce例子wordcount
words.txt 
hello liuchengwu
hello liulao
hello dora
hello liu
hello hadoop
文件拷入/words.txt下
 
执行命令

hadoop fs -put /hpme/mk/words.txt /words.txt 
hadoop  jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount  
/words.txt /count1
hadoop fs -cat  /count1/*