标签归档:Yarn

Flink on Yarn / Kubernetes 原理剖析及实践

本文是我参加 Apache Flink China 社区钉钉群直播的教程(进阶篇 2.4)。我稍作调整后发在个人网站(zhoukaibo.com)上。

文中首先对 Flink 架构进行了概述;其次介绍了Yarn在Flink应用中的原理及实践;再次介绍了Kubernetes在Flink应用中的原理及实践;最后对Flink on Yarn/Kubernetes中存在的一些问题进行了解析。

Flink 架构概览

Flink架构概览–Job

用户通过 DataStream API、DataSet API、SQL 和 Table API 编写 Flink 任务,它会生成一个JobGraph。JobGraph 是由 source、map()、keyBy()/window()/apply() 和 Sink 等算子组成的。当 JobGraph 提交给 Flink 集群后,能够以 Local、Standalone、YarnKubernetes 四种模式运行。

Flink架构概览–JobManager

JobManager的功能主要有:

  • 将 JobGraph 转换成 Execution Graph,最终将 Execution
--> 阅读全文

Yarn集群中hive bug导致数据丢失问题排查

5月1日凌晨线上发生了一个诡异的问题:有个hive的job运行状态显示成功,但是数据少了很多,本来应该输出200个文件3亿多数据,但是结果只有一个part文件180多万数据产出!还好后续的流程检查出了这个巨大的数据差异,不然后果很严重。

ps: 当前集群采用的hadoop版本为hadoop-2.2.0-cdh5.0.0-beta-1,Hive版本为0.11,集群规模250台左右。

看hive job的log,一切正常:

看jobhistory页面,这个job也显示状态是成功的,计数器显示输出了371473512条数据。

但是为什么最终的输出目录只有一个文件呢?

查看hdfs-audit.log文件,发现除了00078_1000这个文件外,其他199个文件都有delete操作存在:

2014-05-01 01:52:16,292 INFO FSNamesystem.audit: allowed=true ugi=admin (auth:SIMPLE) ip=/10.246.14.72 cmd=delete src=/tmp/hive-admin/hive_2014-05-01_01-46-44_962_6776205249541775191/_tmp.-ext-10000.intermediate/000198_1000 dst=null perm=null
2014-05-01 01:52:16,292 INFO FSNamesystem.audit: allowed=true ugi=admin (auth:SIMPLE) ip=/10.246.14.72 cmd=delete src=/tmp/hive-admin/hive_2014-05-01_01-46-44_962_6776205249541775191/_tmp.-ext-10000.intermediate/000199_1000 dst=null perm=null
2014-05-01 01:52:16,295 INFO FSNamesystem.audit: allowed=true ugi=admin (auth:SIMPLE) ip=/10.246.14.72 cmd=delete src=/tmp/hive-admin/hive_2014-05-01_01-46-44_962_6776205249541775191/_task_tmp.-ext-10000 dst=null perm=null
2014-05-01 01:52:16,445 INFO FSNamesystem.audit: allowed=true ugi=admin … --> 阅读全文

利用graphviz生成hadoop 2.0 Yarn中的MR/RM/NM状态转换图

Graphviz是基于dot语言的绘图工具,它不是使用鼠标来画图的,而是通过dot语言描述,然后在命令行下使用命令生成对应的图片如有向图、无向图、关系图、目录图、流程图等。这样做的优点是不用去手动的对齐坐标,而且也可以作为一些可视化的解决方案。

在hadoop yarn中,可以很方便的生成状态转换图:
(1) 安装graphviz

mac下执行:

(2) 编译gv格式文件
在 $HADOOP_HOME/src 源码目录下,使用maven编译时加上生成.gv的选项:

会生成ResourceManager.gv,NodeManager.gv和MapReduce.gv三个文件

(3) 将生成的gv格式文件转换为png图像
比如生成ResourceManager的状态图:

有了状态图,查看Hadoop源码就更方便了。


MapReduce Task状态转换图(点击图片可以查看原图):

MapReduce TaskAttempt状态转换图:

MapReduce Job状态转换图:


NodeManager LocalizedResource状态转换图:

NodeManager Container状态转换图:

