通过API操作之前要先了解几个基本知识

一、hadoop的基本数据类型和java的基本数据类型是不一样的,但是都存在对应的关系

如下图

如果需要定义自己的数据类型,则必须实现Writable

hadoop的数据类型可以通过get方法获得对应的java数据类型

而java的数据类型可以通过hadoop数据类名的构造函数,或者set方法转换

二、hadoop提交作业的的步骤分为八个,可以理解为天龙八步

如下:

map端工作:

1.1 读取要操作的文件--这步会将文件的内容格式化成键值对的形式,键为每一行的起始位置偏移,值为每一行的内容

1.2 调用map进行处理--在这步使用自定义的Mapper类来实现自己的逻辑,输入的数据为1.1格式化的键值对,输入的数据也是键值对的形式

1.3 对map的处理结果进行分区--map处理完毕之后可以根据自己的业务需求来对键值对进行分区处理,比如,将类型不同的结果保存在不同的文件中等。这里设置几个分区,后面就会有对应的几个Reducer来处理相应分区中的内容

1.4 分区之后,对每个分区的数据进行排序,分组--排序按照从小到大进行排列,排序完毕之后,会将键值对中,key相同的选项 的value进行合并。如,所有的键值对中,可能存在

hello 1

hello 1

key都是hello,进行合并之后变成

hello 2

可以根据自己的业务需求对排序和合并的处理进行干涉和实现

1.5 归约(combiner)--简单的说就是在map端进行一次reduce处理,但是和真正的reduce处理不同之处在于:combiner只能处理本地数据,不能跨网络处理。通过map端的combiner处理可以减少输出的数据,因为数据都是通过网络传输的,其目的是为了减轻网络传输的压力和后边reduce的工作量。并不能取代reduce

reduce端工作:

2.1 通过网络将数据copy到各个reduce

2.2 调用reduce进行处理--reduce接收的数据是整个map端处理完毕之后的键值对,输出的也是键值对的集合,是最终的结果

2.3 将结果输出到hdfs文件系统的路径中

新建一个java项目,并导入hadoop包,在项目选项上右键,如图选择

找到hadoop的安装目录,选择所有的包

在找到hadoop安装目录下的lib,导入其中的所有包

新建JMapper类为自定义的Mapper类

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; //自定义的Mapper类必须继承Mapper类,并重写map方法实现自己的逻辑
public class JMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
//处理输入文件的每一行都会调用一次map方法,文件有多少行就会调用多少次
protected void map(
LongWritable key,
Text value,
org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, LongWritable>.Context context)
throws java.io.IOException, InterruptedException {
//key为每一行的起始偏移量
//value为每一行的内容 //每一行的内容分割,如hello world,分割成一个String数组有两个数据,分别是hello,world
String[] ss = value.toString().toString().split("\t");
//循环数组,将其中的每个数据当做输出的键,值为1,表示这个键出现一次
for (String s : ss) {
//context.write方法可以将map得到的键值对输出
context.write(new Text(s), new LongWritable(1));
}
};
}

新建JReducer类为自定义的Reducer

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; //自定义的Reducer类必须继承Reducer,并重写reduce方法实现自己的逻辑,泛型参数分别为输入的键类型,值类型;输出的键类型,值类型;之后的reduce类似
public class JReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
//处理每一个键值对都会调用一次reduce方法,有多少个键值对就调用多少次
protected void reduce(
Text key,
java.lang.Iterable<LongWritable> value,
org.apache.hadoop.mapreduce.Reducer<Text, LongWritable, Text, LongWritable>.Context context)
throws java.io.IOException, InterruptedException {
//key为每一个单独的单词,如:hello,world,you,me等
//value为这个单词在文本中出现的次数集合,如{1,1,1},表示总共出现了三次
long sum = 0;
//循环value,将其中的值相加,得到总次数
for (LongWritable v : value) {
sum += v.get();
}
//context.write输入新的键值对(结果)
context.write(key, new LongWritable(sum));
};
}

