Hadoop:(ver-1.2.1),(1+8节点集群)
我的用例是,我试图获得执行特定pig脚本所花费的时间,以及从mapreduce的角度来看,这些时间是如何花费的。我需要多次运行pig脚本(比如说100),以获得平均时间。我启用了pig.udf.profile
,这使我在每个udf函数上花费时间作为mapreduce计数器。我还对每个作业报告的其他延迟、内存度量(cpu时间、堆使用率)感兴趣。我可以从jobtracker web UI(host:50030/jobdetails.jsp?jobid=blah
)中看到这些计数器。现在,我的问题是,是否有一种方法可以跨作业聚合这些计数器。或者,我将如何构建一个看起来像
Run1 Run2 Run3 ...
Cpu time | | |
Redcr wait | | |
UdfCntr1(approx_us) | | |
UdfCntr2(approx_invc) | | |
CounterY(approx_us) | | |
就Hadoop而言,每次运行都是不同的工作。在浏览日志文件夹后,我发现计数器在history/done/..
文件夹中。是否有一种现有的技术来组合结果,或者我注定要编写自己的解析器来遍历每个日志文件。我认为这个用例对于现有的解决方案来说已经足够常见了--任何指针都会有帮助。
多谢了。
一个简单的方法是构建一个小的Java方法,它获取所有的计数器并将它们发送到Graphite。*安装Graphite*让所有作业通过一个中央主类运行,该主类在作业结束时获取计数器,转换为键值,其中键可以是..,Value是一个长数字的计数器值。*将这些键值报告为CSV格式,石墨可以使用端口2003读取并通过普通套接字发送(我认为它是默认的石墨端口)。*使用Graphite Web UI查看和分析数据。
你有几个选择,我提前道歉,没有一个是特别有吸引力的。
实现PPNL
PigProgressNotificationListener是一个Java接口,用于向任意客户端公开Pig作业过程中发生的事件。如果您实现了这个接口并附加了类的实例,那么您就可以获取hadoop计数器(以及许多其他M/R相关的度量)并将它们存储起来以备以后使用。注意,这需要对Pig内部构件有合理的理解,尽管不一定是专家水平的理解。
使用另一个收集度量的系统
现在你的选择是有限的Ambrose(由Twitter开源)和Lipstick(由Netflix开源)。我不确定Ambrose是否收集hadoop计数器,但它可以扩展到。口红确实收集hadoop计数器。使用这两种方法中的任何一种,您都可以以不同的难度分析计数器,这取决于您如何配置它们来存储数据。
分析日志文件
听起来你已经考虑过走这条路了,原因有几个:
我正在使用Hadoop处理一个mapreduce项目。我目前有3个连续的工作。 我想使用Hadoop计数器,但问题是我想在第一个作业中进行实际计数,却在第3个作业的reducer中访问计数器值。 我怎样才能做到这一点呢?我应该在哪里定义?我需要通过它扔第二个工作吗?这也将有助于看到一些代码示例这样做,因为我还没有找到任何东西。 注意:我使用的是Hadoop 2.7.2 编辑:我已经尝试了这里解释的
现在我有一个4阶段的MapReduce作业,如下所示:
假设我在Hadoop环境中资源有限,我不想安排长时间运行的作业(即需要几天时间才能完成)。我正在分析大量过去的时间序列数据。我想安排一次需要一天数据的mapreduce作业(这需要一个小时来处理)。 那么,我如何安排,使新的工作提交后,前一个工作完成?
我试图运行WordCount示例的一个变体,这个变体是,映射器输出文本作为键和文本作为值,而还原器输出文本作为键和NullWritable作为值。 除了地图,减少签名,我把主要的方法是这样的:
我试图使用这里定义的基本字数。当IntSumReducer执行context.write时,是否可能将该context.write传递给第二个reducer或输出类,该reducer或输出类将IntSumReducer给出的最终列表减少/更改到单个最大频率? 我对Hadoop/MapReduce和Java中的jobs概念相当陌生,所以我不确定我需要如何修改默认的WordCount以使其符合要求。我
我有一个,每个月底运行一次。运行后,它会将一些数据保存到数据库中。 当我扩展应用程序时(例如有2个实例),两个实例都运行计划作业,并且都保存数据,在一天结束时,我的数据库有相同的数据。 所以我希望计划作业只运行一次,而不管云上的实例数量如何。