Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >hadoop mapreduce作业的最佳单元测试工具/方法

hadoop mapreduce作业的最佳单元测试工具/方法
EN

Stack Overflow用户
提问于 2012-12-18 16:52:26
回答 1查看 2.7K关注 0票数 7

我是新来的,但我需要知道对通过Apache Hadoop编写的程序进行单元测试的最佳方法。我知道我们可以用jUnit的方式为map和reduce方法中的逻辑编写单元测试用例。我们也可以对涉及到的其他逻辑做同样的事情,但这不能保证它经过了良好的测试,并且可以在实际的运行环境中工作。

我读过关于MRUnit的文章,但它看起来也像我上面提到的那样,但以一种更成熟的方式。但它也不是真正的mapreduce作业,而是一个模拟作业。

任何帮助都将不胜感激。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-18 16:56:40

你当然还有其他选择。在这里我为你做了这件事!

本地作业运行程序测试-在单个JVM中的一台机器上运行MR作业

传统的单元测试和MRUnit应该能在早期检测到足够的bug,但这两者都不能测试你的MR任务。本地作业运行器允许您在一台JVM中的本地计算机上运行Hadoop,这使得在作业失败的情况下更容易调试MR作业。

要启用本地作业运行器,请将“mapred.job.tracker”设置为“local”,并将“fs.default.name”设置为“file:///some/local/path”(这是默认值)。

请记住,在使用本地作业运行程序时,不需要启动任何Hadoop守护进程。运行bin/hadoop将启动JVM并为您运行作业。创建一个新的hadoop-local.xml文件(或者mapred-local.xml和hdfs-local.xml,如果您使用的是0.20)可能是有意义的。然后,您可以使用-config参数告诉bin/hadoop使用哪个配置目录。如果您希望避免摆弄配置文件,可以创建一个实现Tool并使用ToolRunner的类,然后使用bin/hadoop jar foo.jar com.example.Bar -D mapred.job.tracker=local -D fs.default.name=args (args)运行这个类,其中Bar是工具实现。

要开始使用本地作业运行器在Hadoop中测试MR作业,请创建一个启用了本地作业运行器的新配置目录,并像往常一样调用您的作业,记住要包含-config参数,该参数指向包含本地配置文件的目录。

在0.18.3中也可以使用-conf参数,它允许您指定hadoop-local.xml文件,而不是使用-config指定目录。Hadoop将愉快地运行该作业。这种形式的测试的困难在于验证作业是否正确运行。注意:在运行作业之前,您必须确保正确设置了输入文件,并且输出目录不存在。

假设您已经成功地配置了本地作业运行器并运行了一个作业,则必须验证作业是否正确完成。您应该创建一个脚本或单元测试,用于设置前提条件、运行作业、比较实际输出和预期输出,以及扫描引发的异常。然后,该脚本或单元测试可以以适当的状态退出,并输出解释作业如何失败的特定消息。

请注意,本地作业运行器有两个限制:只支持一个reducer,并且DistributedCache不工作(a fix is in progress)。

本地作业运行器允许您在单个线程中运行作业。在单线程中运行MR作业对调试很有用,但它不能正确模拟运行多个Hadoop守护进程(例如,NameNode、DataNode、TaskTracker、JobTracker、SecondaryNameNode)的真实集群。伪分布式集群由一台运行所有Hadoop守护进程的机器组成。这个集群仍然相对容易管理(尽管比本地作业运行器难),并且比本地作业运行器更好地测试与Hadoop的集成。

要开始使用伪分布式集群在Hadoop中测试MR作业,请遵循前面提到的使用本地作业运行器的建议,但前提设置包括所有Hadoop守护进程的配置和启动。然后,要开始您的工作,只需像往常一样使用bin/hadoop。

测试MR作业的最彻底但最麻烦的机制可能是在至少由几台机器组成的QA集群上运行它们。通过在QA集群上运行MR作业,您将测试作业及其与Hadoop集成的所有方面。

您可能还希望扫描每个任务尝试生成的stdin和stdout,这将需要将这些日志收集到一个中心位置并对它们进行them。Scribe是一个收集日志的有用工具,尽管它可能是多余的,具体取决于您的QA集群。

我们发现,我们的大多数客户都有某种类型的QA或开发集群,他们可以在其中部署和测试新作业,尝试较新版本的Hadoop,并练习将集群从一个版本的Hadoop升级到另一个版本。如果Hadoop是您的生产管道的主要部分,那么创建QA或开发集群非常有意义,并且在其上重复运行作业将确保对作业的更改继续得到彻底的测试。对于您的QA集群,EC2可能是一个很好的主机,因为您可以按需启动和关闭它。

您应该根据QA对组织的重要性以及您拥有的资源数量来选择QA实践。只需使用传统的单元测试框架,MRUnit和本地作业运行器就可以以一种简单的方式彻底测试您的MR作业,而无需使用太多资源。但是,在QA或开发集群上运行作业自然是全面测试MR作业与Hadoop集群的开销和操作任务的最佳方式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13937748

复制
相关文章
HAProxy配置示例和需要考虑的问题
本文目录: 1. 配置haproxy需要考虑的事情 2. 配置haproxy提供反向代理功能
星哥玩云
2022/07/13
1K0
HAProxy配置示例和需要考虑的问题
HashTable的使用示例
        // Create and initialize a new Hashtable.
