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。
为 hadoop应用添加一个单独的用户,这样可以把安装过程和同一台机器上的其他软件分离开来,使得逻辑更加清晰。可以参考博客:Ubuntu-10.10如何给用户添加sudo权限。
无论是在单机环境还是多机环境中, 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
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>
./hadoop namenode –format启动单节点集群:
./start-all.sh这个操作会在本机上启动Namenode,SecondaryNameNode,Datanode,JobTracker和TaskTracker共计5个JVM进程,可以通过java自带的jps命令查看。
jps通过jps命令可以查看到进程如下:
19811 TaskTracker 19674 SecondaryNameNode 19735 JobTracker 19497 NameNode 20879 TaskTracker 21810 Jps停止单节点集群:
./stop-all.sh另外可以通过以下网址查看节点的运行情况:
sudo gedit /etc/hosts
添加以下内容:
# /etc/hosts (for master AND slave) 192.168.0.55 master 192.168.0.42 slave
ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@slave
这条命令的意思是将master上的公钥拷贝到slave上,这样下次ssh slave的时候slave就认识master,无需在输入密码验证。
如下命令可以测试SSH连接成功与否:ssh master ssh slave
master在master节点上修改conf/slaves文件,添加如下内容(这表明master节点具有双重角色,即做master,又做slave):
master slave如果需要添加更多slave,则可以在conf/slaves中将其他节点的名称添加进去,如下所示:
master slave anotherslave01 anotherslave02在所有节点上修改conf/core-site.xml,更改fs.default.name的值为hdfs://master:9000,具体为:
<property> <name>fs.default.name</name> <value>hdfs://master:9000</value> </property>在所有节点上修改conf/mapred-site.xml,将JobTracker的地址改为master具体为:
<property> <name>mapred.job.tracker</name> <value>hdfs://master:9001</value> </property>在所有节点上修改conf/hdfs-site.xml,将更改dfs.replication的值,这个参数决定了集群中一个文件需要保存为多少个拷贝。其默认值为3,因本次试验节点数为2,故更改为2。具体为:
<property> <name>dfs.replication</name> <value>2</value> </property>
./hadoop namenode -format
./start-dfs.sh其结果是在master节点上启动NameNode,SecondaryNameNode和DataNode,在所有slave节点上启动DataNode,通过jps命令可以查看master上启动的服务列表:
hadoop@master:~$ jps 14799 NameNode 15314 Jps 14880 DataNode 14977 SecondaryNameNode此时slave上的进程列表如下:
hadoop@master:~$ jps 15183 Jps 15616 DataNode其次,在master节点上启动MapReduce,其命令为:
./start-mapred.sh这样将会在master 节点上启动JobTracker 和TaskTracker , 在所有slave 节点上启动TaskTracker,通过jps命令可以查看master上启动的服务列表:
hadoop@master:~$ jps 14799 NameNode 15314 Jps 14880 DataNode 14977 SecondaryNameNode 15686 TaskTracker 15596 JobTracker此时slave上的进程列表如下:
hadoop@slave:~$ jps 15183 DataNode 15897 TaskTracker 16284 Jps如要停止集群,则需要将上述步骤反过来运行,首先在master上运行
./stop-mapred.sh其次在master上运行以下命令停止HDFS:
./stop-dfs.sh这个过程也可通过jps命令来查看是否完成。
代码参考博客:Hadoop WordCount改进实现正确识别单词以及词频降序排序。
在eclipse下运行配置参照: eclipse运行wordcount参数配置