分享一个大数据应用因为和大数据集群服务端组件的版本冲突引起的问题

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 分享一个大数据应用因为和大数据集群服务端组件的版本冲突引起的问题

分享一个大数据应用因为和大数据集群服务端组件的版本冲突引起的问题

1 先说结论

大数据应用程序与普通微服务应用程序的一个显著区别是,两者对底层各种依赖项的版本管理要求不同:

  • 普通微服务只需要确保应用底层的各种依赖项,包括应用本身引入的直接与间接依赖,以及应用底层框架引入的直接与间接依赖,没有版本冲突即可;
  • 而大数据应用程序,除了需要确保应用底层的各种依赖项没有版本冲突,还需要确保这些依赖项的版本,跟大数据集群服务端的 hdfs/hive/yarn/spark/flink 等的版本是兼容的;
  • 之所以要求大数据应用程序和大数据集群服务端的版本兼容性,其根本原因是,通过 hadoop jar/spark-submit/flink run 等命令提交大数据作业时,这些命令会把大数据集群服务端的特定路径下的 JAR 包添加到作业底层 JVM 的类加载路径中(大家可以从 spark-submit/flink run等命令对应的 bash 脚本中轻松发现这点);
  • 大数据集群服务端的多个服务之间,也有版本兼容性的要求,因为这些服务之间可能也互为客户端和服务端,比如 spark/flink/hive 就是 hdfs/yarn 的客户端 (各厂商的大数据发行版比如 cdh/cdp/tdh 等,其底层整合的都是各个服务组件相互之间没有兼容性问题的版本;所以用户基于 apache 开源版本自行封装组合各个组件构建大数据集群时尤其需要注意各组件相互之间的兼容性);
  • 当编写 HIVE UDF/UDAF 时,尤其需要注意底层 pom 依赖中引入的 hive-exec 的版本,需要跟大数据集群服务端的 hive(以及 hive 底层的 hdfs/yarn 等),在版本上没有兼容性问题;
  • 对接 CDH 等大数据平台的业务系统,在升级对接 CDP 等新版大数据平台时,其业务代码底层的 hdfs/yarn/hive/spark/flink 等依赖的版本,就需要跟服务端对应组件,在版本上没有兼容性问题;
  • 当大数据应用程序和和大数据集群服务端的 hadoop/hive/spark/flink 等版本不兼容时,应用程序在执行时就会报各种奇怪的问题,比如找不到类定义,找不到类方法等;
  • 大数据应用程序和大数据集群服务端的版本的兼容性,不一定要求二者版本完全一致,但一般至少要求二者大版本一致(如 hadoop3.2.1,其大版本是3,小版本是2,修复版本是1),因为大数据组件在大版本变动时普遍可能会更改一些底层的公共接口;

2 问题现象

某大数据业务系统对接了 CDH 大数据平台,并在多个客户的 CDH 大数据平台中长期平稳运行。

由于近期不少客户在规划升级 CDH 到 CDP,故该业务系统也开始了针对 CDP 大数据平台的适配工作。

该业务系统中部分作业使用了 HIVE UDF,这些 UDF 在 CDP 平台中运行时报错了,通过 yarn logs -applicationId xxx 查看详细日志,部分报错信息如下:

640.png


2022-11-10 10:17:45,088 [INFO] [main] |service.AbstractService|: Service org.apache.tez.dag.app.DAGAppMaster failed in state INITED; cause: java.lang.NumberFormatException: For input string: "30s"
java.lang.NumberFormatException: For input string: "30s"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.lang.Long.parseLong(Long.java:589)
        at java.lang.Long.parseLong(Long.java:631)
        at org.apache.hadoop.conf.Configuration.getLong(Configuration.java:1319)
        at org.apache.hadoop.hdfs.client.impl.DfsClientConf.<init>(DfsClientConf.java:247)
        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:303)
        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:287)
        at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:156)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2811)
        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:100)
        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2848)
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2830)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:389)
        at org.apache.hadoop.fs.Path.getFileSystem(Path.java:356)
        at org.apache.tez.common.TezCommonUtils.getTezBaseStagingPath(TezCommonUtils.java:87)
        at org.apache.tez.common.TezCommonUtils.getTezSystemStagingPath(TezCommonUtils.java:146)
        at org.apache.tez.dag.app.DAGAppMaster.serviceInit(DAGAppMaster.java:465)
        at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
        at org.apache.tez.dag.app.DAGAppMaster$9.run(DAGAppMaster.java:2616)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1807)
        at org.apache.tez.dag.app.DAGAppMaster.initAndStartAppMaster(DAGAppMaster.java:2613)
        at org.apache.tez.dag.app.DAGAppMaster.main(DAGAppMaster.java:2419)

3 问题原因

  • 该问题的直接原因,跟 hdfs 的 HDFS-12920 缺陷有关:”HDFS-12920:HDFS default value change (with adding time unit) breaks old version MR tarball work with Hadoop 3.x“:

640.png


  • HDFS-12920 简述如下:
  • HDFS 前期通过 HDFS-10845 对配置文件 hdfs-default.xml 中的时间相关参数的默认的参数值做了修改,增加了时间单位比如 ms/second 等,然而老版本的 hadoop 客户端显然不能正确识别这些带时间单位的参数值;
  • 比如参数 dfs.client.datanode-restart.timeout,在老版本中其默认值是 30000,而在新版本中其默认值是 30s,所以如果用户将使用了老版本的 hadoop 依赖的作业,提交到包含了新版本的hadoop的大数据集群中时,就会因为作业底层老版本客户端代码解析不了大数据集群服务端该参数的新版本默认值而包错误,也就是作业错误信息中的“java.lang.NumberFormatException: For input string: "30s";
  • hadoop 官方也给出了一种临时的解决方案,即用户可以在配置文件 hdfs-site.xml 中,对时间参数显示指定不带时间单位的值,从而覆盖 hdfs-default.xml中带时间单位的默认值,从而避免后续解析问题;
  • 然而该问题的根本原因其实是,大数据应用程序底层通过pom依赖引入的组件的版本,跟大数据集群服务端的版本存在兼容性问题,如下图所示,应用程序底层依赖的是hive-exec-2.1.1,而 CDP 服务端使用的是 hive-exec-3.1.X;