Java架构师必看
2021/03/22
5660
simplifyEnrichment的使用示例
simplifyEnrichment主要针对富集分析的结果进行简化,并提供了一些强大的可视化函数。
医学和生信笔记
2023/08/30
7810
simplifyEnrichment的使用示例
Git示例教程 - 如何使用git rebase命令
现在我们想要将topic分支上的ABC提交重新rebase到最新的master分支上,可以执行如下命令:
KINGYT
2019/11/07
1K0
【EventBus】EventBus 使用示例 ( 最简单的 EventBus 示例 )
在 Module 下的 build.gradle 中导入 EventBus 依赖 ;
韩曙亮
2023/03/29
7240
【EventBus】EventBus 使用示例 ( 最简单的 EventBus 示例 )
InetAddress类的使用示例
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152258.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/10
4380
如何确定您的企业需要使用在线CRM?
如果您是一个企业管理层,您可能已经听说过CRM,它的意思是客户关系管理。在线CRM是CRM系统的SAAS版本,无需安装任何软件,在网页上就可以将所有客户内容保存起来,简化您的工作方式,节省宝贵时间和金钱。但是您可能会想:“我为很么需要在线CRM,它对我有什么用?”很高兴你能有这个疑问,说明您开始思考在线CRM是否适合你,您可以通过以下方法确定您的企业是否需要CRM。
All in
2020/04/29
4050
OkHttp 使用示例
可以用来下载文件,打印header,打印body。string()方法对于小文档的响应来说是个既方便又高效的方法。但是如果一个文档太大(大于1M),就不要使用string()方法了,因为这个方法会把整个文档加载到内存中,在这种情况下可以把body当作流来处理。
代码拾遗
2018/07/24
2.8K0
mongojs使用示例
首先确保已经安装了nodejs与mongodb。 安装mongojs npm install mongojs 连接数据库 var databaseUrl="mydb"; // "username:password@example.com/mydb" var collections=["users","reports"]; var db=require("mongojs").connect(databaseUrl,collections); 查询操作 //find user  db.users.find(
用户2936342
2018/08/27
5340
使用 WDK 示例
Windows Driver Kit (WDK) 包含各种驱动程序的示例源代码。这些示例可在您编写自己的驱动程序时提供有用指导。在安装 WDK 时,示例将安装到 \src 目录的子目录中。
战神伽罗
2019/07/24
1.6K0
ThreadPoolExecutor 使用示例
我们上面讲解了 Executor框架以及 ThreadPoolExecutor 类,下面让我们实战一下,来通过写一个 ThreadPoolExecutor 的小 Demo 来回顾上面的内容。
崔笑颜
2020/06/08
6.2K1
currentStyle使用示例[通俗易懂]
Dom中的currentStyle属性.从字面上理解这是当前样式风格.没错currentStyle就是用来获取元素内Css的style样式属性值.比如说元素的width值height值.甚至元素的文本排放方式text-align,包括position等等.所有的css属性值都可以被获取.但是currentStyle仅支持IE浏览器,如若想在FF或基于Dom标准的其他浏览器内实现相同效果.请使用getComputedStyle属性.我在下面给出一个例子,来获取div的宽度值,文本如何排放.和绝对定位的值.已支持IE和FF其他浏览器.放心浏览!
全栈程序员站长
2022/09/14
4370
krpano使用示例
<hotspot name="spot1" style="skin_soundbutton" ath="13.267" atv="-6.054"   /> <hotspot name="spot2" style="skin_soundbutton" ath="-105.872" atv="-7.814"  /> <hotspot name="spot3" style="skin_soundbutton" ath="151.117" atv="-2.083"    />
JaneYork
2023/10/11
2890
QCustomPlot 使用示例
https://download.csdn.net/download/qq_40754866/18910871 运行环境:qt 5.14.2 win10 64位
全栈程序员站长
2022/11/03
5690
QCustomPlot 使用示例
Protostuff使用示例
User{firstName=’zhang’, lastName=’sanfeng’, email=’10000@qq.com’, friends=[User{firstName=’null’, lastName=’null’, email=’20000@qq .com’, friends=null, cars=null}], cars=[Car [color=null, car_name=宾利, price=null], Car [color=null, car_name=法拉利, price=null]]}
全栈程序员站长
2022/06/26
3710
ConcurrentHashMap使用示例
作者:mononite 链接:https://my.oschina.net/mononite/blog/144329(点击文末阅读原文前往) ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap。实际上,线程安全的容器,特别是Map,应用场景没有想象中的多,很多情况下一个业务会涉及容器的多个操作,即复合操作,并发执行时,线程安全的容器只能保证自身的数据不被破坏,但无法保证业务的行为
java达人
2018/01/31
2.6K0
Gearman使用示例
最近的一个旧项目重构过程中,使用到了gearman这个开源项目,简单来讲,这是一个类似MQ的异步系统,一边派发任务,一边处理任务(有类似MQ中的消息发送方与接收方),目前支持java,php等多种语言,缺点是存在单点问题(server的HA官方没有提供方案,需要二次开发)。
菩提树下的杨过
2018/09/20
8320
PHP-使用数组的示例
在这个示例中,$myArray3是一个多维数组,包含三个关联数组。每个关联数组都包含两个键值对,分别代表某个学生的数学和英语成绩。在输出多维数组的元素时,需要使用多个方括号来指定每个维度的索引值。
堕落飞鸟
2023/04/25
5010
点击加载更多

相似问题

C++模板类型检查编译时线程安全?

23

C++:如何创建动态模板类型

210

使用C++模板创建具有自定义组件的类

510

C++使用模板为基本类型创建别名?

10

查找模板类型c++的模板类型

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文