由TextInputFormat编译错误到Hadoop.mapred包和Hadoop.mapreduce包的区别

今天看了Hadoop的InputSplits以后试着在自己写的MapReduce程序上使用TextInputFormat类(我使用的版本是Hadoop2.7.3,当前稳定版本),然而在main函数中调用此类时:

Job job = Job.getInstance(conf, "word count");
job.setInputFormatClass(TextInputFormat.class);

一直报编译错误:The method setInputFormatClass(Class<? extends InputFormat>) in the type Job is not applicable for the arguments(Class<TextInputFormat>)

我一开始很懵,因为TextInputFormat本身是FileInputFormat的子类,而FileInputFormat继承InputFormat,所以TextInputFormat也应当继承InputFormat啊。赶紧去看源代码,结果和我想得也一样,我甚至一度怀疑我学到的java知识都是假的。。

后来脑子里闪过一个念头,难道因为我的TextInputFormat是假的?马上一查,果然有两个TextInputFormat类,我用的是在org.apache.hadoop.mapred包中,而Job类期望的类是在org.apache.hadoop.mapreduce.lib.input包中。

本来这种事情碰到的也挺多了。。但是花了一上午才解决,总要把这两个包的区别弄个明白。先读两个包中的源码,发现除了实现有略微区别,大体上是差不多的(其实并没有太看懂(╯‵□′)╯︵┻━┻ )于是借助搜索引擎,才明白hadoop.mapred包是旧API,而hadoop.mapreduce包是新API,新API是在0.20版本加入的(所以过了这么久为什么不把旧API删掉呢!)

Hadoop新旧API的区别

那新API相比旧API有哪些改动呢?这些改动又有哪些影响呢?下面的内容主要来自Hadoop: The Definitive Guide 4th Edition,加上了一些我个人的理解。

  1. 新API将一些接口改为抽象类。因为相比于接口,抽象类在继承时可以在不改变默认实现的情况下使用新的方法,增加了一些灵活性和兼容性。目前已知的被改变的类包括:Mapper, Reducer, Partitioner, InputFormat, OutputFormat, InputSplit, RecordReader, RecordWriter
  2. 新API引入了Context类。Context类是包含了许多系统变量和参数的封装,这样用户可以在编写MapReduce程序时方便的与系统直接交流,大大拓宽了编程思路
  3. 新API在MapperReducer两个抽象类中添加了run() 函数,使得用户能直接通过重写此函数来控制运行流程。旧API中的MapRunnable接口可以实现这一点,但是Reducer中无法实现。
  4. Job类代替了JobClient类来实现对新改动的操作。这也是我出现的问题的根本原因,因为我用的新API的Job类,当然无法调用旧API的InputFormat
  5. 新API将旧API中的JobConf类中的内容移到了它的父类Configuration类中,并且能通过新的Job类中的一些helper method来使用。换句话说就是将Configuration类的功能也集成到Job类中了。
  6. 新API的输出文件命名将map输出和reduce输出分开,分别是part-m-nnnnn和part-r-nnnn,而旧API中两者均被命名为part-nnnnn
  7. 新API中用户重写的方法现在会被声明抛出Java.lang.InterruptedException。这样用户就可以有意在程序中抛出异常来实现对终止长时间运行的程序之类的操作。
  8. 新API中reduce()函数现在传入值的结构为java.lang.Iterable而不是旧API中的java.lang.Iterator(在java7中已经被移到java.util包中)。这样可以使reduce中的迭代操作变得更容易。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实 验 报 告 (2014 / 2015 学年 第 二 学期) "课程名称 "云计算 " "实验名称 "基于Hadoop的数据分析 " "实验时间 "2015 "年 "5 "月 "20 "日 " "指导单位 " " "指导教师 " " "学生姓名 " "班级学号 " " "学院(系) " "专 业 " " 实 验 报 告 "实验名称 " "指导教师 " " "实验类型 "上机 "实验学时 "2 "实验时间 "2015.5.20 " "实验目的和要求 " "【实验要求】 " "掌握基于Hadoop单机版的数据分析 " "【实验目的】 " "学会利用Hadoop对不同数据集的分析与挖掘; " "二、实验环境 " "虚拟机Ubuntu14.04,hadoop-1.2.1,eclipse-SDK-4.3.1 " "三、实验原理及内容 " "(1)在第一次实验的基础上安装eclipse " "1.将eclipse解压到usr/local目录下: " "sudo tar xzvf eclipse-SDK-4.3.1-linux-gtk-x86_64.tar.gz " "-C/usr/local " "2.授权:sudo chmod -R 777 /usr/local/eclipse " " " "将hadoop插件拷贝到/usr/local/eclipse/plugins下 " " " " " " " " " " " "4.设置eclipse的Java环境:在eclipse下创建一个jre文件夹sudo mkdir jre,进 " "入该文件夹:cd jre, " "加入一条连接指令ln -s /usr/lib/jvm/java-7-sun/bin bin " "(2)在eclipse中添加Map/Reduce:点击上方window选项,依次选择open " "perspective,other,MapReduce,如下图所示: " " " "(3)设置Map/Reduce location,选择Map/Reduce locations,new hadoop " "location,将其中的内容设置成下图所示的内容: " " " "设置Advanced parameters中的tmp文件夹位置为/usr/local/hadoop/tmp,如下图 " "所示: " " " "(4)设置hadoop的安装路径:依次点击window,preferences,Hadoop Map/Reduce " ",设置hadoop安装路径为/usr/local/hadoop " " " "(5)在桌面新建三个文件,如图所示: " " " " " " " "新建一个Map/Reduce " "Project:右击左侧空白处,选择新建一个如下图所示的Map/Reduce Project: " " " "点击Next,输入工程名为average,再点击finish。 " "新建一个Java class:右击左侧的average,依次选择New,class,设置内容如下 " "图所示: " " " " " " " " " "点击finish完成。 " "(8)加入Java代码: " "package com.hebut.mr; " "import java.io.IOException; " "import java.util.Iterator; " "import java.util.StringTokenizer; " "import org.apache.hadoop.conf.Configuration; " "import org.apache.hadoop.fs.Path; " "import org.apache.hadoop.io.IntWritable; " "import org.apache.hadoop.io.LongWritable; " "import org.apache.hadoop.io.Text; " "import org.apache.hadoop.mapreduce.Job; " "import org.apache.hadoop.mapreduce.Mapper; " "import org.apache.hadoop.mapreduce.Reducer; " "import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; " "import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; " "import org.apache.hadoop.mapreduce.lib.output.FileO

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值