分享一个Flink checkpoint失败的问题和解决办法
本文来自: PerfMa技术社区
接触Flink一段时间了,遇到了一些问题,其中有一个checkpoint失败导致作业重启的问题,遇到了很多次,重启之后一般也能恢复正常,没有太在意,最近2天有同事又频繁遇到,这里记录一下解决方案和分析过程。
我们的flink测试环境有3个节点,部署架构是每个flink节点上部署一个HDFS的DataNode节点,hdfs用于flink的checkpoint和savepoint
现象
看日志是说有个3个datanode活着,文件副本是1,但是写文件失败
There are 3 datanode(s) running and no node(s) are excluded
复制代码
网上搜了一下这种报错,没有直接的答案,我看了下namenode的日志,没有更多直接的信息
50070 web ui上看一切正常,datanode的剩余空间都还有很多,使用率不到10%
我试了一下往hdfs上put一个文件再get下来,都ok,说明hdfs服务没有问题,datanode也是通的
日志现象1
继续前后翻了一下namenode的日志,注意到有一些warning信息,
 这时候怀疑块放置策略有问题
按照日志提示打开相应的的debug开关 修改
etc/hadoop/log4j.properties
复制代码
找到
log4j.logger.org.apache.hadoop.fs.s3a.S3AFileSystem=WARN
复制代码
照抄这个格式,在下面添加
log4j.logger.org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy=DEBUG
log4j.logger.org.apache.hadoop.hdfs.server.blockmanagement.DatanodeDescriptor=DEBUG
log4j.logger.org.apache.hadoop.net.NetworkTopology=DEBUG
复制代码
重启namenode,然后重跑flink作业
日志现象2
这时候看到的问题是机架感知策略无法满足,因为我们没有提供机架映射脚本,默认同一个机架,但是仔细想想跟这个应该也没有关系
因为很多生产环境的hdfs其实都不配置机架映射脚本,并且导致checkpoint失败的问题并不是一直存在,最起码put/get文件都是正常的。
这时候开始考虑看一下hdfs的源码了,根据上面的日志调用栈,先看到BlockPlacementPolicyDefault以及相关的DatanodeDescriptor
这些源码大致的意思是当给一个块选择一个datanode的时候,要对这个datanode进行一些检查,比如看下剩余空间,看下繁忙程度
当我们的问题复现的时候,观察日志会发现一些与此相关的关键信息
这个日志的意思是,存储空间有43G,分配块实际需要100多M,但是scheduled大小就超过43G,因此我们认为正常的datanode,namenode认为它空间不足了
原因
scheduled大小含义是什么呢? 根据代码可以看到scheduled大小是块大小跟一个计数器做乘法,计数器代表的其实是新建文件块数量计数器,hdfs根据这两个参数评估可能需要的存储空间,相当于给每个datanode预定了一定的空间,预定的空间在文件写入后,计算完真实的占用空间后,还会调整回来。
了解这个原理之后,可以判断的是datanode在一段时间内被预定了太多的空间。
flink的checkpoint机制可以参考这一篇www.jianshu.com/p/9c587bd49… 大致的意思是taskmanager上的很多任务线程都会写hdfs
看了下hdfs的目录结构,有大量的类似uuid命名checkpoint文件,同时每个文件都很小
当我们的作业并发较大时,相应的在hdfs上就会创建更多的checkpoint文件,尽管我们的文件大小只有几K,但是在每一个datanode预定的空间都是128M乘以分配到的文件数量(文件很小,不超过128M),那么43G的空间,最多预定多少文件呢?除一下也就是300多个,三个节点也就是最多900个,我们有多个作业,总并发较大,在预留空间完全释放前,是很容易出现这个问题的。
之前知道hdfs不适合存储小文件,原因是大量小文件会导致inode消耗以及block location这些元数据增长,让namenode内存吃紧,这个例子还表明 当blocksize设置较大,文件大小却远小于blocksize时,大量这种小文件会导致datanode直接"不可用"。
解决办法
块大小不是集群属性,是文件属性,客户端可以设置的,flink这时候每个taskmanager和jobmanager都是hdfs的"客户端",根据flink文档,我们可以做如下配置 1、在conf/flink-conf.yaml中指定一个hdfs的配置文件路径
fs.hdfs.hadoopconf: /home/xxxx/flink/conf
复制代码
这里跟flink的配置文件路径选择同一个目录
2、放进去2个配置文件,一个core-site.xml一个是hdfs-site.xml
core-site.xml可以不放,如果checkpoint和savepoint指定了具体的hdfs地址的话,
hdfs-site.xml里加上blockSize配置即可,比如这里我们给它设置为1M
具体块大小如何设置,需要观察自己的作业状态文件大小自己灵活调整。
重启flink集群,提交作业即可,运行时可以观察下hdfs的fsimage大小,注意不要因为块太小,小文件太多导致元数据过大。
小结
我们已经将该问题同步到集群自动化部署脚本中,部署时会专门添加blocksize的配置。
flink这套依赖hdfs的checkpoint方案对于轻量级的流计算场景稍显臃肿,checkpoint的分布式存储不管是直接filesystem还是rocksDB都需要hdfs,其实从checkpoint原理和数据类型考虑,es应该也是不错的选择,遗憾的是社区并没有提供这种方案。
一起来学习吧:
作者:PerfMa
链接:https://juejin.im/post/6860751785020096526
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
分享一个Flink checkpoint失败的问题和解决办法的更多相关文章
- VirtualBox提示:错误,创建一个新任务失败,被召者解决办法
		
