以WordCount为例,计算文件中每一个英文单词出现的次数,主要是这样的思路:
Map: 将原本文字转换为(key,value)的形式,其中key是word,value是单词出现的次数
Shuffle: 将相同的key排列在一起
Reduce: 将相同的key 的value相加
主要操作步骤分为这样几步:
- 编辑WordCount.java
- 编译WordCount.java
- 创建测试文本文件
- 运行WordCount.java
- 查看运行结果
结论前置,Hadoop MapReduce存在以下的缺点:
- 程序设计模式不容易使用,很难提高开发者效率
- 有运行效率问题,MapReduce需要将中间产生的数据保存到硬盘,因此会有读写数据延迟问题
- 似乎不支持实时处理,原始设计好像是以批处理为主
(1)编辑WordCount.java
# Step1 创建wordcount测试目录
mkdir -p ~/wordcount/input
# Step2 切换至wordcount测试目录
cd ~/wordcount
# Step3 复制WordCount.java程序代码
# 在Hadoop说明文件中就有WordCount.java的程序代码,所以可以直接复制,如图1
# 网址:http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v1.0
# Step4 编辑WordCount.java程序代码
sudo gedit WordCount.java
# Step5 复制刚才网址的java程序代码过来,保存并退出
# Main函数主要设置了map和reduce以及combiner的类,如图2
(2)编译WordCount.java
需要预先设置环境变量
# 编辑 ~/.bashrc
sudo gedit ~/.bashrc
# 在末尾输入
export PATH=${JAVA_HOME}/bin:${PATH}
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
source ~/.bashrc
# 开始编译
hadoop com.sun.tools.javac.Main WordCount.java
# 打包
jar cf wc.jar WordCount*.class
(3)创建测试文件
为了测试WordCount程序,我们可以使用Hadoop目录下的License.txt文件
# 复制
cp /usr/local/hadoop/LICENSE.txt ~/wordcount/input/
# 启动所有虚拟服务器master、data1、data2、data3
# 在master服务器启动hadoop multi-node Cluster
start-all.sh
# 上传测试文件到HDFS目录
hadoop fs - mkdir -p /user/hadooptest/wordcount/input
cd ~/wordcount/input
hadoop fs -copyFromLocal LICENSE.txt /user/hadooptest/wordcount/input
# 列出Hdfs文件
hadoop fs -ls /user/hadooptest/wordcount/input
命令 | 说明 |
---|---|
hadoop fs -mkdir | 创建HDFS目录 |
hadoop fs -ls | 列出HDFS目录 |
hadoop fs -copyFromLocal | 使用-copyFromLocal复制本地文件到HDFS |
hadoop fs -put | 使用-put复制本地文件到HDFS |
hadoop fs -cat | 列出HDFS目录下文件内容 |
hadoop fs -copyToLocal | 使用-copyToLocal将HDFS上的文件复制到本地 |
hadoop fs -get | 使用-get将HDFS上的文件复制到本地 |
hadoop fs -cp | 复制HDFS文件 |
hadoop fs -rm | 删除HDFS文件 |
(4)运行WordCount.java
cd ~/wordcount
# 运行WordCount.java,语句格式为hadoop jar wc.jar【输入文件】【输出目录】
hadoop jar wc.jar WordCount /user/hadooptest/wordcount/input/LICENSE.txt /user/hadooptest/wordcount/output
# 查看运行结果
hadoop fs -ls /user/hadooptest/wordcount/output
# _SUCCESS:代表程序运行陈宫
# part-r-00000:运行结果的文本文件
hadoop fs -cat /user/hadooptest/wordcount/output/part-r-00000|more
##### 如果需要再次执行,请先删除输出目录,否则会出现文件已经存在的报错信息
# hadoop fs -rm -R /user/hadooptest/wordcount/output/