| 场景 | 导致原因 | 影响 |
|---|---|---|
| kafka consumer poll消息失败 | 1. 网络问题;2. kafka broker 磁盘坏道,拉取消息一直失败或其他 kafka 原因 | 导致一个或多个topic&partition的消息未消费完整 |
| 硬件故障,机器重启 | 磁盘满、硬件故障等 | 机器宕机、重启、yarn内部机制会重新在另外一个nodeManager节点重新分配宕机节点的mapper task,可能会造成数据重复 |
| task killed | 1. yarn 主动 killed task : ①, mapper 初始化某个逻辑卡住,导致 mappper 超时;如:加载调试设备信息时 mysql 阻塞、加载 lP 库一直Full GC 或者 mapper 获取不到执行资源一直等待等; ② yarn . nodemanager .local-dirs and yarn. nodemanager . log-dirs 配置的磁盘使用率超过 90 % ResourceManager 标记那台 NodeManger 为bad ,把机器上跑的 container 都 kill了,导致 ETL 一个 mapper 被 kill ,然后起一个新的 mapper task ,但是因为 kill mapper task attmept 未正常关闭,导致文件租约 Iease 未安全释放,后面起 Mapper 一直写失败; 2.S手工 killed task ①Hadoop 集群节点负载太高,一些 DataNode 响应慢或者进程值死无响应,导致HDFS 写入一直超时失败等;人工 killed | 这个 mapper 分配执行的所有 topic partition 消息未消费或者消息不完整(影响多个 topic ) ;mapper 执行慢,数据一直写不进去(创建、读写 block 超时) : |
当用户调用 application kill 时会经历三个阶段:
| 重跑方式 | 优点 | 缺点 |
|---|---|---|
| 1.备份目标目录的数据 2.将 kafka topic &partition 的 offset 重新消费一遍清洗落地; |
简单(由于每个 et l执行消费的offset 都是自己记录维护的.找到当前小时或者当天对应的最小以及最大offset 重新消费即可) | 依赖于 kafka 消息过期时间,过期后无法重新消费; 因为大部分时间分区是是按天的.目前重跑一天的数需要 4 +小时.故障后恢复非常慢; |
| 记录未消费的offset信息,补跑未消费的offset即可 | 速度快(只处理未消费完整的topic&partitioner offset) | 1 )依赖于 kafka 消息过期时间,过期后无法重新消费 2 ) MapTask 被 yarn killed 或者人为 killed ,会导致写数据的 Writer 不正常关闭流,从而引发 hdfs 文件租约 Iease 未释放、 block recovery 等问题,导致后面数据 append 失败; 3 ) MapTask attempt 被 yarn killed 后会自动起另外一个 attemPt (目前来.无法避免,这是 yarn 的机制,需要改源码),可能导致数据重复写入: 4 ) killed 或者机器宕机是无法记录到。offset 消息到哪里,只能每段小段时间记录当前 offset .当 MapTask 被 killed . offset 可能不是最新的,导致补跑时重复写了部分数据; |
| 1 ) ETL 小时任务,数据落地到临时目录.文件按小时划分.支持覆盖写(保存一段时间) ; 2 )当数据落地成功,检测每个 toPic partition 的消费情况进行处理; 3 )如果 topic partitlon 的消息消费不完整时,告警通知,手工重跑相关 toPic partition 的小时任务; 4 )如果消费完整,将小时数据文件合并到仓库的目标文件(每个 topic 、 partition 单独一个文件) ; 5 )如果合并过程失败.告警通知,手工触发重新将已经落地的小文件合并成一个目标仓库文件; |
支持小时重跑、覆盖写 恢复速度较快 HDFS block 丢失、可以从小文件新恢复 |
1 )流程比较复杂,多出一个数据合并 Merge 的步骤; 2 )每小时的 ETL 会产生非常多的小文件间定期删除;需要保留一段时 |
如下图所示是第三种重跑方式的整体流程,ETL 是按照小时调度的,首先将数据按小时写到临时目录中,如果消费失败会告警通知并重跑消费当前小时。如果落地成功则合并到仓库目录的目标文件,合并失败同样会告警通知并人工重跑,将小文件合并成目标文件。
| 流程 | 按天分区的topic |
|---|---|
| 每小时05分调度的ETL正常跑完 | 1.包含之前的数据.如:昨天漏采集的日志.直接在对应日期分区目录下创建一个新的数据文件; 2.今天的日志,直接在今天的日期分区下创建一个新的数据文件; 3.将当前 ETL 产生的小文件直接 append 到对应日期分区以及相同 partition 下的文件; |
| 一个小时内执行多次ETL | 1.因为目前落地的临时文件都是按 partition +执行时间(yyyyMMddHH )生成的,如: all _ 1 _ 2018031511 . avro ; 2.如果一个小时执行多次 ETL ,每次都会消费新的 offset ( etl _ 0ffsets 会存多条记录),但是临时目录的数据文件的名称相同,这时候通过 append 方式追加数据; 3.如果小时重跑时.会找到当前小时内 topic--partjtion 的最小的 beginoffset 、最大的 endoffset 重新从 kafka 消费,这样保证了数据的完整性; |
| 小时ETL重跑(前提未进行merge) | 1 )小时三跑,直接找到对应小时 topic--partition 的最小的 beginoffset 、最大的 endoffset 重新从 kafka 消费: 2 )之前已经创建的临时目录的数据文件会以 create overwrite 形式重新写入数据; 3 )最后在将文件 append 到对应日期分区下相同 partition 的文件; |
| merge失败(小时ETL产生的临时数据文件已经是完整、可靠的) | 重新根据当天每小时 ETL 产生的临时数据文件合并一个目标仓库文件即可: |
| ETL消费消息不完整 | 1.消费不完整的 toPic 、 partition 信息会记录.告警短信通知: 2 )人工重跑对应 topic--partition 小时 ETL 即可(支持细化到 partition 的小时数据重跑,因为是 overwrite ) |
| MapTask attempt killed by yarn | 1 ) MapTask attempt 被 yarn 的机制 killed 后.另启的 attempt 会 overwrite 之前的文件(排除一个小时执行多次 ETL 的情况.这时候需要人工重跑).比较好的兼容 hadoop 集群的故障; |
| NodeManager carsh by hardware fault | 由于机器硬件故障导致运行 ETL 的 MapTask 的 NodeManager 直接 crash :1 )数据正在写入临时目录,手工重跑对应 topic 一 partition 小时的 ETL 即可: 2 )数据正在 merge ,手工重新 merge 对应 topic date 的数据; |
| 人为killed整个ETL job | 人工处理未执行的topic :1.数据正在写入临时目录,手工重跑对于topic-partition小时的ETL即可 2.数据正在 merge , 手工重新merge对应 topic--date 的数据: |
现在离线 Kafka-ETL 是每小时 05 分调度,每次调度的 ETL 都会获取每个 topic&partition 当前最新、最大的 latest offset,同时与上个小时消费的截止 offset 组合成本地要消费的 kafkaEvent。由于每次获取的 latest offset 是不可控的,有些情况下某些 topic&partition 的消息 offset 增长非常快,同时 kafka topic 的 partition 数量来不及调整,导致 ETL 消费处理延迟,影响下游的业务处理流程:
Kafka ETL 是否能自动水平扩展不强依赖于 kafka topic partition 的个数。如果某个 topic kafkaEvent 需要处理的数据过大,评估在合理时间范围单个 mapper 能消费的最大的条数,再将 kafkaEvent 水平拆分成多个子 kafkaEvent,并分配到各个 mapper 中处理,这样就避免单个 mapper 单次需要处理过大 kafkaEvent 而导致延迟,提高水平扩展能力。拆分的逻辑如下图所示:
后续我们将针对以下两点进行自动水平扩展的优化:
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
我是Cucumber测试的新手。我创建了两个特征文件:events.featurepartner.feature并将我的步骤定义放在step_definitions文件夹中:./step_definitions/events.rbpartner.rbCucumber似乎在所有.rb文件中查找步骤信息。有没有办法限制该功能查看特定的步骤定义文件?我之所以要这样做,是因为即使我使用了--guess标志,我也会遇到不明确的匹配错误。我之所以要这样做,有以下几个原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。事件.特征Feature:AddpartnerA
在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和
我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。
当您在Ruby脚本中使用系统调用时,您可以像这样获得该命令的输出:output=`ls`putsoutput这就是thisquestion是关于。但是有没有办法显示系统调用的连续输出?例如,如果您运行此安全复制命令,以通过SSH从服务器获取文件:scpuser@someserver:remoteFile/some/local/folder/...它显示随着下载进度的连续输出。但是这个:output=`scpuser@someserver:remoteFile/some/local/folder/`putsoutput...不捕获该输出。如何从我的Ruby脚本中显示正在进行的下载进度?