Hadoop支持多种语言开发MapReduce程序,但是对Java语言的支持最好,其提供了很多方便的Java API接口。
那么如何使用Java来编写一个MapReduce程序呢?编写一个MapReduce程序需要新建三个类:Mapper类、Reducer类、程序执行主类。当然,Mapper类和Reducer类也可以作为内部类放在程序执行主类中。具体编写步骤如下。
新建一个自定义Mapper类MyMapper.java,该类需要继承MapReduce API提供的Mapper类并重写Mapper类中的map()方法,例如以下代码:
上述代码中的map()方法有三个参数,解析如下。
MapReduce框架会自动调用map()方法并向其传入所需参数的值。传入的每个<key,value>对将调用一次map()方法。
Mapper是MapReduce提供的泛型类,继承Mapper需要传入4个泛型参数,前两个参数为输入key和value的数据类型,后两个参数为输出key和value的数据类型。
Mapper类的定义源码如下:
新建一个自定义Reducer类MyReducer.java,该类需要继承MapReduce API提供的Reducer类并重写Reducer类中的reduce()方法,例如以下代码:
上述代码中的reduce ()方法有三个参数,解析如下。
MapReduce框架会自动调用reduce()方法并向其传入所需参数的值。传入的每个<key,value-list>对将调用一次reduce ()方法。
与Mapper类类似,Reducer也是MapReduce提供的泛型类,继承Reducer同样需要传入4个泛型参数,前两个参数为输入key和value的数据类型,后两个参数为输出key和value的数据类型。
Reducer类的定义源码如下:
程序执行主类为MapReduce程序的入口类,主要用于启动一个MapReduce作业。
新建一个程序执行主类MyMRApplication.java,在该类的main()方法中添加任务的配置信息,并指定任务的自定义Mapper类和Reducer类,代码结构如下:
提交程序之前需要启动Hadoop集群,包括HDFS和YARN。因为HDFS存储了MapReduce程序的数据来源,而YARN则负责MapReduce任务的执行、调度以及集群的资源管理。
将包含自定义的Mapper类、Reducer类和程序执行主类的Java项目打包为jar包并上传到HDFS的NameNode节点,然后执行以下命令提交任务到Hadoop集群。
上述命令中的MyMRApplication.jar为程序打包后的jar文件,com.hadoop.mr为程序执行主类MyMRApplication.java所在的包名称。
在5.6节的案例分析中,会对MapReduce的程序编写与任务提交进行详细讲解。