1.环境介绍
- 这里用的是四台机器配置一个Hadoop完全分布式的集群环境,一个namenode和三个datanode,四台机器上安装的都是Ubuntu Server 14.04LTS系统;
- JDK版本1.7.0_75,安装详情下面有介绍;
- Hadoop版本为最新稳定版本hadoop2.6.0.
2.准备工作
- 创建用户名和组
为三台机器创建相同的用户名和组,建议密码也都设为一样,我的所有机器用户名和密码都为hadoop,这样方便后面管理(个人建议:安装时直接创建hadoop用户,系统会自动将其放入到同名的组中,这样避免多用户权限问题),命令如下:
//1.创建hadoop用户组
$ sudo addgroup hadoop
//2.创建hadoop用户并添加到hadoop组里
$ sudo adduser -ingroup hadoop hadoop
//3.给hadoop用户添加root权限(不建议但是省事,不用管权限问题)
$ sudo gedit /etc/sudoers
在root ALL=(ALL:ALL) ALL下添加如下内容:hadoop ALL=(ALL:ALL) ALL
- 修改主机名和主机--ip映射
//1.修改/etc/hostname文件,(建议安装时直接设置好)
namenode节点改为Master,三个datanode分别改为Slave1、Slave2、Slave3
//2.修改每个节点/etc/hosts文件,加入以下内容
192.168.1.151 Master
192.168.1.152 Slave1
192.168.1.153 Slave2
192.168.1.154 Slave3
- 安装SSH并配置各个节点间无密码互访
//1.安装ssh
一般系统是默认安装了ssh命令的。如果没有,或者版本比较老,则可以用以下命令重新安装:
sudo apt-get install ssh
//2.设置无密码互访(思路:各个节点的公钥文件都包含各个节点的秘钥)
a.各个节点都执行:
第一步:产生密钥
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
第二步:将秘钥追加到公钥中
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
b.然后将各个节点公钥文件合并,并覆盖各个节点~/.ssh下的公钥文件authorized_keys
3.测试
namenode节点:
ssh localhost
ssh Slave1(其他slave节点)
datanode节点:
ssh localhost
ssh Master(其他Slave节点)
如果都能无密码登陆到别的节点,则表示配置成功
- 安装JDK
//1.到oracle官网下载jdk-7u75-linux-x64.tar.gz,解压到/usr/lib/jvm目录下
sudo tar zxvf jdk-7u75-linux-x64.tar.gz -C /usr/lib/jvm
//2.修改环境变量
sudo gedit /etc/profile
添加如下内容:
#set java environment
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_75
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
//3.使配置立即生效
source /etc/profile
//4.配置默认JDK版本
第一步:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_75/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_75/bin/javac 300
第二步,输入以下命令,选择刚刚安装的jdk:
sudo update-alternatives --config java
5.测试,输入java -version,若显示的是刚刚安装的jdk,则表示jdk安装成功
3.安装Hadoop
强烈建议:所有节点都按以下步骤来配置,可以配置一个节点,然后复制到其他节点(当然要确保每个节点环境一致,如jdk的路径和版本,hadoop的路径等等),这样不仅省事省力,还便于以后修改和管理
- 下载hadoop并解压
从官网下载最新稳定版本hadoop-2.6.0.tar.gz,复制到/home/hadoop目录下并解压到当前目录
sudo tar -zxvf hadoop-2.6.0.tar.gz
- 修改hadoop-2.6.0/etc/hadoop下的配置文件
- 修改hadoop-env.sh文件
- 修改hadoop-env.sh文件
//修改JAVA_HOME路径为jdk的安装路径
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_75
- 修改yarn-env.sh文件
//修改JAVA_HOME路径为jdk的安装路径
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_75
- 修改slaves文件
//将datanode的主机名都加进去,我的配置如下:
Slave1
Slave2
Slave3
- 修改core-site.xml文件
//在<configuration></configuration>标签中加入如下属性配置,官网core-default.xml说明了该文件的可配属性和默认值
<property>
<name>fs.defalutFS</name>
<value>hdfs://Master:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value> <!--建议先手动建好该临时目录-->
</property>
- 修改hdfs-size.xml文件
//在<configuration></configuration>标签中加入如下属性配置,官网hdfs-default.xml说明了该文件的可配属性和默认值
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value> <!--建议先手动建好该目录-->
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/data</value> <!--建议先手动建好该目录-->
</property>
<property>
<name>dfs.replication</name>
<value>3</value> <!--副本数目不能大于datanode数目-->
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name> <!--防止出现不允许远程读写hdfs-->
<value>false</value>
</property>
<property>
<name>dfs.heartbeat.interval</name> <!--namenode每三秒发一个心跳信号-->
<value>3</value>
</property>
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name> <!--心跳机制recheck的间隔-->
<value>35000</value>
</property>
- 修改mapred-site.xml文件
//在<configuration></configuration>标签中加入如下属性配置,官网mapred-default.xml说明了该文件的可配属性和默认值
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
备忘:jobhistory要手动启动,即使start-all.sh也不会启动,启动命令:sbin/mr-jobhistory-daemon.sh start historyserver,这样在web上就可以访问Master:19888端口了,这是查看job的history信息的端口
- 修改yarn-site.xml文件
//在<configuration></configuration>标签中加入如下属性配置,官网yarn-default.xml说明了该文件的可配属性和默认值
<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>Master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>Master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>Master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>Master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>Master:8088</value>
</property>
- 修改/etc/profile文件,加入hadoop的环境变量(为了方便执行hadoop的命令),修改完执行source /etc/profile使配置立即生效
#for hadoop
export HADOOP_HOME=/home/hadoop/hadopp-2.6.0
export PATH=${PATH}:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
4.测试
所有节点都做到如上如上配置后,hadoop完全分布式集群就基本配置完毕,下面来测试。
- 格式化namenode
注:在namenode节点下执行以下命令(其他节点不用做这个操作)
hadoop namenode -format
- 启动服务
在namenode输入以下命令启动hdfs和yarn,不建议使用start-all.sh,标准做法输入start-dfs.sh和start-yarn.sh来分别启动hdfs和yarn
start-all.sh
- 查看各节点进程
在namenode节点和各个datanode节点分别输入jps命令,若在namenode出现如下进程:
NameNode
ResourceManager
SecondaryNameNode
并且datanode节点出现如下进程:
DataNode
NodeManager
则表示hadoop的完全分布式集群配置成功,你可以尝试在集群上运行一下hadoop自带的example(如:WorldCount),这里我就不演示了。
结尾注:博主写这篇博客目的在于记录这几天配置hadoop集群的过程,和初学者进行交流学习,难免有不足之处,望大家批评指正。ps:因为服务器没安装图形界面,不方便截图,所以主要以文字为主。
5.参考
http://www.aboutyun.com/thread-7684-1-1.html