【hive】远程remote debug hive的方法,用于hive监听器/钩子编写

背景

写hive监听器时候需要拿到hive对象但hive是在集群linux主机上运行的。通过jdbc提交的sql具体执行过程不会再idea中运行。所以如果需要拿到hive对象有可能存在两个思路:
(1)想办法写个钩子或者监听器,将需要的内容写成json字符串,在复制出来,在IDE中反序列化,然后回放。这个过程有个缺陷,如org.apache.hadoop.hive.ql.QueryPlan虽然继承了java.io.Serializable但是实际使用中需要内部各个成员变量都支持序列化,java没法做到编译检查。所以不可行。
(2)使用remote debug功能,可能社区版Community的IDEA没有此功能。

使用方法

先help看下:
在这里插入图片描述

hiveserver2启动方法:

# 默认开启本地8000端口号,日志里边有显示
$HIVE_HOME/bin/hive --debug --service hiveserver2 &

在这里插入图片描述此时需要在IDE(这里以IDEA举例说明)连接此端口,hiveserver2才会继续运行,否则将一直阻塞(docker里测试不生效不知道为啥)
如果集群有多个hiveserver2,选择一个hiveserver2即可。idea连接指定好host即可。
在这里插入图片描述
在这里插入图片描述IDEA连接了远程端口后,远端的hiveserver2就会继续运行了。

以下以钩子为例:org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext
在这里插入图片描述
在hive中执行大多数操作都会触发此断点。
如:show tables; use database ...; insert into table ...;
当然断点也可以打到hive自己的类上。

cloudera CDH版本hive 远程debug方法:

进入文件夹:HIVE_HOME/bin/ext
修改

找到hiveserver2.sh文件的 exec $HADOOP jar $JAR $CLASS $HIVE_OPTS "$@"上的export HADOOP_OPTS=.. 在其前追加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=2160 2160端口号只要不冲突,随意定义。suspend=n为了使hiveserver2启动时候不阻塞,不需要的等待ide连接。hiveserver2完全启动后,再启动ide的remote debug就可以连接hive了。

修改好后如下:

 export HADOOP_OPTS=" -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=3380 $HIVESERVER2_HADOOP_OPTS $HADOOP_OPTS"

找到metastore.sh文件的export HADOOP_OPTS="$HIVE_METASTORE_HADOOP_OPTS $HADOOP_OPTS $HIVEMETASTORE_AGENT_OPTS",端口号同理,不冲突就可。
修改好后如下:

export HADOOP_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=2190 $HIVE_METASTORE_HADOOP_OPTS $HADOOP_OPTS $HIVEMETASTORE_AGENT_OPTS"

idea的配置如上案例。
对于metastore ha 执行debug需要注意在ambari或者其他手段(kill -9)停止一个metastore,因为idea debug一般只监听一个主机的特定端口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值