一、配置Windows环境
部署hadoop请参考另外一篇文章Hadoop3.1伪分布式环境搭建(包含示例测试和详细错误解决方式)
-
把部署在Linux下的Hadoop安装包解压(解压缩工具要以管理员身份运行)。并配置环境变量
例如解压到E:\software\hadoop-3.1.2
配置环境变量
HADOOP_HOME=E:\software\hadoop-3.1.2 PATH新增 %HADOOP_HOME%\bin
-
将下载的对应版本的hadoop.dll和winutils.exe 复制到 %HADOOP_HOME%\bin\ 下。下载地址
-
在hosts文件下添加部署Hadoop所在服务器的主机名和IP的映射关系
C:\Windows\System32\drivers\etc\hosts
例如:
192.9.6.25 hadoop
二、新建IDEA maven项目
三、编写代码
-
修改pom.xml文件,添加hadoop依赖
<?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>org.example</groupId> <artifactId>hadoop-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <hadoop.version>3.2.0</hadoop.version> </properties> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> </dependency> </dependencies> </project>
-
新建包并编写三个类如下:
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /** * 启动类 * @author * @date 2020/8/19 19:38 */ public class WordCount { public static void main(String[] args) throws Exception { //为任务设定配置文件 Configuration conf = new Configuration(); // 定义一个job Job job = Job.getInstance(conf, "word count"); //设置执行任务的jar job.setJarByClass(WordCount.class); //设置Mapper类 job.setMapperClass(WordCountMapper.class); //设置Combine类 job.setCombinerClass(WordCountReducer.class); //设置Reducer类 job.setReducerClass(WordCountReducer.class); //设置job输出的key job.setOutputKeyClass(Text.class); //设置job输出的value job.setOutputValueClass(IntWritable.class); //设置输入文件的路径 FileInputFormat.addInputPath(job, new Path(args[0])); //设置输出文件的路径 FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; import java.util.StringTokenizer; /** * 定义Map类实现字符串分解 * @author * @date 2020/8/19 20:01 */ public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override public void map(Object key, Text value, Context context) throws IOException, InterruptedException { //将字符串拆解成单词 StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { //将分解后的一个单词写入word类 word.set(itr.nextToken()); //收集<key, value> context.write(word, one); } } }
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; /** * 定义Reduce类规约同一key的value * @author * @date 2020/8/19 20:01 */ public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; //遍历迭代values,得到同一key的所有value for (IntWritable val : values) { sum += val.get(); } result.set(sum); //产生输出对<key, value> context.write(key, result); } }
-
把Linux部署的HADOOP_HOME/etc/hadoop/ 下的core-site.xml和log4j.properties 复制到项目的resources下
全家福
-
配置启动
1) 准备好需要统计的文件并放到hdfs下,本例使用的时/input/hello.txt内容如下:
2) 配置启动类
这里要注意的是Program arguments,这里传入的远程hdfs上的输入文件和输出路径,hadoop是主机名。如果没有配置hosts,这里可以用IP。输出路径要保证在hdfs中不存在。
-
启动
每次解决完错误一定要先clean一下项目,避免出现不必要的问题。
启动时可能会报两个错误如下:
错误1: 没有权限
解决方式: 关闭hdfs权限检查,在HADOOP_HOME/etc/hadoop/hdfs-site.xml新增属性。然后重启。
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
错误2
解决方式: 关闭namenode的安全状态 ,linux执行hadoop dfsadmin -safemode leave
执行成功会输出日志,部分日志如截图:
-
查看结果
执行结果会输出到配置启动类时传入的参数对应的文件夹中,在hdfs上可查看输出结果