javac WordCount.java -d /home/你的用户名/WordCount
0. 参考
《Hadoop权威指南》第二版 附录A
1. 运行环境
Ubuntu 8.04
JDK6
2. 软件包
hadoop-0.20.2.tar.gz
http://labs.renren.com/apache-mirror/hadoop/core/
3. 单机模式步骤
Step1. 启动Ubuntu 8.04,打开终端。安装JDK 1.6 并键入java命令测试
sudo -s
sudo apt-get install sun-java6-jdk sun-java6-jre
Step2. 设置系统路径JAVA_HOME,(使用export命令行声明的变量在关闭shell时失效,所以请自行修改把export语句加到~/.bashrc)
export JAVA_HOME=/usr/lib/jvm/java-6-sun
Step3. 解压hadoop-0.20.2.tar.gz到路径 /home/你的用户名/hadoop-0.20.2
export HADOOP_INSTALL=/home/你的用户名/hadoop-0.20.2
export PATH=$PATH:$HADOOP_INSTALL/bin
测试
hadoop version
Step4. 编译自带的例子WordCount.java, 在路径/home/你的用户名/hadoop-0.20.2/src/examples/org/apache/hadoop/examples下面。
编译前去掉源文件中的包名称,即注释掉第一行。
//package org.apache.hadoop.examples;
添加编译所需的CLASS_PATH路径:
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$HADOOP_INSTALL/hadoop-0.20.2-core.jar:$HADOOP_INSTALL/lib/commons-cli-1.2.jar
建一个文件夹存放编译的class文件,/home/你的用户名/WordCount,开始编译:
编译完后在/home/admin/WordCount目录会发现三个class文件WordCount.class,WordCount$Map.class,WordCount$Reduce.class。
cd /home/admin/WordCount
然后执行:
jar cvf WordCount.jar *.class
就会生成 WordCount.jar 文件。
Step5. 构造一些输入数据,input1.txt和input2.txt的文件里面是一些单词,放到jar同一层目录。如下:
[admin@host WordCount]$ cat input1.txt
Hello, i love china
are you ok?
[admin@host WordCount]$ cat input2.txt
hello, i love word
You are ok
在hadoop上新建目录,和put程序运行所需要的输入文件:
hadoop fs -mkdir /tmp/input
hadoop fs -mkdir /tmp/output
hadoop fs -put input1.txt /tmp/input/
hadoop fs -put input2.txt /tmp/input/
Step6. 运行程序,会显示job运行时的一些信息:
hadoop jar WordCount.jar WordCount /tmp/input /tmp/output #如果提示已存在/tmp/output,换个文件夹即可
4. 伪分布式步骤
Step1 注意:启动伪分布式模式之前,需要配置SSH无密码登陆(见hadoop权威指南附录A),以及在conf/hadoop-env.sh中设置JAVA_HOME.
sudo apt-get install ssh
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
注意这里有个陷阱, ~/.ssh/在home文件夹下面,你要确保authorized_keys只对其所有者root开放读写权限:
chmod 644 authorized_keys
然后才能测试无密码登陆:
ssh localhost
# The java implementation to use. Required.
export JAVA_HOME=/usr/lib/jvm/java-6-sun
Step2 然后修改conf目录中的xml文件:
1)修改conf/core-site.xml,这里要注意hadoop.tmp.dir的设置,如果不设置,则默认设为/tmp文件夹,每次重启后/tmp会被清除,这样造成namenode无法启动的问题,还有端口选择49000和49001防止与其他程序冲突。
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:49000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop/hadoop-${user.name}</value>
</property>
</configuration>
2)修改conf/mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:49001</value>
</property>
</configuration>
3)修改conf/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
#参数 fs.default.name 指定 NameNode 的 IP 地址和端口号。缺省值是 file:///, 表示使用本地文件系统, 用于单机非分布式模式。此处我们指定使用运行于本机 localhost 上的 NameNode。
#参数 mapred.job.tracker 指定 JobTracker 的 IP 地址和端口号。缺省值是 local, 表示在本地同一 Java 进程内执行 JobTracker 和 TaskTracker, 用于单机非分布式模式。此处我们指定使用运行于本机 localhost 上的 JobTracker ( 用一个单独的 Java 进程做 JobTracker )。
#参数 dfs.replication 指定 HDFS 中每个 Block 被复制的次数,起数据冗余备份的作用。 在典型的生产系统中,这个数常常设置为3。
Step3
hadoop namenode -format
cd $HADOOP_INSTALL/bin/
start-all.sh
step4
访问http://127.0.0.1:50070和http://127.0.0.1:50030测试成功
5. windows下eclipse连接虚拟机中的hadoop注意事项
必须将虚拟机的/etc/host中的127.0.0.1项目去掉,添加真实IP地址对应主机名和localhost,否则windows中不能连接“修改conf目录中的xml文件”步骤中设置的49000和49001端口。
确保windows可以
telnet 虚拟机ip 9000
telnet 虚拟机ip 9001
在hadoop-env.sh加入export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true以使用ipv4监听端口。
之后,在服务器端配置,具体是在conf/mapred-site.xml中添加下面的配置,这一部为了eclipse里面可以显示高级选项(见下文):
<property>
<name>hadoop.job.ugi</name>
<value>root,abc123456</value>
<description>hadoop user access password</description>
</property>
<property>
<name>mapred.system.dir</name>
<value>/home/hadoop/hadoop-0.20.0/tmp/mapred/system</value>
<description></description>
</property>
具体设置过程见:
http://galpha.iteye.com/blog/1044355
http://hi.baidu.com/coolsunsky/blog/item/c21770ca43ff9554f31fe748.html
http://blog.youkuaiyun.com/yangchao228/article/details/6646977
6. 测试运行
在hadoop所在目录里有几个jar文件,其中hadoop-examples-0.20.203.0.jar就是我们需要的,它里面含有wordcount,咱们使用命令建立测试的文件
(1)先在本地磁盘建立两个输入文件file01 和file02:
$ echo “Hello World Bye World” > file01
$ echo “Hello Hadoop Goodbye Hadoop” > file02
(2)在hdfs 中建立一个input 目录:
$ hadoop fs –mkdir input
(3)将file01 和file02 拷贝到hdfs 中:
$ hadoop fs –copyFromLocal /home/hexianghui/soft/file0* input
(4)执行wordcount:
$ hadoop jar hadoop-0.20.1-examples.jar wordcount input output
(5)完成之后,查看结果:
$ hadoop fs -cat output/part-r-00000
结果为:
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2