640.png

4 问题解决方案

  • 问题解决方案是,将 HIVE UDF 通过 pom引入的依赖项 hive-exec,从 2.1.x 版本升级为 3.1.x 版本(最好大小版本号都跟服务端保持一致),并重新编译打包即可(调整依赖版本并重新打包即可,一般不需要改动代码);
  • 需要说明的是,对参数 dfs.client.datanode-restart.timeout 显示指定不带时间单位的值比如30000,从而覆盖 hdfs-default.xml 中带时间单位的默认值 30s,虽然可以解决上述报错,但是会出现新的其他问题,其根本原因还是大数据应用代码和大数据集群服务端组件的版本不兼容;

640.png640.png

  • 还有一点需要注意下,大数据应用程序引入的依赖项,在开发测试环境中有些依赖项需要指定 pom scope 为 “compile”(特别是通过IDE直接运行调试时),但在生产环境这些依赖项需要指定 pom scope 为 “provided”,因为在生产环境运行时是运行在大数据集群环境中,此时通过 hadoop jar/spark-submit/flink run 等命令提交大数据作业时,这些命令会把大数据集群服务端的特定路径下的 JAR 包添加到作业底层 JVM 的类加载路径中,这些 JAR 包中已经包含了对应的类,如果应用打包时也包含了这些类,二者反倒容易引起版本冲突;(比如 hive udf 依赖的 hive-exec, 就应该指定 scope 为 provided);
相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
19天前
|
SQL 分布式计算 数据可视化
Tableau与大数据:可视化工具在大数据分析中的应用
【4月更文挑战第8天】Tableau是一款领先的数据可视化工具,擅长于大数据分析,提供广泛的数据连接器,支持多源整合。它与Hadoop、Spark等深度集成,实现高效大数据处理。Tableau的拖拽式界面和交互式分析功能使得非技术人员也能轻松探索数据。在实战中,Tableau用于业务监控、数据storytelling和自助式分析,推动数据民主化,提升决策效率。未来,Tableau将持续创新,扩展生态系统,并保障数据安全与合规性,助力企业最大化数据价值。
29 0
|
25天前
|
存储 消息中间件 监控
【Flume】Flume在大数据分析领域的应用
【4月更文挑战第4天】【Flume】Flume在大数据分析领域的应用
|
2月前
|
Cloud Native 数据处理 云计算
探索云原生技术在大数据分析中的应用
随着云计算技术的不断发展,云原生架构作为一种全新的软件开发和部署模式,正逐渐引起企业的广泛关注。本文将探讨云原生技术在大数据分析领域的应用,介绍其优势与挑战,并探讨如何利用云原生技术提升大数据分析的效率和可靠性。
|
2月前
|
存储 消息中间件 大数据
Go语言在大数据处理中的实际应用与案例分析
【2月更文挑战第22天】本文深入探讨了Go语言在大数据处理中的实际应用,通过案例分析展示了Go语言在处理大数据时的优势和实践效果。文章首先介绍了大数据处理的挑战与需求,然后详细分析了Go语言在大数据处理中的适用性和核心技术,最后通过具体案例展示了Go语言在大数据处理中的实际应用。
|
4月前
|
数据采集 搜索推荐 大数据
大数据技术在电商平台中的应用
电商平台是当今社会最为普及的购物方式之一,而大数据技术则成为了众多企业的强有力竞争力。本文将介绍大数据技术在电商平台中的应用,包括数据采集、预测分析、用户画像等方面,并探讨其对电商平台的价值和意义。
|
4月前
|
存储 机器学习/深度学习 算法
大数据时代下的智能洞察:大规模数据处理的创新与应用
在信息爆炸的时代,大规模数据处理成为了科技领域的核心挑战之一。本文将探讨大规模数据处理的定义、创新技术和广泛应用,并阐述数据驱动的决策和洞察对现代社会带来的巨大影响。
81 3
|
2月前
|
数据采集 分布式计算 大数据
Java语言在大数据处理中的应用
传统的大数据处理往往依赖于庞大的数据中心和高性能的服务器,然而随着大数据时代的到来,Java作为一种强大的编程语言正在被广泛应用于大数据处理领域。本文将探讨Java语言在大数据处理中的优势和应用,以及其在分布式计算、数据处理和系统集成等方面的重要作用。
|
2月前
|
存储 大数据 数据挖掘
云计算与大数据:从基础设施到实际应用
云计算与大数据:从基础设施到实际应用
155 0
|
4月前
|
数据挖掘
离线大数据分析的应用
离线大数据分析的应用
|
20天前
|
SQL Cloud Native 架构师
深入浅出Presto:大数据查询引擎的原理与应用
【4月更文挑战第7天】Presto是高性能的分布式SQL查询引擎,专为大规模数据交互式分析设计。它采用分离式架构,内存计算和动态规划优化查询,支持跨源查询、交互式查询和ANSI SQL兼容性。应用于大数据分析、实时数据湖查询和云原生部署。Presto的灵活性和效率使其在大数据处理领域备受推崇,适合分析师、数据科学家和IT架构师使用。未来将在博客中分享更多实践和案例。
22 1

热门文章

最新文章