Hive CliDriver hack

2023-10-30

关于 CliDriver, 参考 Hive源码分析:CLI入口类

这个入口天生是为 Hive 的 shell 提供的,当我在自己的应用里想提交一个 Hive 任务时,却发现不能直接使用(之前 MR 的 RunJar 就可以)。

正如上面的 Hive 源码分析讲的, CliDriver 做了很多的工作,那我只能 hack 一下了。

拷贝了 CliDriver 的源码后,要做的工作有

  • hack log4j 为了使用自己的配置
  • 重新定义输出流以获取执行 HQL 的结果

hack log4j 很容易做到,有这么一段代码,重新初始化了log4j

    boolean logInitFailed = false;
    String logInitDetailMessage;
    try {
      logInitDetailMessage = LogUtils.initHiveLog4j();
    } catch (LogInitializationException e) {
      logInitFailed = true;
      logInitDetailMessage = e.getMessage();
    }
这个导致我们在外边无论怎么捣腾都没法配置日志系统,注释掉这段代码就 OK 了。

重新定义输出流需要看这里

    CliSessionState ss = new CliSessionState(new HiveConf(SessionState.class));
    ss.in = System.in;
    try {
      ss.out = new PrintStream(System.out, true, "UTF-8");
      ss.info = new PrintStream(System.err, true, "UTF-8");
      ss.err = new CachingPrintStream(System.err, true, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      return 3;
    }

重新定义下
ss.out = new YourHivePrintStream();
这些做完后,并不能执行需要 MR 的Hive, 问题是你必须解决 UGI 的冲突,不然你会遇到各种没有权限的异常,比如
[25-11:04:58,499] [ERROR] [main] [hive.ql.Driver] Authorization failed:No privilege 'Select' found for inputs { database:db, table:tb}. Use show grant to get more details.

这里有一个大坑,你想找到权限异常的原因,根本无法理解这个逻辑,权限这个东西是在 HDFS 端定义好的,登录到 HDFS 看到权限配置都正常的啊,而且直接使用 Hive 命令行都能正常执行的好吧 抓狂

最后,盯着日志从头看,发现有个警告

[25-11:04:53,106] [WARN ] [main] [hadoop.security.UserGroupInformation] No groups available for user gdpi
[25-11:04:53,108] [WARN ] [main] [hadoop.security.UserGroupInformation] No groups available for user gdpi
还连续警告了两次,只能查看源码来找原因了,首先找到这句警告信息的出处
  public synchronized String[] getGroupNames() {
    ensureInitialized();
    try {
      List<String> result = groups.getGroups(getShortUserName());
      return result.toArray(new String[result.size()]);
    } catch (IOExc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive CliDriver hack 的相关文章

随机推荐

  • 2023 年及未来最佳的软件构建工具

    当今世界 加快任务完成速度和尽可能减少人力投入是一切事物都需要关注的问题 软件开发也不例外 无论你在哪个领域 游戏 区块链 还是应用创建 软件开发的竞争都异常激烈 只要能够帮助到你 采用任何手段都无关紧要 而这也正是构建工具的作用 这些工具
  • Linux——I/O复用(2)—— poll和epoll

    poll原型 poll系统调用和select类似 也是在指定时间内轮询一定数量的文件描述符 以 测试其是否有就绪者 int poll struct pollfd fds int nfds int timeout fds struct pol
  • JAVA笔记--异常处理(第一篇)

    目录 一 异常概念 1 什么是异常 2 try与catch关键字 二 try catch finally 1 catch 2 异常处理过程分析 3 finally 三 throw throws与异常规则 1 throw throws 2 异
  • Unity3d 通过json文件使用C#脚本代码生成多个相机

    首先设计一个存储相机类型的json类如下 using UnityEngine using System using System Collections Serializable public class Cameras public in
  • matlab基本粒子群算法实现(四)

    最后在炼数成金那边找到了很好的一篇教程 在这里把它整理一下 做个粒子群算法的收尾 main m I 清空环境 clc clear II 绘制目标函数曲线 figure x y meshgrid 5 0 1 5 5 0 1 5 z x 2 y
  • 阿里巴巴一道笔试题

    其实这是谷歌的一道面试题 给定能随机生成整数1到5的函数 写出能随机生成整数1到7的函数 惭愧 阿里的笔试题做错了 说实话 以前没见过 见过了就把搞懂 阿里题目 给定rand 7 表示能生成1 7的随机数 使用四则运算和循环等控制语句 可以
  • Python基础之循环语句

    Python基础之循环语句 一 循环语句介绍 1 循环语句理解 2 循环语句示意图 二 循环语句的分类 三 循环控制语句 四 while循环 1 while死循环 2 while条件循环 五 break和continue 1 break使用
  • TCP三次握手和四次挥手 详解

    首先了解下TCP报文 16位源端口号 16位的源端口中包含初始化通信的端口 源端口和源IP地址的作用是标识报文的返回地址 16位目的端口号 16位的目的端口域定义传输的目的 这个端口指明报文接收计算机上的应用程序地址接口 32位序号 32位
  • QProcess调用外部程序阻塞等待问题解决

    QProcess调用外部程序阻塞等待问题解决 简介 第一种 第二种 简介 在使用QProcess调用外部程序时 可能会遇到两种场景 1 调用起来之后就不管 直接运行后面的代码 2 调用起来后需要等待外部程序执行完成 在继续运行下面的代码 第
  • jdbc连接数据库获取所有表,表的字段及类型之Oracle

    https blog csdn net hhhliushen article details 105272439 昨天写的这篇jdbc连接数据库获得所有表 表的所有字段及类型对于mysql来说速度还是可以的 但是对于oracle来说 真的是
  • springboot工程中生成二维码(Java)

    需求 在系统中生成一个二维码 用户保存下来并分享出去 其他人扫描之后跳到我们的一个活动详情页 查看此活动的内容 需求分析 从以上的需求中 可以提炼出以下几点 当用户点击生成二维码的时候 我们要拿到用户生成的二维码是关于哪个活动的 请求来到后
  • 前端工程师的摸鱼日常(19)

    图为恐子真身 史记记载恐子九尺六寸高 根据春秋的尺度换算 有一米九至两米多高 人皆畏之 一米九的山东大汉 手下七十二堂口 帮派 三千门生 小弟 由他弟子所编写的 抡语 这是为我们讲述了 春秋道上的规矩 首先 仁义礼智信 并不是字面上的意思
  • Matlab:生成特定范围的随机数

    Matlab 生成特定范围的随机数 在Matlab中 我们可以使用rand函数来生成随机数 但有时候我们只需要在特定的范围内生成随机数 这时候 我们可以使用Matlab提供的一些函数来实现 生成0到1之间的随机数 如果需要生成0到1之间的随
  • FISCO BCOS上使用第三方CA证书底层节点部署实操

    CA证书怎么生成 节点相互验证证书时会交叉验证吗 对于社区常遇到的此类问题 分享一些个人使用第三方CA证书部署底层节点的经验 希望可以给大家一些借鉴与参考 为什么要对第三方CA证书进行改造 首先 说明一下我进行第三方CA证书改造的背景和原因
  • eNSP静态综合试验(作业)

    整体思路 一 子网划分 IP地址网段规划 二 配置ip地址 底层 所有节点拥有合法ip地址 三 添加 配置路由 全网可达 配置静态路由表 添加缺省路由 四 添加浮动静态 五 给黑洞路由器添加空接口路由 防止成环 注 全程应及时测试 一 子网
  • 互联网安全架构设计

    面试题 你们项目的安全性是如何保证的 1 Web安全常见攻击手段 SQL注入攻击 开放平台设计 1 基于access token令牌的方式 access token的作用 记录上次最新的access token 防止用户获取到token后恶
  • 一个可以免费下载牛逼论文的网站Arxiv

    Arxiv是什么 Arxiv是一个免费张贴和下载预印本的网站 最初用于高能物理和粒子物理学家之间的交流 如今已经发展到了物理学的各个领域 且延伸到了物理 数学 非线性科学 计算机科学 数量生物学 数量金融学 统计学等多个领域 网址 http
  • C++QT获取其他exe的输入edit控件id并且设置edit内容

    C QT获取其他exe的edit控件id并且设置edit内容 找到exe的窗口句柄 1 知道exe的窗口类名已或者标题名字 2 不知道窗口名字类等等 只知道exe的启动名字 qt如何使用 找到exe的窗口句柄 找到窗口的句柄有很多种方法 可
  • 【Slack+Claude保姆级安装教程】

    AI破局先行者 AI工具 AI绘图 AI专栏 如果你想学到最前沿 最火爆的技术 赶快加入吧 作者简介 硕风和炜 CSDN Java领域优质创作者 保研 国家奖学金 JAVA开发技术栈 面试刷题 面经八股文 经验分享 好用的网站工具分享 恭喜
  • Hive CliDriver hack

    关于 CliDriver 参考 Hive源码分析 CLI入口类 这个入口天生是为 Hive 的 shell 提供的 当我在自己的应用里想提交一个 Hive 任务时 却发现不能直接使用 之前 MR 的 RunJar 就可以 正如上面的 Hiv