首页 > 其他分享 >dremio hive jdbc arp date 类型问题记录

dremio hive jdbc arp date 类型问题记录

时间:2024-01-03 13:03:33浏览次数:29  
标签:arp dremio jdbc java exec sabot FragmentExecutor com

简单记录下碰到的一些问题

分析

  • arthas stack 查看调用
    对于hive 是类似的,我测试的是mysql 的
stack com.mysql.cj.jdbc.result.ResultSetImpl  getDate

效果

ffect(class count: 2 , method count: 4) cost in 329 ms, listenerId: 11
ts=2023-12-26 06:18:17;thread_name=e3 - 1a758fd6-4c6d-9baa-6d8f-31fa8220ee00:frag:0:0;id=c4;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
    @com.mysql.cj.jdbc.result.ResultSetImpl.getDate()
        at org.apache.commons.dbcp2.DelegatingResultSet.getDate(DelegatingResultSet.java:682)
        at org.apache.commons.dbcp2.DelegatingResultSet.getDate(DelegatingResultSet.java:682)
        at com.dremio.exec.store.jdbc.JdbcRecordReader$DateCopier.copy(JdbcRecordReader.java:688)
        at com.dremio.exec.store.jdbc.JdbcRecordReader.next(JdbcRecordReader.java:291)
        at com.dremio.exec.store.CoercionReader.next(CoercionReader.java:187)
        at com.dremio.sabot.op.scan.ScanOperator.outputData(ScanOperator.java:365)
        at com.dremio.sabot.driver.SmartOp$SmartProducer.outputData(SmartOp.java:551)
        at com.dremio.sabot.driver.StraightPipe.pump(StraightPipe.java:56)
        at com.dremio.sabot.driver.Pipeline.doPump(Pipeline.java:124)
        at com.dremio.sabot.driver.Pipeline.pumpOnce(Pipeline.java:114)
        at com.dremio.sabot.exec.fragment.FragmentExecutor$DoAsPumper.run(FragmentExecutor.java:565)
        at com.dremio.sabot.exec.fragment.FragmentExecutor.run(FragmentExecutor.java:480)
        at com.dremio.sabot.exec.fragment.FragmentExecutor.access$1700(FragmentExecutor.java:109)
        at com.dremio.sabot.exec.fragment.FragmentExecutor$AsyncTaskImpl.run(FragmentExecutor.java:1016)
        at com.dremio.sabot.task.AsyncTaskWrapper.run(AsyncTaskWrapper.java:122)
        at com.dremio.sabot.task.slicing.SlicingThread.mainExecutionLoop(SlicingThread.java:249)
        at com.dremio.sabot.task.slicing.SlicingThread.run(SlicingThread.java:171)
 
ts=2023-12-26 06:57:01;thread_name=e6 - 1a7586c2-583b-6a25-56f0-01038d824a00:frag:0:0;id=c7;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
    @com.mysql.cj.jdbc.result.ResultSetImpl.getDate()
        at org.apache.commons.dbcp2.DelegatingResultSet.getDate(DelegatingResultSet.java:682)
        at org.apache.commons.dbcp2.DelegatingResultSet.getDate(DelegatingResultSet.java:682)
        at com.dremio.exec.store.jdbc.JdbcRecordReader$DateCopier.copy(JdbcRecordReader.java:688)
        at com.dremio.exec.store.jdbc.JdbcRecordReader.next(JdbcRecordReader.java:291)
        at com.dremio.exec.store.CoercionReader.next(CoercionReader.java:187)
        at com.dremio.sabot.op.scan.ScanOperator.outputData(ScanOperator.java:365)
        at com.dremio.sabot.driver.SmartOp$SmartProducer.outputData(SmartOp.java:551)
        at com.dremio.sabot.driver.StraightPipe.pump(StraightPipe.java:56)
        at com.dremio.sabot.driver.Pipeline.doPump(Pipeline.java:124)
        at com.dremio.sabot.driver.Pipeline.pumpOnce(Pipeline.java:114)
        at com.dremio.sabot.exec.fragment.FragmentExecutor$DoAsPumper.run(FragmentExecutor.java:565)
        at com.dremio.sabot.exec.fragment.FragmentExecutor.run(FragmentExecutor.java:480)
        at com.dremio.sabot.exec.fragment.FragmentExecutor.access$1700(FragmentExecutor.java:109)
        at com.dremio.sabot.exec.fragment.FragmentExecutor$AsyncTaskImpl.run(FragmentExecutor.java:1016)
        at com.dremio.sabot.task.AsyncTaskWrapper.run(AsyncTaskWrapper.java:122)
        at com.dremio.sabot.task.slicing.SlicingThread.mainExecutionLoop(SlicingThread.java:249)
        at com.dremio.sabot.task.slicing.SlicingThread.run(SlicingThread.java:171)
类的反编译
jad com.dremio.exec.store.jdbc.JdbcRecordReader$DateCopier
效果

ClassLoader:                                                                                                                    
+-sun.misc.Launcher$AppClassLoader@18b4aac2                                                                                     
  +-sun.misc.Launcher$ExtClassLoader@5614c340                                                                                   
 
