博客
关于我
网易游戏基于 Flink 的流式 ETL 建设
阅读量:546 次
发布时间:2019-03-09

本文共 1686 字,大约阅读时间需要 5 分钟。

网易游戏基于Flink的流式ETL建设

互联网游戏行业的数据处理需求具有鲜明的特点:海量非结构化日志数据、频繁的数据变更以及复杂的数据异构问题。网易游戏作为行业领军者,在数据处理方面积累了丰富的经验,特别是在基于Flink的流式ETL建设方面形成了一套高效的解决方案。本文将探讨网易游戏的ETL架构及其实践经验。

业务背景

网易游戏的数据采集主要依赖日志文件,采集的数据通常为非结构化或半结构化形式。这些日志经过ETL处理后才可以进入实时或离线数据仓库,为业务用户提供便捷的数据查询和分析服务。与互联网和金融行业不同,游戏行业普遍使用MongoDB等 schema-free 文档型数据库,这导致了ETL数据清洗的特殊挑战。

数据处理特点

  • 数据异构问题:由于数据库选型,游戏行业的数据模式通常遵循反范式设计,导致数据表结构复杂,难以依赖固定schema进行处理。

  • 高频率变更:游戏版本迭代频繁,日志类型和格式随之变化,ETL系统需要具备灵活性和适应性。

  • 实时数仓支持:随着实时数据仓库的普及,复用ETL管道提取转换数据到实时和离线数据仓库成为自然发展方向。

  • 日志分类

    网易游戏日志分为三个类型:

  • 运营日志:记录玩家行为事件(如登录、领取礼包等),具有固定格式,主要用于数据报表和用户画像分析。

  • 业务日志:涵盖非玩家行为事件(如Nginx日志、CDN日志等),格式多样,通常以文本形式出现。

  • 程序日志:用于记录软件运行情况(如错误日志、性能指标等),常写入ES或其他数据库。

  • ETL服务架构

    网易游戏的ETL服务为不同日志类型提供了定制化的处理方案:

  • 运营日志专用ETL:基于Flink DataStream框架,支持Python UDF实现复杂的数据处理和标准化。

  • 通用ETL(EntryX):针对文本日志提供支持,涵盖解析、转换、格式化等多个阶段,可灵活映射到不同存储系统。

  • 运营日志ETL发展历程

    运营日志ETL的历程反映了Flink技术的成熟应用:

  • 初期Hadoop+Python:2013年投入使用,稳定运行多年。

  • Spark实现:2017年引入Spark Streaming,面临微批调优和小文件处理问题。

  • Flink迁移:2018年基于Flink DataStream实现第三代ETL,支持Python UDF无缝迁移。

  • 运营日志ETL架构

    Flink版本对比显示出显著优化:

  • Hadoop版本:依赖HDFS和Python脚本,包含预处理、通用转换和后处理模块。

  • Flink版本:直接对接Kafka数据源,使用Flink内置模块,支持Python UDF,提升效率和可维护性。

  • Python UDF实现

    • 选择Jython:为了降低运维成本,选择在JVM内运行的Jython,支持Flink ProcessFunction控制。

    • 资源管理:通过YARN上传Python模块,避免用户自行安装依赖。

    ETL运行优化

  • 预分区优化:通过数据流预分区减少HDFS写入的文件数,提升性能。

  • SLA统计工具:基于OperatorState实现流量统计,支持动态注册和TTL清理。

  • 容错恢复机制:统一错误输出流,支持补数修复和数据回滚,确保数据完整性。

  • 调优实践

    HDFS写入优化

  • 预分区策略:根据Hive表分区进行分区处理,减少小文件数。

  • 基于OperatorState的SLA统计

    • 指标类型:包括记录数、错误数等,支持动态注册和TTL。
    • 实施效果:有效监控ETL执行效果,定位问题根源。
  • 数据容错及恢复

    • 错误数据收集:收集所有ETL阶段出错的数据,形成统一错误流。

    • 修复机制:通过补数作业修复异常数据,切换分区位置,恢复数据完整性。

    未来规划

  • 数据湖建设:支持CDC数据的Read倾听,扩展数据处理能力。

  • 附加功能开发:提供实时数据去重、文件合并等功能,提升用户体验。

  • PyFlink支持:向量化技术提升处理速度,为未来数据库扩展做准备。

  • Flink技术在网易游戏ETL中的应用展示了其强大的流处理能力,通过合理的架构设计和优化策略,实现高效、稳定、可扩展的数据处理服务。

    转载地址:http://uygiz.baihongyu.com/

    你可能感兴趣的文章
    java 8 list对象属性判空_java ---- 认识类对象,属性和方法
    查看>>
    java http delete_java积累---HttpDelete请求方式传递参数
    查看>>
    java swing数据库,如何在Java swing中查看数据库结果集
    查看>>
    java xmpp 群聊,使用XMPPFramework openfire创建聊天室
    查看>>
    java 反义_java中一些常用的英语
    查看>>
    java 命令行 class_如何从命令行执行java .class
    查看>>
    java 字符编码过滤器_java web中字符编码的过滤器(Filter - 1)
    查看>>
    java 线程 栈_Java线程堆栈分析
    查看>>
    #pragma data_seg() 共享数据// MyData段 // 进程 // DLL
    查看>>
    #NOIP前数学知识总结
    查看>>
    java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!
    查看>>
    java序列化_java对象的序列化和反序列化
    查看>>
    java开发区块链_用Java代码实现区块链
    查看>>
    java快捷键eclipse_eclipse的设置和一些快捷键
    查看>>
    java拼车平台(ssm框架毕业设计)
    查看>>
    Java指定区间返回随机数
    查看>>
    Java推动老年人社区服务(毕设源码+mysql+lw)
    查看>>
    Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
    查看>>
    java操作List
    查看>>
    Java操作Sql语句 出现迭代死循环 (Bug排查)
    查看>>