Hdfs 相对路径与静态代码块引起的问题
前言
HIVE 作为大数据生态的数仓解决方案,因为历史的原因在很多行业很多公司都有着广泛的应用。对于比较复杂的业务逻辑,HIVE SQL 往往比较难以表达,此时大家在开发中往往会辅以 HIVE UDF。所以充分理解和掌握 HIVE UDF正确的表写和使用方式,是大数据从业人员必不可少的一项技能。
关于HIVE UDF 的使用,明哥在前段时间发过两篇博文,分别是 “如何在 hive udHdf 中访问配置数据-方案汇总与对比” 和 “浅析 hive udaf 的正确编写方式- 论姿势的重要性" ,两篇博文描述的都是 HIVE UDF 在编写使用过程中容易犯的错误。
但 UDF 编写使用过程中遇到的问题往往很多远远不止以上两个,所以明哥决定编写一个系列 - “浅析 hive udf 的正确编写和使用方式 - 论姿势的重要性“,以上两篇博文可以算做这个系列中的系列一和系列二,本文是该系列的系列三。以下是正文。
时间紧张fs,急于知道结论的小伙伴,可以直接看最后一部分,问题总结。
问题现象与初步分析
产品部人员反馈,某 HIVE UDF 通过 hive 的旧客户端即 hive service --cli方式可以正常使用,但使用新客户端 beeline 时却会报错,客户端的报错信息没有啥明确的有意义的信息,如下图图一和图二所示:
beeline
hive
咨询产品部开发人员,该 UDF 的功能是返回给定业务日期的下一个业务日期,在背后会读取 HDF 相S上的一个日期类配置文件;经查看该 UDF 源码,发现该日期类配置文件的路径,使用的是相对路径,如下图所示:
code-relative-path
熟悉 HDFS 的小伙伴都知道 HDFS 有相对路径的概念,即代码中用相对路径方式指定的文件, 在不同用户执行作业时会被解析为不同用户的根目录下的文件,比如相对路径 dir1/fileA, 使用hive 用户执行时作业时会被解析为 /user/hive/dir1/file对路A, 使用xyz用户执行作业时会被解析为 /user/xyz/dir1/fileA, 很多 hdfs 上的文件找不到的问题都是因为该原因。因为有的环境有的用户能执行成功而另外的环境另外的用户执行却会失败,我们往往戏谑是人品问题,哈哈。
所以顺藤摸瓜,看到这里有使用相对路径指定文件,我们一个自然的思路是查看日志验证问题。需要注意,这里要查看的是服务端的日志,即 beeline 连接的 hiveserve径与r2 实例的日志,在 cdh 中一般是 /var/log/hive下。果不其然,看到了熟悉的报错信息:
hiveserver2-log
进一步咨询产品部人员,他们把该配置文件上传到了 /user/root/ 目录下,没有上传过其它目录。这也解释了,为什么 他们 hive service --cli 方式能够成功,而 beeline方式如 beeline -u jdbc:hive2://xxx:10000/default -静态n userA -p passwd 方式却会失败:因为他们使用前者时是固定在 root 登录用户的身份下提交的作业(这其实不太合规范,一般不建议用root身份运行应用程序),而使用后者时实际生效的用户是 -n 参数指定的用户而不是当前登录用户!(没有启用用户身份认证或启用ldap认证时,都是通过 -n 参数指定用户身份;启用kerberos认证时,通过kerberos的 principal指定用户身份)。代码这里还有个小细节,如果没有启用身份认证且 beeline后没有使用 -n参数指定用户,真正生效的用户时anonyous匿名用户,对应的 home directory 是 /user/anonymous.
分析到这里,我们觉得只需要上传该配置文件到对应用户的 home directory下,即可解决该问题了。但实际验证发现,啪啪打脸,同样的问题仍然存在!
问题进一步分析与解决
再次仔细查看相关代码,发现了问题块引所在:该 UDF 读取配置文件的内容,使用的是类的静态代码块(不是静态方法)。为什么使用静态代码块会引起问题?要回答这个问题,需要比较扎实的 JAVA 功底, 和对 UDF 执行机制的深刻理解。小伙伴们可以下想下。
code-static
不卖关子,直接说原因:我们知道 SQL 和 UDF 的解析编译优化和生成 mr/tez/spark 任务是在 hiveserver2 中进行的,但并不是所有的 sql 和 udf 都会生成 mr/起的tez/spark 任务,比如这里该 UDF就不会生成 mr/tez/spark 任务,也不需要向 yarn 申请资源获得 container 容器,而是直接在 hiveserver2 中执行的。所以前几次 UDF的失败调用时,该 hiveserver2 这个jvm 已经加载了对应的类,此次再次调用该 UDF 时不需要重新加载该类,自然也不会重新执行类的静态代码块,所以没有重新读取配置文件的内容,所以没有更新对应的配置变问题量,执行也就失败了。
重新启动该 hiveserver2 实例后,再次提交该 udf,会重新加载对应的类,并执行其中的静态代码块读取配置文件的内容,读取成功后会更新对应的配置变量,最后作业执行成功。
问题总结 HDFS 有相对路径的概念,即代码中用相对路径方式指定的文件, 在不同用户执行作业时会被解析为不同用户的根目录下的文件,比如相对路径 dir1/fileA, 使用hive 用户执行时作业时会被解析为 /usHder/hive/dir1/fileA, 使用xyz用户执行作业时会被解析为 /user/xyz/dir1/fileA, 很多 hdfs 上的文件找不到的问题都是因为该原因; Hive SQL 和 UDF 的解析编译和优化是在 hiveserver2 中进行的,解析编译和优化的结果一般是生成 mr/tez/spark 任务,这些 mr/tez/spark 任务是在向 yarn 申请获得的 container 容器对应的 jvmfs 中执行的;但并不是所有的 sql 和 udf 都会生成 mr/tez/spark 任务,此时其真正的执行就是直接在 hiveserver2 这个已经存在的 jvm 中执行的,该 hiveserver2 这个 jvm 的生命周期跟 udf 的执行无关,如果涉及到配置环境变量,系统参数,或加载类及执行静态代码块,要尤其小心,必要时需要重启 hiveserver2;(udf 中需要谨慎只用静态代码块,因为静态代码块只有在初次加载类的 相时候才会执行) udf中读取配置文件,有多种方式,常见的有:
配置文件使用绝对路径指定,且在代码中写死绝对路径;
配置文件使用绝对路径,但在代码中通过读取本地配置文件获取hdfs上配置文件的最终绝对路径;
配置文件使用相对路径,在客户现场部署时需要确定执行作业的真正用户身份,并上传该配置文件到对应用户的跟目录下的特定路径;
(责任编辑:解决方案)
-
Salesforce在爱尔兰办事处再裁员50人 此前曾宣布全球裁员10%
8月3日消息,据外媒报道,当地时间周三,美国云计算公司Salesforce在其爱尔兰办事处解雇了约50名员工,涉及销售和客户成功团队。 Salesforce的一位发言人证实了这一报道,并在一份电子邮件...[详细]
-
标签: 影石创新 Insta360 2025业绩快报 运动相机
云梦级2月14日云梦级消息,影石创新今日发布 2025 年度业绩快报,公司实现营业总收入 98.58 亿元,同比增 76.85%,营收创历史峰值;归母净利润 9.64 亿元,同比微降 3.08%。 从...[详细]
-
标签: DeepSeek DeepSeekV4 乌兰察布 东数西算
云梦级4月15日云梦级消息,据快科技报道,AI 大模型公司 DeepSeek(深度求索)近期发布全新招聘岗位,此次招聘岗位为数据中心高级运维工程师、数据中心高级交付经理,月薪最高达30000元。 这是...[详细]
-
谷歌AI摘要功能惹大祸!知名媒体集团起诉垄断巨头"偷内容毁生意"
科技巨头与传统媒体之间的战争正在升级。谷歌刚刚遭遇一场可能改变AI行业格局的重磅诉讼,这次站出来挑战的是美国知名媒体集团Penske Media Corporation,旗下拥有《滚石》、《公告牌》、...[详细]
-
北京时间12月10日凌晨消息,周三,Facebook在美遭遇两起大规模反垄断诉讼。对此,Facebook则表示,该公司正在评估美国联邦贸易委员会和各州总检察官发起的这两项反垄断诉讼。 Facebook...[详细]
-
云梦级3月16日云梦级消息,泉州嘉德利电子材料股份公司(简称:“嘉德利”)日前获IPO备案,准备在上交所主板上市。 嘉德利是专注从事 BOPP 电工膜研发、生产和销售的企业,深耕 BOPP 电工膜领域...[详细]
-
在上一个模块中,我们创建了示例应用程序,然后创建了一个用于构建映像的 Dockerfile。我们使用命令创建了我们的图像docker build。现在我们有了一个图像,我们可以运行该图像并查看我们的应...[详细]
-
Hello,大家早上好,又是元气满满的一天,先来浏览新鲜的早报吧~ 【美政府批准对华出售 H200 芯片】 美国政府批准英伟达向中国出口 H200 芯片,但将抽取 25% 分成。英伟达 CEO 黄仁勋...[详细]
-
近日,由中国工程院院刊《Engineering》主办的 “2025全球十大工程成就” 评选结果正式公布。这一评选旨在表彰近五年内完成并取得全球性影响的重大工程科技创新成果。经过全球范围内的提名征集、专...[详细]
-
Hello,大家早上好,又是元气满满的一天,先来浏览新鲜的早报吧~ 【AMD Ryzen 7 9850X3D 发布】 AMD 1 月 6 日正式发布 Ryzen 7 9850X3D,这是一款基于 Ze...[详细]

亚马逊员工呼吁公司停止向Parler提供网络服务
OpenAI估值飙至5000亿美元!员工套现66亿,创私企纪录
云计算核心技术Docker教程:Docker使用覆盖网络
亚马逊CEO接班人贾西:致力于开发电子游戏