NodeManager Application状态转换图:


ResourceManager RMApp状态转换图:

ResourceManager RMNode状态转换图:

ResourceManager RMContainer状态转换图:

ResourceManager RMAppAttempt状态转换图:

hadoop集群升级到yarn遇到的数据本地化(data-locality)很低的问题分析

最近将hadoop集群从hadoop-2.0.0-mr1-cdh4.1.2升级到hadoop-2.0.0-cdh4.3.0,遇到了一些任务(如scan hbase table)数据本地化data-local很低的问题,原因就是前篇文章中说到的ipv4和ipv6导致的机器名长短问题。本文是对整个过程的分析。

我们的yarn集群采用的是capacity-scheduler调度,data-local很低的原因是:机器名不一致,导致分配container时无法匹配上。在yarn内部(NodeManager)用的机器名是 test042097.sqa.cm4 这种短的,而job的split信息(如scan hbase)里面带的机器名是 test042097.sqa.cm4.site.net 这种完整机器名。

在 ResourceManager 分配container的地方:(RMContainerAllocator.java:967行)

代码里面是按照 host, rack, any 三种方式顺序匹配的,在 mapsHostMapping 里面存的是资源的请求,<hostname, List<TaskAttemptId>>,意思是对请求在某台机器上启动几个task。hostname是来自于job输入的split信息,比如扫描hbase表的job,split信息里面就有region所在的机器信息。

在hbase里面,用到的机器名都是 test042097.sqa.cm4.site.net 这种带了 site.net 后缀的,所以mapsHostMapping的key就是 test042097.sqa.cm4.site.net。而Yarn的NodeManager所用的机器名都是 test042097.sqa.cm4 这种不带后缀的,也就是 allocated.getNodeId().getHost();的值。因此机器名是没法匹配上的。


后来,我们的集群采用斯盛同学提出的改法:“每台机器一个rack”后,rack local比例提高了很多,此时的rack local其实就是data locale。

这样改后,上面的代码中 RackResolver.resolve(host).getNetworkLocation(); 这个会调用集群配置的rack脚本,会读取一个rack文件信息:

所以,通过search042097.sqa.cm4可以映射到 /rack/4,与 mapsRackMapping 中的数据就匹配上了。(mapsRackMapping中存有请求的资源rack信息,yarn中的资源请求是超额请求的,用一个申请三个,主机+机架+any)

YARN中的NodeManager获取hostname的地方,是在ContainerManagerImpl.java:243行

底层调用的是jdk的 方法,得到的是 search042097.sqa.cm4 这种短主机名。

而普通map … --> 阅读全文

记录Hive升级0.10遇到的多表full out join等问题和解决

记录下最近Hive升级0.10遇到的一些问题:

由于Hadoop集群升级了Yarn即hadoop-2.0.0-cdh4.3.0,之前的hive 0.8.1版本已经不能使用了。于是将Hive升级到hive-0.10.0-cdh4.3.0版,期间遇到了一些问题,记录在此。

1. 多表(32张表)的full out join任务被拆分成了很多个子任务

这样每个子任务串行,导致整个任务的执行时间很长。主要的原因是在处理outer join时,hive里面用的short变量来保存的别名”aliases”,观察到的现象是5张以上的表做full out join会拆成多个任务完成。hive邮件组上有过三次讨论:123

The problem is mixture of issues (HIVE-3411, HIVE-4209, HIVE-4212,
HIVE-3464) and still not completely fixed even in trunk.

最终采取的方案是,参考邮件组中提到的patch,将用到short的地方改为long。估计官方也会修复这个问题的。

2. 发现 mapreduce.map.tasks 设置的map个数无效
升级后发现mapreduce.map.tasks这个参数无效,无法用来控制map个数。原因是 hive.input.format 的值默认设为org.apache.hadoop.hive.ql.io.CombineHiveInputFormat,这时候,可以只能通过设置mapreduce.input.fileinputformat.split.maxsize=文件大小/期望map个数 来控制map个数。

另一种方法是使用 org.apache.hadoop.hive.ql.io.HiveInputFormat,这样设置mapreduce.map.tasks就能生效。… --> 阅读全文