实例描述——WordCount
WordCount是一个很经典的MapReduce的例子,hadoop也自带了wordcount的mapreduce的example。wordcount也可说是集群计算中的helloworld。
wordcount是指,统计文件中出现的单词以及每个单词出现的次数。
比如说我们准备一个输入文件,我们可以选择txt格式的文件,我们要统计下面这个文件中每个单词出现的次数。
abc abc abc
ss ss
ttt
kk kk kk kk
tjaf
faf faf
然后我们预期的结果如下,也就是说我们生成的结果文件其内容大致如下所示,因为在mapreduce的过程中,会自动整理成排序的形式(由于map的数据结构),所以实际的结果的单词显示的顺序会与下面所显示的内容顺序不同。
abc 3
ss 2
ttt 1
kk 4
tjaf 1
faf 2
接下来会演示单机模式下的wordcount的编写过程
WordCount
环境准备
IDE推荐使用IDEA pro,准备好maven、hadoop文件,然后配置好hadoop的系统环境变量,jdk1.8。
首先创建一个maven项目,项目相关信息随意。
File -> settings,搜索maven,上面的蓝圈选择maven文件夹,下面的选择好自己的settings.xml。
settings.xml这个xml文件中需要配置好aliyun镜像和localrepository路径这两个内容。至于maven文件,Maven – Welcome to Apache Maven 这里可以下载。
settings文件如下,前几行的那个localRepository记得修改为自己的,默认是C:\Users\xxx\.m2\repository这个路径,xxx要换成自己的电脑的用户名,可以去看看。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>C:\Users\xxx\.m2\repository</localRepository>
<pluginGroups>
<pluginGroup>org.mortbay.jetty</pluginGroup>
</pluginGroups>
<proxies>
</proxies>
<servers>
<server>
<id>releases</id>
<username>ali</username>
<password>ali</password>
</server>
<server>
<id>Snapshots</id>
<username>ali</username>
<password>ali</password>
</server>
</servers>
<mirrors>
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
<mirror>
<!--This sends everything else to /public -->
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositoryies/central</url>
</mirror>
<mirror>
<!--This is used to direct the public snapshots repo in the
profile below over to a different nexus group -->
<id>nexus-public-snapshots</id>
<mirrorOf>public-snapshots</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/repositories/snapshots/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>development</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<profile>
<!--this profile will allow snapshots to be searched when activated-->
<id>public-snapshots</id>
<repositories>
<repository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>development</activeProfile>
<activeProfile>public-snapshots</activeProfile>
</activeProfiles>
</settings>
好了,IDEA的配置告一段落,在项目文件中,在根目录下可以看到IDEA自己创建的一个pom.xml文件,它用来存放maven的依赖,也就是需要使用到什么包,都可以写在里面,maven自己会去下载。
在这个示例中,可以将pom.xml修改为如下,换句话说在原来的基础之上将其中<dependencies>标签中的那三个<dependency>要添加好。复制且只复制<dependencies>中的内容,放到自己的pom.xml中。后去我们导成jar包的时候还需要添加新的<dependency>。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xunn</groupId>
<artifactId>HDFSClient</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
</project>
然后在项目中的src\main\resources下新建一个文件,文件名为log4j.properties,并添加如下代码段,作为log4j的配置信息。
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
在下图的位置创建package,然后建三个类。
然后,基本工作就准备完毕,接下来可以开始编写Mapper、Reducer和Driver的代码了。详见下一篇文章。