一、集群安装条件前置
在虚拟机上先准备一个机子 按用前面【安装单机hadoop】 已完成安装jdk,hadoop和ssh、网络等配置环境等。
虚拟机和操作系统
环境:ubuntu14 + hadoop2.6+jdk1.7+ssh
虚拟机:(vmware10)
二、集群安装环境设置
Hadoop的安装为分布式模式,考虑到实际条件集群机定为3台(2台也可以)。
(1)克隆3个ubuntu实例
先关闭当前虚拟机实例,在虚拟机工具栏上点击【虚拟机】|【管理】|【克隆】,打开克隆虚拟机向导窗口点击【下一步】|【下一步】,其中克隆类型选择【创建完整克隆】,点击【下一步】,填写【虚拟机名称】|【位置】,【完成】克隆。
(2)设置3台机子的hostname
先正确设置各虚拟机的hostname 执行命令
sudo gedit /etc/hostname
将文件中的名称改成想要的机器名,如 hadoop01, hadoop02, hadoop03。
(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文件。
(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设置图】,点击【应用】按钮和【确认】按钮。
NAT设置图:
DCHP设置图:
2)设置虚拟计算机NAT
选择【我的计算机】的一个虚拟机,鼠标右键选择【设置】,选择【网络适配器】,在右侧【网络连接】点击【自定义】然后选择【NAT模式】的网络,点击【确定】按钮保存
(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 ''
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/*