新建执行提交作业的类,取名JSubmit

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; public class JSubmit {
public static void main(String[] args) throws IOException,
URISyntaxException, InterruptedException, ClassNotFoundException {
//Path类为hadoop API定义,创建两个Path对象,一个输入文件的路径,一个输入结果的路径
Path outPath = new Path("hdfs://localhost:9000/out");
//输入文件的路径为本地linux系统的文件路径
Path inPath = new Path("/home/hadoop/word");
//创建默认的Configuration对象
Configuration conf = new Configuration();
//根据地址和conf得到hadoop的文件系统独享
//如果输入路径已经存在则删除
FileSystem fs = FileSystem.get(new URI("hdfs://localhost:9000"), conf);
if (fs.exists(outPath)) {
fs.delete(outPath, true);
}
//根据conf创建一个新的Job对象,代表要提交的作业,作业名为JSubmit.class.getSimpleName()
Job job = new Job(conf, JSubmit.class.getSimpleName());
//1.1
//FileInputFormat类设置要读取的文件路径
FileInputFormat.setInputPaths(job, inPath);
//setInputFormatClass设置读取文件时使用的格式化类
job.setInputFormatClass(TextInputFormat.class); //1.2调用自定义的Mapper类的map方法进行操作
//设置处理的Mapper类
job.setMapperClass(JMapper.class);
//设置Mapper类处理完毕之后输出的键值对 的 数据类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class); //1.3分区,下面的两行代码写和没写都一样,默认的设置
<span style="white-space:pre">		</span>job.setPartitionerClass(HashPartitioner.class);
<span style="white-space:pre"> </span>job.setNumReduceTasks(1); //1.4排序,分组 //1.5归约,这三步都有默认的设置,如果没有特殊的需求可以不管
		//2.1将数据传输到对应的Reducer

		//2.2使用自定义的Reducer类操作
//设置Reducer类
job.setReducerClass(JReducer.class);
//设置Reducer处理完之后 输出的键值对 的数据类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class); //2.3将结果输出
//FileOutputFormat设置输出的路径
FileOutputFormat.setOutputPath(job, outPath);
//setOutputFormatClass设置输出时的格式化类
job.setOutputFormatClass(TextOutputFormat.class); //将当前的job对象提交
job.waitForCompletion(true);
}
}

运行java程序,可以再控制台看到提交作业的提示

在hdfs中查看输出的文件

运行成功!

通过java api提交自定义hadoop 作业的更多相关文章

  1. 使用老版本的java api提交hadoop作业

    还是使用之前的单词计数的例子 自定义Mapper类 import java.io.IOException; import org.apache.hadoop.io.LongWritable; impo ...

  2. oozie java api提交作业

    今晚试验用java的api来提交代码,由于代码是在我机器上写的,然后提交到我的虚拟机集群当中去,所以中间产生了一个错误..要想在任意一台机器上向oozie提交作业的话,需要对hadoop的core-s ...

  3. Hadoop 系列(三)Java API

    Hadoop 系列(三)Java API <dependency> <groupId>org.apache.hadoop</groupId> <artifac ...

  4. 利用SparkLauncher 类以JAVA API 编程的方式提交Spark job

    一.环境说明和使用软件的版本说明: hadoop-version:hadoop-2.9.0.tar.gz spark-version:spark-2.2.0-bin-hadoop2.7.tgz jav ...

  5. Java --本地提交MapReduce作业至集群☞实现 Word Count

    还是那句话,看别人写的的总是觉得心累,代码一贴,一打包,扔到Hadoop上跑一遍就完事了????写个测试样例程序(MapReduce中的Hello World)还要这么麻烦!!!?,还本地打Jar包, ...

  6. 如何向hadoop集群定时提交一个jar作业?

    除了使用Hive,Pig来执行一个MapReduce任务,不需要专门的把项目打成jar包,提交执行,或者定时执行,因为Hive,Pig这些开源框架已经,帮我们自动打包上传了. 而有些时候,我们自己手写 ...

  7. 【hadoop代码笔记】hadoop作业提交之汇总

    一.概述 在本篇博文中,试图通过代码了解hadoop job执行的整个流程.即用户提交的mapreduce的jar文件.输入提交到hadoop的集群,并在集群中运行.重点在代码的角度描述整个流程,有些 ...

  8. 【hadoop2.6.0】利用Hadoop的 Java API

    Hadoop2.6.0的所有Java API都在 http://hadoop.apache.org/docs/r2.6.0/api/overview-summary.html 里. 下面实现一个利用J ...

  9. Hadoop作业提交之TaskTracker获取Task

    [Hadoop代码笔记]Hadoop作业提交之TaskTracker获取Task 一.概要描述 在上上一篇博文和上一篇博文中分别描述了jobTracker和其服务(功能)模块初始化完成后,接收JobC ...