被召者 RC: REGDB_E_CLASSNOTREG (0x80040154) 目前有两种解决办法: 解决方法一: 打开命令窗口(快捷键:窗口键+R,输入cmd点击确定) 输入cd D:\Progr ...
 - 360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法
		
360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法 同事办公室的打印机是网线接口的那种网络打印机,不是直接连到电脑的那种,他电脑安装了360和金山毒霸,WIN10下安 ...
 - tomcat启动失败问题排除及解决办法 Server Tomcat v7.0 Server at localhost failed to start.
		
tomcat启动失败问题排除及解决办法 Server Tomcat v7.0 Server at localhost failed to start. 导致上面问题的原因可能有很多种,每种的解决办法都 ...
 - Github css加载失败,样式混乱解决办法
		
github被墙的解决办法 Github css加载失败,样式混乱解决办法 打开cmd,输入 nslookup github.com 8.8.8.8 ,下面就会显示出github的服务器地址列 ...
 - WinCE启动失败的原因与解决办法分析
		
本文通过一个真实的嵌入式项目进行说明.文中的嵌入式系统用的是ARM处理器+WinCE平台,项目的目的是要把WinCE平台从旧版本移植到WinCE6.0平台上.但结果是这个WinCE系统在启动的时候经常 ...
 - 因权限引起的svn提交失败的错误及其解决办法
		
作者:朱金灿 来源:http://blog.csdn.net/clever101 前段时间,一个网友发邮件向我请教一个svn提交失败的错误.他的具体错误是这样的: 在配置svn强制输入日志时候遇到一个 ...
 - 整理Mac系统 node-sass 安装失败的原因及解决办法
		
转载与:https://segmentfault.com/a/1190000010984731 声明:本文非原创,如有侵权请留言或发邮件告知,作者会立即停止侵权并删除本文.发布此文章主要是希望跟作者遇 ...
 - win7系统的右键菜单只显示一个白色框不显示菜单项 解决办法
		
如上图所示,桌面或其他大部分地方点击右键菜单,都只显示一个白色框,鼠标移上去才有菜单项看,并且效果很丑 解决办法: 计算机-右键-属性-高级-性能-设置-视觉效果-淡入淡出或滑动菜单到视图,将其前面的 ...
 - Sql Server 2008 数据库附加失败提示9004错误解决办法
		
附加数据库 对于 服务器“WSS_Content”失败. (Microsoft.SqlServer.Smo)执行 Transact-SQL 语句或批处理时发生了异常. (Microsoft.SqlS ...
 
随机推荐
- C++语法小记---类模板
			
类模板 类模板和函数模板类似,主要用于定义容器类 类模板可以偏特化,也可以全特化,使用的优先级和函数模板相同 类模板不能隐式推倒,只能显式调用 工程建议: 模板的声明和实现都在头文件中 成员函数的实现 ...
 - 汇总我在IDEA中使用Maven导包遇到的问题
			
看吐了吗?我是真吐了 真正遇到这些问题的朋友看到这,是不是有种找到知音的感觉,别怕,你不是在一个人战斗,苦逼的日子里,还有个我陪你一起苦逼,吐了吐了,这问题不知道耗费了我多久的时间,百度好多也解决不了 ...
 - 小程序开发全栈1.2/3/4组件、flex布局、样式
			
1.2 组件 1.2.1 text组件 编写文本信息,类似于HTTP中的span 1.2.2 view组件 容器,类似于HTTP中的div 1.2.3 image组件 图片显示组件 1.3 页面fle ...
 - getprop与dumpsys命令
			
拿到Android手机以后, 想查看一些手机信息. 其实Android获取手机信息就是两个命令, 一个是getprop 一个是dumpsys. dumpsys iphonesubinfo Phone ...
 - 前端学习(一):Html
			
进击のpython ***** 前端学习--HTML HTML全称HyperText Mackeup Language,超文本标记语言 网页的超链接,图片,音频,视频都可以超文本 标记就相当于你在本子 ...
 - form表单两种提交方式的不同
			
我们在使用<Form>表单的时候,最常用的提交方式就是Get和Post.我们都知道这两种方式最大的差别就是安全性,除此之外,它们还有哪些其他的区别,你知道吗? 在<Form& ...
 - pandas之Seris和DataFrame
			
pandas是一个强大的python工具包,提供了大量处理数据的函数和方法,用于处理数据和分析数据. 使用pandas之前需要先安装pandas包,并通过import pandas as pd导入. ...
 - PHP 类型比较
			
PHP 类型比较 虽然 PHP 是弱类型语言,但也需要明白变量类型及它们的意义,因为我们经常需要对 PHP 变量进行比较,包含松散和严格比较. 松散比较:使用两个等号 == 比较,只比较值,不比较类型 ...
 - PHP deg2rad() 函数
			
实例 把角度转换为弧度: <?phpecho deg2rad("45") . "<br>";echo deg2rad("90&quo ...
 - PDO::errorInfo
			
PDO::errorCode — 返回最后一次操作数据库的错误信息(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 public array PDO::e ...