IDEA开发MapReduce的worldcount程序
在hadoop-MapReduce-yarn集群的搭建完成之后(参考上篇博客)。
运行的环境有了,现在要做开发。基于IDEA在maven的层面去做,如果想写api的话,maven中要补全库。在poem.xml中要补全一些东西。
1.找到maven的网站,搜索hadoop
上次做hdfs开发的时候引了Apache Hadoop Common和Apache Hadoop HDFS
其实hadoop想的特别好,他有一个Apache Hadoop Client Aggregator聚合,他会把客户端开发的相关的poem都聚合起来。所以导入这一个,可以把hdfs开发和mapreduce开发的所有的jar包都可以引入。
为什么在hdfs开发的时候引入了Apache Hadoop Common和Apache Hadoop HDFS?
因为有的项目是只做hdfs开发,不会做mapreduce开发的。hdfs也可以单独开发。如果做mapreduce,导入Apache Hadoop Client Aggregator这一个就可以了。
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.5</version>
</dependency>
在poem找到<depedencies></dependencies>
粘贴进来,然后poem就会自动导相关的包,这个版本要求和hadoop集群的版本是一致的。最好是要保持一致,这是开发当中最关键的一件事情,一个常识。虽然高版本会兼容低版本。把这个包导完,poem这一块就搞定了。
接下来就是开发的事情。
在mapreduce开发的时候强调了,有客户端、map环节、reduce环节,这三个环节,先在目录中新建一个包路径,现在是基于hadoop下面的mapreduce的api里的wc(wordcount)自己的实现。
在wc路径下先写出一个MyWordCount这么一个类:
package cn.kgc.kb09.hadoop.mapreduce.wc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
/**
* @Author: ChaoKeAiMuZhi
* @Date: 2020/9/14 21:50
* @Description:
**/
public class MyWordCount {
//先写客户端,客户端和map和reduce未来都是JVM进程,所以它牵扯到主方法,要先写一个主方法。
public static void main(String[] args) throws Exception{
//它也是一个CS架构,未来也要联系resource manager,name node, 它也需要知道集群里有哪些角色。
//牵扯到一个东西,资源目录resources,在maven目录结构中必须有这个s,它对路径有强硬的约束。如果不写,未来打包的时候,target里面可能就没有这些相关的配置。
//目前resources里放的文件只有关于hdfs的core-site.xml和hdfs-site.xml,未来客户端在windows上跑的时候,也可能需要有mapred-site.xml和yarn-site.xml两个文件,复制到项目当中的resources目录下
//客户端怎么知道节点的主在哪里?需要解析配置文件。hadoop有一个现成的东西叫做configuration,导入org.apache.hadoop.conf的Configuration
Configuration conf = new Configuration(true);//true默认加载放在根目录下resources里的配置文件
//但是configuration只是一个解析xml文件的工具类,最终会得到conf这个Configuration对象,包含了所有的配置信息,它并不是客户端。
//在hdfs里的客户端时FileSystem类,在mapreduce当中也做了一个抽象,叫做Job,导入org.apache.hadoop.mapreduce
//Job.getInstance获取一个实例,把conf传递进来,最终就可以得到Job这个客户端对象。这才是真正的客户端。
Job job=Job.getInstance(conf);
//未来要养成一个习惯,什么事情都要去敢看源码/注解。在maven有一个功能,在maven导完相关的依赖的时候,里面是可以下载相关的源码和文档的。
//右边栏->第三个download图标->download sources and documentation把相关的东西都下载一下
//下载完之后点Job进去,上面会有一些描述,这个Job主要时做一些什么事情,Job客户端对象最终为了提交作业的