目录
1.实验目的
2.实验内容(hadoop伪分布式与分布式集群环境配置)
3.运行wordcount词频统计程序
一 . 实验目的
通过学习和使用开源的 Apache Hadoop工具,亲身实践云计算环境下对海量数据的处理,理解并掌握分布式的编程模式 MapReduce,并能够运用MapReduce编程模式完成特定的分布式应用程序设计,用于处理实际的海量数据问题。
二 . 实验内容
1.实验环境搭建
1.1. 前期准备
操作系统: Linux Ubuntu 10.04
Java开发环境:需要JDK 6及以上,Ubuntu 10.04默认安装的OpenJDK可直接使用。不过我使用的是sun的jdk,从官方网站上下载,具体可以参考博客:ubuntu下安装JDK并配置java环境
Hadoop开发包:试过了hadoop的各种版本,包括0.20.1,0.20.203.0和0.21.0,三个版本都可以配置成功,但是只有0.20.1这个版本的eclipse插件是可用的,其他版本的eclipse插件都出现各种问题,因此当前使用版本为hadoop-0.20.1
Eclipse:与hadoop-0.20.1的eclipse插件兼容的只有一些低版本的eclipse,这里使用eclipse-3.5.2。
1.2. 在单节点(伪分布式)环境下运行Hadoop
(1)添加 hadoop用户并赋予sudo权限(可选)
为 hadoop应用添加一个单独的用户,这样可以把安装过程和同一台机器上的其他软件分离开来,使得逻辑更加清晰。可以参考博客:Ubuntu-10.10如何给用户添加sudo权限。
(2)配置 SSH
无论是在单机环境还是多机环境中, Hadoop均采用SSH来访问各个节点的信息。在单机环境中,需要配置 SSH 来使用户 hadoop 能够访问 localhost 的信息。首先需要安装 openssh-server。
- sudo apt-get install openssh-server
其次是配置 SSH使得Hadoop应用能够实现无密码登录:
- su - hadoop
- ssh-keygen -trsa -P ""
- cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
第一条命令将当前用户切换为hadoop(如果当前用户就是hadoop,则无需输入),第二条命令将生成一个公钥和私钥对(即id_dsa和id_dsa.pub两个文件,位于~/.ssh文件夹下),第三条命令使得hadoop用户能够无需输入密码通过SSH访问localhost。这时可通过以下命令来验证安装是否成功(如果没有提示输入密码直接登录成功,则说明安装成功):
- ssh localhost
(3) 配置Hadoop
Hadoop的配置文件都放在/hadoop/conf这个文件夹下面,主要是四个配置文件,分别是core-site.xml,hadoop-env.sh,hdsf-site.xml和mapred-site.xml。
修改conf/hadoop-‐env.sh,设置JAVA_HOME,在该文件中找到如下行,去掉前面的注释。
将
- # Thejava implementation to use. Required.
- # export JAVA_HOME=/usr/lib/j2sdk1.5-sun
修改为:
- # Thejava implementation to use. Required.
- export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_27
修改core-site.xml内容如下:
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
- <!-- Put site-specific property overrides in thisfile. -->
- <configuration>
- <property>
- <name>fs.default.name</name>
- <value>hdfs://localhost:9000</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/home/hadoop/program/tmp-${user.name}</value>
- </property>
- </configuration>
修改conf/hdfs-site.xml为
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
- <!-- Put site-specific property overrides in thisfile. -->
- <configuration>
- <property>
- <name>dfs.replication</name>
- <value>1</value>
- </property>
- </configuration>
修改conf/mapred-site.xml为:
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
- <!-- Put site-specific property overrides in thisfile. -->
- <configuration>
- <property>
- <name>mapred.job.tracker</name>
- <value>localhost:9001</value>
- </property>
- </configuration>
(4) 运行Hadoop(当前用户为hadoop)
以上操作已经完成对Hadoop的配置,接下来是运行Hadoop。第一步需要进行格式化HDFS,运行脚本主要位于HADOOP_HOME/bin目录下,注意HADOOP_HOME为解压缩之后的Hadoop根目录,此处为/home/hadoop/program/hadoop-0.20.1。格式化HDFS命令为: (假设当前目录是已经在/home/hadoop/program/hadoop-0.20.1/bin/) 下
- ./hadoop namenode –format
- ./start-all.sh
- jps
- 19811 TaskTracker
- 19674 SecondaryNameNode
- 19735 JobTracker
- 19497 NameNode
- 20879 TaskTracker
- 21810 Jps
- ./stop-all.sh
http://localhost:50030/ - Hadoop 管理介面
http://localhost:50060/ - Hadoop Task Tracker 状态
http://localhost:50070/ - Hadoop DFS 状态
1.3. 在多节点(分布式)环境下运行Hadoop
搭建多节点集群的思想主要是在每一台机器上分别搭建好单机环境,再将几台机器整合成一个集群。因此,在此之前,请确保每一台机器都如1.2节中所述搭建好了单机环境(最好是相同的结构)。 这里说的相同结构是指hadoop安装在项目的目录下,然后多个节点使用都使用相同的用户名操作hadoop集群。 比如使用用户名hadoop。这个在 hadoop搭建注意事项汇总 中的第一条里面有提到。我第一次部署的时候,因为第一台slave机器使用hadoop账户配置hadoop环境,而第二台master机器使用xuwei这个账户配置hadoop环境,这样在ssh的时候也会出现问题。我使用xuwei账户ssh slave,找到的不是hadoop@slave,而是xuwei@slave。 最后在slave上新建了一个hadoop账户才解决问题。(1) 设置/etc/hosts文件
实验中两台机器处于同一局域网中,其中一台作为master,ip地址为192.168.0.55,一台作为slave,ip地址为192.168.0.42。更新两台机器的/etc/hosts文件,使用如下命令:
- sudo gedit /etc/hosts
添加以下内容:
- # /etc/hosts (for master AND slave)
- 192.168.0.55 master
- 192.168.0.42 slave
(2) 设置节点之间的无密码SSH登录
这里要求master上的用户hadoop必须能够无密码登录到master和slave两台机器上。经过1.2节第(2)步的配置,已经可以在单机上进行密码SSH登录,这里只需设置由master无密码登录到slave,采用如下命令即可: 在master上运行:- ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@slave
这条命令的意思是将master上的公钥拷贝到slave上,这样下次ssh slave的时候slave就认识master,无需在输入密码验证。
如下命令可以测试SSH连接成功与否:- ssh master
- ssh slave
(3) 修改集群配置文件
hadoop集群的架构分为两层:HDFS层和MapReduce层,在HDFS层,master将作为NameNode和DataNode,slave作为DataNode;在MapReduce层,master将作为JobTracker和TaskTracker,而slave将作为TaskTracker。值得一提的是,本次实验中master节点既作为管理节点,又担当数据节点。接下来需要修改$HADOOP_HOME/conf/下的配置文件。 在master节点上修改 conf/masters文件,添加如下内容:- master
- master
- slave
- master
- slave
- anotherslave01
- anotherslave02
- <property>
- <name>fs.default.name</name>
- <value>hdfs://master:9000</value>
- </property>
- <property>
- <name>mapred.job.tracker</name>
- <value>hdfs://master:9001</value>
- </property>
- <property>
- <name>dfs.replication</name>
- <value>2</value>
- </property>
(4) 格式化HDFS
注意: 如果之前单机环境下格式化过HDFS建议把之前的文件删除,否则可能会出现异常 (HDFS目录即之前设置的${hadoop.tmp.dir}\dfs目录)。格式化命令和单机情况下类似, 只是需要在master节点上运行。- ./hadoop namenode -format
(5) 启动和停止集群
在master节点上首先启动HDFS,其命令为:- ./start-dfs.sh
- hadoop@master:~$ jps
- 14799 NameNode
- 15314 Jps
- 14880 DataNode
- 14977 SecondaryNameNode
- hadoop@master:~$ jps
- 15183 Jps
- 15616 DataNode
- ./start-mapred.sh
- hadoop@master:~$ jps
- 14799 NameNode
- 15314 Jps
- 14880 DataNode
- 14977 SecondaryNameNode
- 15686 TaskTracker
- 15596 JobTracker
- hadoop@slave:~$ jps
- 15183 DataNode
- 15897 TaskTracker
- 16284 Jps
- ./stop-mapred.sh
- ./stop-dfs.sh
三.运行WordCount词频统计程序
代码参考博客:Hadoop WordCount改进实现正确识别单词以及词频降序排序。
在eclipse下运行配置参照: eclipse运行wordcount参数配置