1.安装和配置虚拟机
1.1安装VMwareWorkstation12pro虚拟机
1.2安装vmwaretools工具
2.Hadoop集群配置过程
2.1 集群中的机器,都要有的配置:
- 安装jdk 7+,并配置好环境变量
- Hadoop-2.x.x安装包,配置好Hadoop参数(重点1)
- 都要安装SSH服务,如果没有安装ssh服务,则启动每台机器,分别安装ssh服务:
$ sudo apt-get install ssh (ubantu)
$ sudo install ssh 或 ssh localhost (centos)
2.2 config文件配置:
- 将hadoop-2.2.0目录名改为hadoop
- 配置环境变量:JAVA的环境变量和Hadoop的环境变量
$ sudo vi /etc/profile
- 在profile文件环境变量配置部分,增加如下内容:
export HADOOP_HOME=/home/gao/hadoop
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
#set environment of jkd and hadoop
exportJAVA_HOME=/usr/java/java-1.8.0-openjdk
exportHADOOP_HOME=/home/will/hadoop
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
exportPATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
2.3 测试环境变量是否配置正确:
$ javac -version
$ java -version
$ hadoop jar
2.4 在主文件夹下,创建如下的目录结构:
hdfsdata
- tmp
- name
- data
2.5 配置$HADOOP_HOME/etc/hadoop/下的多个配置文件:(附件)
$ cd hadoop/etc/hadoop/
$ vi hadoop-env.sh
$ vi core-site.xml
$ vi hdfs-site.xml
$ cp mapred-site.xml.template mapred-site.xml
$ vi mapred-site.xml
$ vi yarn-site.xml
3.克隆机器
3.1 将虚拟机cloud01关机.
3.2 选中hadoop01,然后鼠标右键,在出来的菜单中选择 管理—>克隆,然后按照提示操作即可
4.集群配置-网络配置
4.1 启动三台机器,分别配置固定ip。例如,我的三台机器ip分别为:
192.168.106.137
192.168.106.138
192.168.106.139
4.2 测试网络连通性:在第一台机器的控制台窗口中,执行ping命令:
$ ping 192.168.106.138
$ ping 192.168.106.139
4.3 修改第二台机器的机器名为cloud02,第三台机器的机器名为cloud03。
在每台机器的控制器,执行命令:
$ sudo vi /etc/hostname
分别修改文件内容为cloud02和cloud03
4.4 设置每台机器的ip 与主机名的对应关系(在/etc/hosts 文件中存放的是域名与ip的对应关系):
注:请将原文件最上面的第二行127.0.1.1 删除掉,每台机器都要做
$ sudo vi /etc/hosts
192.168.106.137 cloud01
192.168.106.138 cloud02
192.168.106.139 cloud03
4.5 重启三台机器。在cloud01中,ping其它两台机器的机器名:
$ ping cloud02
$ ping cloud03
5.集群配置-安装和配置SSH无密码登录
原理:namenode 作为客户端,要实现无密码公钥认证,连接到服务端 datanode 上时,需要在 namenode 上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到 datanode 上。当 namenode 通过 ssh 连接 datanode 时,datanode 就会生成一个随机数并用namenode 的公钥对随机数进行加密,并发送给 namenode。namenode 收到加密数之后再用 私钥进行解密,并将解密数回传给datanode, datanode确认解密数无误之后就允许namenode 进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端 namenode 公钥复制到 datanode 上。
5.1 在每台机器上,执行如下命令:
$ ssh localhost
$ ssh exit #记得最后通过这个命令退出ssh连接
# 会自动生成.ssh目录(如果存在.ssh文件夹,则应先删除.ssh(rm -rf .ssh))
或者
$ mkdir .ssh # 手工创建.ssh 目录
5.2 在namenode(master主机)上,使用如下命令生成公私钥:
$ ssh-keygen -t rsa
然后一路回车,在.ssh下生成公私钥。
5.3 在namenode(master主机)上,将公钥加入授权文件:
$ cd .ssh
$ cat id_rsa.pub >> authorized_keys
5.4 将namenode(master主机)上的公钥分别加入cloud02和cloud03机器的授权文件(authorized_keys)中。
执行如下命令:
$ ssh-copy-id gao@cloud02
$ ssh-copy-id gao@cloud03
5.5 测试。在cloud01机器上,使用ssh分别连接cloud02和cloud03:
$ ssh cloud02
$ ssh cloud03
这时会发现不需要输入密码,直接就ssh连接上了这两台机器。
6.集群配置-格式化HDFS文件系统
6.1 在cloud01机器上(master主机)上修改slaves 文件:
$ cd hadoop
$ vi etc/hadoop/slaves # 打开slaves 文件,写入下面三行
cloud01
cloud02
cloud03
6.2 在cloud01(NameNode)上,运行下面的命令来格式化一个新的文件系统:
$ hdfs namenode -format
注:这个格式化只做一次。如果要重新格式化HDFS,则要将原来的$HADOOP_HOME下的hddata/name 和hddata/data 目录清空,重新格式化。
7.集群测试
7.1 使用如下命令启动 HDFS 文件系统:
$ start-dfs.sh
7.2 这个命令将首先启动一个 masternode 中的 NameNode。然后它将启动在 slaves 文件中所提及到的所有机器中的 DataNode 服务。最后,它将启动第二个 NameNode。
7.3 HDFS 带有一个监控 web 控制台来验证安装以及监视 HDFS 集群。
它还能让用户探索 HDFS文件系统的内容。该 HDFS 监控控制台可以通过下面的 URL 进行访问:
http://{NAMENODE}:50070/
查看监控控制台检查是否能看到 HDFS 启动页面。这里,将{NAMENODE}替换为运行 HDFSNameNode 的节点的 IP 地址。
http://localhost:50070/ # NameNode URL
7.4 另外,还可以使用如下的命令来获得 HDFS 状态的报告:
$ hadoop dfsadmin -report
或
$ hdfs dfsadmin -report
查看文件块组成
$ hdfs fsck /-files -blocks
7.5 运行下面的命令来启动 YARNservice 服务:
$ start-yarn.sh
7.6 运行下面的命令来启动 MapReduceJobHistoryServer。这可以启用用于 MapReduce job历史的 web控制台:
$ mr-jobhistory-daemon.sh start historyserver # 启用历史服务
$ mr-jobhistory-daemon.sh stop historyserver # 关闭历史服务
7.7 通过 jps 命令列表显示进程,以检查安装情况。
Master 节点将列出 NameNode、 ResourceManager 和 JobHistoryServer 服务。
Slave 节 点 将 列 出 DataNode 和 NodeManager服务:
$ jps
7.8 访问 http://{MASTER_NODE}:8188/,访问用于可用的 ResourceManager 的基于 web 的控制台页面。
http://localhost:8088/// Node Manager 和 Resource Manager 的 URL
7.9 运行 pi 程序(蒙特卡罗程序):
$ hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar pi 10 20
7.10最后,使用如下的命令关闭 YARNservice 和 HDFSservice:
$ stop-yarn.sh
$ stop-dfs.sh
8.在Hadoop上执行MR程序
8.1 启动HDFS集群:
$ start-dfs.sh
8.2 使用jps命令查看当前节点上运行的服务:
$ jps
8.3 将“单词记数”程序的输入数据文件(夹)上传到HDFS文件系统的根目录;
$ hdfs dfs -copyFromLocal ~/wordcount/wc-input /
$ hdfs dfs -ls /
$ hdfs dfs -ls /wc-input
$ hdfs dfs -cat /wc-input/sample.txt
8.4 启动yarn:
$ start-yarn.sh
$ jps
8.5 进入到"单词记数"程序.jar包所在的目录,执行以下命令,将作业提交给Hadoop执行:
$ cd ~/wordcount
$ hadoop jar wcone.jar com.xlw.WordCountDriver /wc-input /wc-output
8.6 查看运算结果:
$ hdfs dfs -cat /wc-output/part-r-00000
8.7 将运算结果文件下载到本地:
$ hdfs dfs -copyToLocal /wc-output ~/wordcount/wc-output2
8.8 关闭集群:
$ stop-yarn.sh
$ stop-dfs.sh
说明:如果想要重复运行,那么在每次运行程序前,要先将wc-output目录删除。
附件:
# 文件hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_51
# 文件core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://cloud01:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>执行读写操作时的缓冲区大小。应该是4096的倍数(4096 on Intel x86)</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/will/hdfsdata/tmp</value>
</property>
# 文件hdfs-site.xml
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>cloud01:9001</value>
<description>secondarynamenodehttp服务器地址和端口</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/will/hdfsdata/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/will/hdfsdata/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
# 文件mapred-site.xml:(只有模板文件,拷贝一份,改名为mapred-site.xml)
$ cp mapred-site.xml.template mapred-site.xml
# 配置内容如下:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>cloud01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>cloud01:19888</value>
</property>
# 文件yarn-site.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>
<!--将yarn.resourcemanager.hostname的值修改为master机器的ip地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>cloud01</value>
</property>