准备工作:

  • Eclipse
  • Maven
  • JDK1.8
  • hadoop集群(我使用的是华为的MRS服务)

安装JDK+Eclipse

安装Maven

  1. 官方下载
  2. 解压后放在喜欢的文件夹中,并设置好系统PATH路径
  3. win+cmd 输入 mvn --version检测是否安装成功

配置eclipse的Maven

  1. eclipse-->Window-->Preferences
    1.png
    2.png
  2. 点击add后,定位到Maven所在的目录finish
  3. 将maven选项勾选上
  4. User Settings 将Global Setting的路径定位到/Maven目录/conf/settings.xml
    3.png
  5. 点击OK

新建Maven工程

File-->New-->Project

输入Maven,点击Maven Project ,点击Next

4.png
5.png
6.png

构建完成后再目录结构中,修改pos.xml配置文件

7.png

中间加入以下依赖内容

<name>MyWordCount</name>
<url>http://maven.apache.org</url>

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
  </dependency>

  <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.7.3</version>
  </dependency>
  <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.7.3</version>
  </dependency>
  <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>2.7.3</version>
  </dependency>
  <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-core</artifactId>
      <version>2.7.3</version>
  </dependency>

</dependencies>
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.1.0</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <!-- main()所在的类,注意修改 -->
                <mainClass>com.MyWordCount.WordCountMain</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

ctrl+s保存,右键项目Refresh 刷新。

这个时候会下载相应的依赖包,可能会很久

我们要写的主程序是在src/main/java中com.MyWordCount包下,可以把原来的文件删除,然后开始写我们需要的Wordcount程序

WordCountMain

package com.MyWordCount;

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;

public class WordCountMain {

    public static void main(String[] args) throws Exception {
        //1.创建一个job和任务入口
        Job job = Job.getInstance(new Configuration());
        job.setJarByClass(WordCountMain.class);  //main方法所在的class

        //2.指定job的mapper和输出的类型<k2 v2>
        job.setMapperClass(WordCountMapper.class);//指定Mapper类
        job.setMapOutputKeyClass(Text.class);    //k2的类型
        job.setMapOutputValueClass(IntWritable.class);  //v2的类型

        //3.指定job的reducer和输出的类型<k4  v4>
        job.setReducerClass(WordCountReducer.class);//指定Reducer类
        job.setOutputKeyClass(Text.class);  //k4的类型
        job.setOutputValueClass(IntWritable.class);  //v4的类型

        //4.指定job的输入和输出
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        //5.执行job
        job.waitForCompletion(true);
    }
}

WordCountReducer

package com.MyWordCount;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

//                                              k3      v3         k4       v4
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    @Override
    protected void reduce(Text k3, Iterable<IntWritable> v3,Context context) throws IOException, InterruptedException {

        //对v3求和
        int total = 0;
        for(IntWritable v:v3){
            total += v.get();
        }

        //输出   k4 单词   v4  频率
        context.write(k3, new IntWritable(total));
    }
}

WordCountMapper


   package com.MyWordCount;

   import java.io.IOException;

   import org.apache.hadoop.io.IntWritable;
   import org.apache.hadoop.io.LongWritable;
   import org.apache.hadoop.io.Text;
   import org.apache.hadoop.mapreduce.Mapper;

   //                                      泛型    k1         v1    k2       v2
   public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

       @Override
       protected void map(LongWritable key1, Text value1, Context context)
               throws IOException, InterruptedException {

           //数据: I like MapReduce
           String data = value1.toString();

           //分词:按空格来分词
           String[] words = data.split(" ");

           //输出 k2    v2
           for(String w:words){
               context.write(new Text(w), new IntWritable(1));
           }
       }

}

编译打包

win+cmd,进入到这个项目的目录中:******/MyWordCount
8.png
执行mvn打包命令: mvn clean package

注意:要保持网络畅通,因为项目打包时会下载一些文件。
9.png

回到Eclipse在target 刷新就能看到生成好的jar文件了

使用华为云MRS服务测试程序

确定已经完成了MRS服务订购安装,OBS桶的搭建

服务列表-->对象储存服务-->桶(注意桶和MRS必须在同一个大区)-->对象-->新建文件夹(program)和新建文件夹(input)

进入这两个文件夹,并上传刚才打包好的jar文件,和需要运行的文本文件

服务列表-->MapReduce服务-->现有集群-->进入-->文件管理-->导入数据

10.png
11.png

作业管理-->添加

12.png
执行参数可以不用填写

hadoop jar ../MyWordCount-0.0.1-SNAPSHOT.jar MyWordCount /input /output

这个命令系统会自动生成,直接点击确定即可。
注意output文件夹一定不能存在,需要由程序自行建立,否则会报错

可以查看日志,来看程序运行情况,以及报错,最后的结果是储存在hdfs中了,我们再按照前面步骤,将其导出至obs中,就可以进行结果的下载了。

13.png

目前解决的问题只有这么多,比较大的坑点一个是本地程序的打包过程,还有就是华为MRS服务似乎没有办法直接从obs中调用程序和数据,必须要转移到hdfs中,才可以使用。

文章作者: Hao.Jia
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hao.Jia's Blog
hadoop,java
喜欢就支持一下吧