本文将讨论在Ubuntu下搭建Hadoop,同时在Eclipse下开发MapReduce程序。
环境配置:Ubuntu12.0.4、Hadoop0.20.2、Eclipse3.7.2、JDK6
第一步:安装JDK和配置环境变量
下载jdk的bin文件,jdk-6u30-linux-i586.bin,将其复制到/usr/local目录下
$ sudo cp jdk-6u30-linux-i586.bin /usr/local/
$ sudo ./jdk-6u30-linux-i586.bin #安装jdk
$ sudo gedit /etc/profile #添加环境变量
#在/etc/profile文件末尾输入如下内容
#set java environment
JAVA_HOME=/usr/locla/java/jdk1.6.0_30
export JRE_HOME=JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#接下来重新运行配置文件
$ source /etc/profile
第二步:添加Hadoop用户并使其拥有sudo权限(参考:http://blog.csdn.net/xw13106209/article/details/6064368)
$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hadoop
$ su -
$ chmod u+w /etc/sudoers
$ gedit /etc/sudoers
#在root ALL=(ALL) ALL后面添加hadoop ALL=(ALL) ALL
$ chmod u-w /etc/sudoers
第三步:安装ssh并配置ssh
$ sudo apt-get install ssh
#查看ssh版本 ssh -version
安装完成后,输入ssh localhost
输入当前用户的密码,回车就ok了。(说明安装成功,同时ssh登录需要密码)
切换到hadoop用户,进入到hadoop目录下,生成公钥,为了正确生成密钥,ls -ld ~查看/home/hadoop目录的权限,如下图
如下命令:
$ su hadoop
$ cd /home/hadoop
$ ssh-keygen -t rsa -P "" #实现无密码登录
一直按回车后,进入.ssh目录如下命令:
$ cd .ssh
将公钥拷贝到authorized_keys中,如下命令:
$ cp id_rsa.pub authorized_keys
测试登录ssh
ssh localhost
若无需要输入密码,表示设置成功
第四步:安装Hadoop
切换到hadoop用户下,同时将hadoop拷贝到/home/hadoop目录下
$ cp -r /home/XXX/hadoop0.20.2 /home/hadoop/
第五步:配置Hadoop
(1)配置conf/hadoop-env.sh文件
export JAVA_HOME=/usr/locla/java/jdk1.6.0_30
修改为jdk的安装位置。
(2)配置conf/core-site.xml,core-default.xml在src/core目录下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>
1)fs.default.name是NameNode的URI。hdfs://主机名:端口/
2)hadoop.tmp.dir:Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。
(3)配置conf/mapred-site.xml,mapred-default.xml在src/mapred目录下
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>
1)mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。
(4)配置conf/hdfs-site.xml,hdfs-default.xml在src/hdfs目录下
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/dfs/name1, /home/hadoop/dfs/name2</value> #hadoop的name目录路径
<description> </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/dfs/data1, /home/hadoop/dfs/data2</value>
<description> </description>
</property>
<property>
<name>dfs.replication</name>
<!-- 我们的集群又一个结点,所以rep一份 -->
<value>1</vaue>
</property>
</configuration>
1) dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。
2) dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不同设备上。
3)dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。
(5)配置masters和slaves
配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。
第六步:启动Hadoop
切换到hadoop用户
$ su hadoop
进入hadoop目录,命令如下:
$ cd /home/hadoop/hadoop0.20.2
格式化hdfs文件系统,命令如下:
$ bin/hadoop namenode -format
启动hadoop,命令如下:
$ bin/start-all.sh
关闭hadoop,命令如下:
$ bin/stop-all.sh
查看hadoop守护进程,命令如下:
jps
第七步:管理和查看Hadoop运行状态
NameNode - http://localhost:50070/
JobTracker - http://localhost:50030/
第八步:测试Hadoop
新建目录input到hdfs,命令如下:
$ bin/hadoop fs -mkdir input
上传文件到input目录,命令如下:
$ bin/hadoop fs -put /home/hadoop/words.txt input
运行WordCount程序,命令如下:
$bin/hadoop jar hadoop-0.20.2-examples.jar wordcount input output
查看结果,命令如下:
$ bin/hadoop fs -cat output/part-00000
基于Eclipse平台开发MapReduce程序
步骤如下:
添加hadoop插件到eclipse/plugins目录下,命令如下:
$ cp /home/hadoop/hadoop-eclipse-plugin-0.20.3-SNAPSHOT.jar /usr/lib/eclipse/plugins
启动eclipse后,打到MapReduce视图,操作如下:
Window -> Open Perspective -> Other 选择Map/Reduce
在eclipse下端,控制台旁边会多一个Tab,叫“Map/Reduce Locations”,在下面空白的地方点右键,选择“New Hadoop location...”
在弹出的对话框中填写如下内容:
Location name:local
Map/Reduce Master(Job Tracker的IP和端口,根据mapred-site.xml中配置的mapred.job.tracker来填写)
DFS Master(Name Node的IP和端口,根据core-site.xml中配置的fs.default.name来填写)
添加WordCount程序,同时配置输入参数
Run As -> Run Configures... 选择WordCount程序,在Arguments中配置运行参数:/user/hadoop/input /user/hadoop/output
以run on hadoop运行WordCount