首次尝试写博,不足之处请指正。以ubantu linux为例,搭建集群模式。首先准备三台机器A、B和C,A担任Namenode,同时兼任Datanode(实际生产环境 建议独立)。
——网络及系统配置——
启动三台机器,配置固定IP,例如我的三台机器IP分别为:
192.168.102.129
192.168.102.130
192.168.102.131
测试网络连通性:在A的Terminal中,执行ping命令:
ping 192.168.102.130
ping 192.168.102.131
Ctrl+C中止
在ABC机器的终端窗口中,分别修改机器名为node01、node02和node03:
sudo gedit /etc/hostname
设置每台机器的ip与主机名的对应关系(在/etc/hosts文件中存放的是域名与ip的对应关系)注:请将原文件最上面的第二行127.0.1.1 删除掉,每台机器都要做:
sudo gedit /etc/hosts
在打开的文件中,将第二行替换为以下三行:
192.168.102.129 node01
192.168.102.130 node02
192.168.102.131 node03
重启,在node01中分别ping两台机器:
ping node02
ping node03
正常连接即可。
——配置SSH免密登陆——
原理:namenode作为客户端,要实现无密码公钥认证,连接到服务端datanode上时,需要在namenode 上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到datanode 上。当namenode 通过ssh 连接datanode 时,datanode 就会生成一个随机数并用namenode 的公钥对随机数进行加密,并发送给namenode。namenode 收到加密数之后再用私钥进行解密,并将解密数回传给datanode,datanode 确认解密数无误之后就允许namenode进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端namenode公钥复制到datanode 上。
在每台机器上,安装ssh服务:
sudo apt-get install ssh
在每台机器上,执行如下命令:
ssh localhost
在namenode(master主机)上,使用如下命令生成公私钥:
cd .ssh
ssh-keygen -t rsa
然后一路回车,在.ssh下生成公私钥。
将namenode(master主机)上的公钥分别加入node01、node02和node03机器的授权文件中。
ssh-copy-id hduser@node01
ssh-copy-id hduser@node02
ssh-copy-id hduser@node03
测试。在node01机器上,使用ssh分别连接node01、node02和node03:
ssh node01
ssh node02
ssh node03
这时会发现不需要输入密码,直接就ssh连接上了这三台机器。
记得最后通过这个命令退出ssh连接:
exit
在node01机器上(master主机)上修改slaves 文件:
cd
gedit hadoop-2.2.0/etc/hadoop/slaves
写入下面三行
node01
node02
node03
——环境配置——
安装配置jdk1.7+
将JDK 7+下载到node01的用户主目录下,cp安装包到/usr下建立java,tar解压安装,打开配置文档:
sudo gedit /etc/profile
文档末尾填写:
export JAVA_HOME=/usr/java/jdk1.7.0_51
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
生效配置:
source /etc/profile
验证:
java -version
javac -version
出现版本号,即成功。
安装配置Hadoop
将hadoop-2.2.0.tar.gz包解压缩到用户主目录下:
cd ~
tar -zxvf hadoop-2.2.0.tar.gz
配置Hadoop的环境变量:
sudo gedit /etc/profile
在java环境变量配置部分,增加如下内容:
export HADOOP_HOME=/home/hduser/hadoop-2.2.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
测试环境变量是否配置正确:
hadoop version
在主文件夹下,创建如下的目录结构:
hddata
- tmp
- name
- data
配置HADOOP_HOME/etc/hadoop/下的多个配置文件:
hadoop-env.sh文件
gedit hadoop-env.sh
将#The java implementation to use.下内容改为jdk路径,保存退出:
export JAVA_HOME=/usr/java/jdk1.7.0_51
core-site.xml文件
gedit core-site.xml
<configuration>
<!--NameNode URI-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hduser/hddata/tmp</value>
</property>
<!--Size of read/write buffer used in SequenceFiles.-->
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
<description>文件大小的倍数(4096 on Intel x86)</description>
</property>
</configuration>
hdfs-site.xml文件
<configuration>
<!--位于本地文件系统的路径,NameNode在这里存储命名空间和事务日志-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hduser/hddata/name</value>
</property>
<!--以逗号分隔的DataNode本地文件系统路径列表,DataNode在这里存储数据块-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hduser/hddata/data</value>
</property>
<!--HDFS块大小,这里指定为256MB,用于大文件系统-->
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
<!--HDFS块冗余数量(可以不配,默认就是3)-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--更多的NameNode服务器线程,用来处理大量来自DataNodes的RPCs-->
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
</configuration>
复制mapred-site.xml.template并改名为mapred-site.xml。
cp mapred-site.xml.template mapred-site.xml
gedit mapred-site.xml
<configuration>
<!--配置MapReduce程序-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>用来执行MapReduce jobs的运行时框架,为以下值之一:local,classic或yarn</description>
</property>
<!--MapReduce JobHistory Server-->
<!-- 配置 MapReduce JobHistory Server 地址,默认端口10020 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01:10020</value>
<description>MapReduce JobHistory Server IPC host:port</description>
</property>
<!-- 配置 MapReduce JobHistory Server web ui 地址,默认端口19888 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node01:19888</value>
<description>MapReduce JobHistory Server Web UI host:port</description>
</property>
</configuration>
yarn-site.xml文件
<configuration>
<!--配置ResourceManager-->
<!--将yarn.resourcemanager.hostname的值修改为master机器的ip地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node01</value>
</property>
<!--配置NodeManager-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>为Map Reduce程序设置的Shuffle service。使用逗号分隔。service name只能包含a-zA-Z0-9_,不能以数字开头</description>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
至此,环境配置完成。接下来将环境通过scp传给node02和node03:
scp -r hduser@node01:/usr/java hduser@node02:/usr
scp -r hduser@node01:~/hadoop-2.2.0 hduser@node02:~/
同理,scp到node03。
分别编辑node02和node03的/etc/profile文件,与node01一致。
——格式化HDFS文件系统——
在node01(NameNode)上,运行下面的命令来格式化一个新的文件系统:
hdfs namenode -format
注:这个格式化只做一次。如果要重新格式化HDFS,则要将原来的$HADOOP_HOME下的hddata/name 和hddata/data 目录清空,重新格式化。
——集群测试——
启动HDFS文件系统,这个命令将首先启动一个master node中的NameNode。然后它将启动在slaves文件中所提及到的所有机器中的DataNode服务。最后,它将启动Secondary NameNode。(亦可start-all.sh
启动所有服务)
start-dfs.sh
HDFS带有一个监控web控制台来验证安装以及监视HDFS集群。
http://node01:50070/
另外,还可以使用如下的命令来获得HDFS状态的报告:
hadoop dfsadmin -report
或着
hdfs dfsadmin -report
运行下面的命令来启动YARN service服务:
start-yarn.sh
运行下面的命令来启动MapReduce JobHistoryServer:
mr-jobhistory-daemon.sh start historyserver
通过jps命令列表显示进程,以检查安装情况:
jps
访问ResourceManager的基于web的控制台页面:
http://node01:8088/
运行pi程序,求PI值:
hadoop jar ~/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar pi 10 20
最后,使用如下的命令关闭history service、YARN service和HDFS service(逆序):
mr-jobhistory-daemon.sh stop historyserver
stop-yarn.sh
stop-dfs.sh
用jps查看