随机推荐

  1. P2659 美丽的序列 (单调栈)

    题目链接 Solution 直接考虑单调栈处理出每一个点作为最小值的区间长度. 然后 \(O(n)\) 找一遍最大值即可. 记得开 long long,以及要注意 \(0\) 的问题. Code #i ...

  2. 如何从oracle官网中下载The java language specification(java 语言规范)

    第一步: 第二步: 第三步:下面这个图在这个页面的下方,所以你只要一直往下看,直到看到下图的文字为止: 第四步: 第五步: 这样你就可以成功下载该java 语言规范的pdf了. 它直接下载的网址为: ...

  3. java 复习整理(五 类加载机制与对象初始化)

    类加载机制与对象初始化   一 . 类加载机制 类加载机制是指.class文件加载到jvm并形成Class对象的机制.之后应用可对Class对象进行实例化并调用.类加载机制可在运行时动态加载外部的类, ...

  4. Java并发容器--ConcurrentLinkedQueue

    概述 ConcurrentLinkedQueue是一种基于链表实现的无界非阻塞线程安全队列,遵循先入先出规则. 线程安全队列有两种实现方式: 阻塞方式:对入队和出队操作加锁.阻塞队列. 非阻塞方式:通 ...

  5. bzoj4418 [Shoi2013]扇形面积并

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4418 [题解] 被题目名称吓死系列. 用一棵线段树维护当前有哪些半径. 那么将扇形差分,每段 ...

  6. Hidden (NOIP模拟赛)(字符串模拟QAQ)

    原题传送门 神奇的题目诶 原来以为字符串比较一定要O(NlogN) 结果发现可以均摊O(N) 首先我们来讲一讲原理 我们有3个指针i,j,k i=0,j=1,k=0 一开始我们不断对k+1直到找到ch ...

  7. VMWare虚拟机如何与主机共享文件夹(最容易看懂的讲解)附图~

    http://wenku.baidu.com/view/54ab9e19227916888486d776.html 新建好虚拟机并安装好系统后,在编辑虚拟机设置--选项进行以下设置: 点添加 选择你要 ...

  8. Linux/Android——input_handler之evdev (四) 【转】

    转自:http://blog.csdn.net/u013491946/article/details/72638919 版权声明:免责声明: 本人在此发文(包括但不限于汉字.拼音.拉丁字母)均为随意敲 ...

  9. 链表各种操作及其实现方法(c实现)

    链表是一种最简单的数据结构之一,经常会被面试官用来考察应聘者的基础扎不扎实,最近也到了求职季,所以我把自己对链表的一些理解写出来,希望能跟大家交流交流: 链表的概念其实挺简单,无非就是一个利用指针将数 ...

  10. Android studio配置使debug签名和release签名一致

    在module的build.gradle中添加 android { //重要部分 signingConfigs { release { keyAlias 'jxt' keyPassword '1234 ...