Location:                                                                                                                       
/opt/dremio/jars/dremio-ce-jdbc-plugin-24.3.0-202312190021150029-52db2faf.jar                                                   
 
        /*
         * Decompiled with CFR.
         */
        package com.dremio.exec.store.jdbc;
 
        import com.dremio.exec.store.jdbc.JdbcRecordReader;
        import java.sql.Date;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.util.Calendar;
        import java.util.TimeZone;
        import org.apache.arrow.vector.DateMilliVector;
 
        private static class JdbcRecordReader.DateCopier
        extends JdbcRecordReader.Copier<DateMilliVector> {
            private final Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
 
            JdbcRecordReader.DateCopier(int columnIndex, ResultSet result, DateMilliVector vector) {
/*683*/         super(columnIndex, result, vector);
            }
 
            @Override
            void copy(int index) throws SQLException {
               // 会传递calendar
                Date date = this.getResult().getDate(this.getColumnIndex(), this.calendar);
/*689*/         if (date != null) {
/*690*/             ((DateMilliVector)this.getValueVector()).setSafe(index, date.getTime());
                }
            }
        }
hive getdate 包含calendar 的处理
HiveBaseResultSet 类
效果
public Date getDate(int columnIndex, Calendar cal) throws SQLException {
    logger.trace("{}, {}", this.traceInfo(), columnIndex);
    throw new SQLException("Method not supported");
}
ts=2023-12-26 06:18:17;thread_name=e3 - 1a758fd6-4c6d-9baa-6d8f-31fa8220ee00:frag:0:0;id=c4;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2

已经很明显了,核心是dremio传递了Calendar,但是hive 的getdate 不支持Calendar,所以对于类型肯定就会有问题了

解决方法

  • 修改dremio
    不建议,侵入太大,而且会有影响
  • 直接修改hive jdbc 驱动
    对于getDate 包含Calendar 的处理,使用public Date getDate(int columnIndex) 的实现,忽略Calendar

说明

对于构建,如果不想自己完整编译,可以通过反编译,替换class 文件的模式(如果有源码不推荐这么玩,对于缺少源码的场景可以使用此方法)
实际一个修改的代码,参考下边的github

参考资料

https://github.com/apache/hive/blob/master/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java#L360
https://github.com/rongfengliang/inceptor-sdk-transwarp-fix

标签:arp,dremio,jdbc,java,exec,sabot,FragmentExecutor,com
From: https://blog.51cto.com/rongfengliang/9082274

相关文章

  • dremio nessie数据源集成简单说明
    nessie是一个强大的支持类似git分之特性的apacheiceberg智能元数据存储,主要测试下基于nessiedremio元数据存储(catalog)集成参考架构环境准备docker-compose文件version:"3"services:minio:image:minio/minioports:-"9000:9000"-"19001:190......
  • dremio nessie 集成玩法
    昨天我简单写了dremio集成nessie的玩法,实际上dremio与nessie的集成可以分为两大类,一类是使用nessie做为catalog服务(当然也是支持写入iceberg的),一类是基于外部工具(spark,flink)使用nessie做为metadatastorage然后dremio查询参考玩法图外部工具类的catalog类的......
  • dremio nessie数据源集成简单说明
    nessie是一个强大的支持类似git分之特性的apacheiceberg智能元数据存储,主要测试下基于nessiedremio元数据存储(catalog)集成参考架构环境准备docker-compose文件version:"3"services:minio:image:minio/minioports:-"90......
  • JDBC快速入门:看我如何用JDBC数据库连接池,轻松解决大量并发请求问题!
    我们已经知道JDBC是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,也是大多数Java开发者与数据库打交道的必备工具。但是,你是否知道,JDBC在处理大量并发请求时,可能会遇到一些问题?这就是我们今天要讨论的主题——JDBC数据库连接池。<br>首先,让我们来了解一下什么是数据......
  • JDBC快速入门:看我如何用JDBC数据库连接池,轻松解决大量并发请求问题!
    我们已经知道JDBC是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,也是大多数Java开发者与数据库打交道的必备工具。但是,你是否知道,JDBC在处理大量并发请求时,可能会遇到一些问题?这就是我们今天要讨论的主题——JDBC数据库连接池。首先,让我们来了解一下什么是数据库连......
  • 在nodejs环境里使用canvas和sharp生成图片
    1.安装依赖包npminstalljsdomcanvas2.实例代码const{JSDOM}=require('jsdom');const{createCanvas}=require('canvas');//创建一个虚拟DOM环境constdom=newJSDOM('<!DOCTYPEhtml><html><head></head><body>&......
  • shardingSphere-JDBC 多数据源主从+切片配置
    4.x版本配置maven依赖<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency>application配置spri......
  • 【Spring教程31】SSM框架整合实战:从零开始学习SSM整合配置,如何编写Mybatis SpringMVC
    目录1流程分析2整合配置2.1步骤1:创建Maven的web项目2.2步骤2:添加依赖2.3步骤3:创建项目包结构2.4步骤4:创建SpringConfig配置类2.5步骤5:创建JdbcConfig配置类2.6步骤6:创建MybatisConfig配置类2.7步骤7:创建jdbc.properties2.8步骤8:创建SpringMVC配置类2.9步骤9:创......
  • SpringBoot 整合 ShardingSphere JDBC、MySQL分表实例
    1.概述ShardingSphere分为ShardingSphere-JDBC、ShardingSphere-Proxy、ShardingSphere-Sidecar(TODO)。ShardingSphere官方手册:传送门;这里使用的是ShardingSphere-JDBC,ShardingSphere-JDBC为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar......
  • Ping不通问题解决 windows 查看对端MAC地址 ARP -a
    Ping不通问题解决   Linux查看ARP信息指南(linux查看arp) ARP(地址解析协议)是TCP/IP协议提供的网络层协议,通过ARP可以查看网络层面上当前可连接的本地网络内每个主机的MAC地址。 ##查看系统的ARP信息 Linux系统中查看ARP信息的方法有很多,下面简单介绍几种常见的查......