Impala 配置JDBC


Impala支持标准的JDBC接口,允许从商业商业智能工具和用Java或其他编程语言编写的自定义软件进行访问。JDBC驱动程序允许您从您编写的Java程序或使用JDBC与各种数据库产品通信的商业智能或类似工具访问Impala。

设置到Impala的JDBC连接包括以下步骤:

  • 验证集群中Impala守护程序正在侦听传入JDBC请求的通信端口。
  • 在每个运行启用JDBC的应用程序的系统上安装JDBC驱动程序。
  • 为JDBC应用程序指定连接字符串以访问运行impala守护程序的服务器之一,并具有适当的安全设置。

配置JDBC端口

以下是Impala服务器接受JDBC连接的默认端口:

协议

默认端口

用于指定备用端口的标志

HTTP

28000

‑‑hs2_http_port

二进制TCP

21050

‑‑hs2_port

确保您使用的协议的端口可用于与客户端进行通信,例如,它没有被防火墙软件阻止。

如果您的JDBC客户端软件连接到不同的端口,请在启动impalad.

选择JDBC驱动程序

在Impala2.0及更高版本中,您可以使用Hive0.13或更高版本的JDBC驱动程序。如果您已经在使用早期Impala版本的JDBC应用程序,您应该更新您的JDBC驱动程序,因为以前是唯一选择的Hive0.12驱动程序与Impala2.0和更高版本不兼容。

HiveJDBC驱动程序为带有Impala2.0及更高版本的JDBC应用程序提供了显着的速度提升,用于返回大型结果集的查询。

在客户端系统上启用ImpalaJDBC支持

使用HiveJDBC驱动程序

您可以hive-jdbc通过Linux包管理器在集群内的主机上安装HiveJDBC驱动程序(包)。驱动程序由几个JAR文件组成。Impala和Hive可以使用相同的驱动程序。

要获取JAR文件,请在集群中将运行JDBC应用程序的每个主机上安装HiveJDBC驱动程序。

注意:对应于Hive0.13的最新JDBC驱动程序为返回大型结果集的Impala查询提供了实质性的性能改进。Impala2.0及更高版本与Hive0.13驱动程序兼容。如果您已经安装了较旧的JDBC驱动程序,并且正在运行Impala2.0或更高版本,请考虑升级到最新的HiveJDBC驱动程序以获得JDBC应用程序的最佳性能。

如果您在集群外的主机上使用支持JDBC的应用程序,则不能在主机上使用相同的安装过程。使用上述过程在至少一台集群主机上安装JDBC驱动程序。然后将JAR文件下载到每台将使用JDBC和Impala的客户端机器:

commons-logging-X.X.X.jar
  hadoop-common.jar
  hive-common-X.XX.X.jar
  hive-jdbc-X.XX.X.jar
  hive-metastore-X.XX.X.jar
  hive-service-X.XX.X.jar
  httpclient-X.X.X.jar
  httpcore-X.X.X.jar
  libfb303-X.X.X.jar
  libthrift-X.X.X.jar
  log4j-X.X.XX.jar
  slf4j-api-X.X.X.jar
  slf4j-logXjXX-X.X.X.jar

要在运行JDBC应用程序的系统上为Impala启用JDBC支持:

将上面列出的JAR文件下载到每台客户端计算机。

  1. 将JAR文件存储在您选择的位置,最好是您的CLASSPATH设置中已经引用的目录。例如:
    1. 在Linux上,您可能会使用诸如/opt/jars/.
    2. 在Windows上,您可以使用C:\ProgramFiles下的子目录。
  2. 要成功加载ImpalaJDBC驱动程序,客户端程序必须能够找到关联的JAR文件。这通常意味着设置CLASSPATH客户端进程以包含JAR。有关如何安装新JDBC驱动程序的更多详细信息,请参阅JDBC客户端的文档,但有关如何设置CLASSPATH变量的一些示例包括:

在Linux上,如果您将JAR解压缩到/opt/jars/,您可以发出以下命令将JAR文件路径添加到现有类路径:

export CLASSPATH=/opt/jars/*.jar:$CLASSPATH

在Windows上,使用系统属性控制面板项来修改系统的环境变量。修改环境变量以包含您提取文件的路径。

    1. 注意:如果CLASSPATH您的客户端机器上的现有引用了一些旧版本的HiveJAR,请确保新JAR是列出的第一个。要么将新的JAR文件放在清单的前面,要么删除对HiveJAR文件的其他引用。

建立JDBC连接

JDBC驱动程序类取决于您选择的驱动程序。

注意:如果您的JDBC或ODBC应用程序通过负载均衡器(例如)连接到Impalahaproxy,请谨慎重用连接。如果负载均衡器已设置连接超时值,请经常检查连接,使其空闲时间永远不会超过负载均衡器超时值,或者在使用之前检查连接有效性,如果连接已关闭,则创建一个新连接。

使用HiveJDBC驱动程序

例如,对于HiveJDBC驱动程序,类名是org.apache.hive.jdbc.HiveDriver.一旦您将Impala配置为使用JDBC,您就可以在两者之间建立连接。要对不使用Kerberos身份验证的集群执行此操作,请使用形式为的连接字符串。例如,您可以使用:jdbc:hive2://host:port/;auth=noSasl

jdbc:hive2://myhost.example.com:21050/;principal=impala/myhost.example.com@H2.EXAMPLE.COM

要连接到需要Kerberos身份验证的Impala实例,请使用格式为的连接字符串。主体必须与您在启动Impala时使用的用户主体相同。例如,您可以使用:jdbc:hive2://host:port/;principal=principal_name

jdbc:hive2://myhost.example.com:21050/;principal=impala/myhost.example.com@H2.EXAMPLE.COM

要连接到需要LDAP身份验证的Impala实例,请使用格式为的连接字符串。例如,您可以使用:jdbc:hive2://host:port/db_name;user=ldap_userid;password=ldap_password

jdbc:hive2://myhost.example.com:21050/test_db;user=fred;password=xyz123

要通过HTTP连接到Impala实例,请transportMode=http在连接字符串中指定HTTP端口(默认为28000)。例如:

jdbc:hive2://myhost.example.com:28000/;transportMode=http

笔记:在Impala2.5之前,HiveJDBC驱动程序不支持同时使用Kerberos身份验证和SSL加密的连接。如果您的集群运行具有此限制的旧版本,请使用支持这两种安全功能的备用JDBC驱动程序。

关于JDBC和ODBC与Impala SQL功能交互的说明

大多数Impala SQL功能通过JDBC或ODBCAPI的impala-shell解释器等效地工作。以下是使用API在交互式shell和应用程序之间切换时要记住的一些例外情况:

  • 复杂类型注意事项:
    • 涉及复杂类型(ARRAYSTRUCTMAP)的查询需要的符号可能并非在所有级别的JDBC和ODBC驱动程序中都可用。如果由于驱动程序级别或无法编辑应用程序使用的查询而在查询此类表时遇到问题,您可以创建一个视图来公开复杂列的“扁平化”版本并将应用程序指向该视图。

JDBCAPI支持Impala2.3及更高版本中可用的复杂类型getColumns()。双方MAPARRAY报告为JDBCSQL类型ARRAY,因为这是最匹配的JavaSQL类型。此行为与Hive一致。STRUCT类型报告为JDBCSQL类型STRUCT

为了与Hive的行为保持一致,TYPE_NAME字段填充了标量类型的原始类型名称,以及toSql()复杂类型的完整类型。生成的类型名称有些不一致,因为嵌套类型的打印方式与顶级类型不同。例如,以下列表显示了如何toSQL()将Impala类型转换为TYPE_NAME值:

DECIMAL(10,10)         becomes  DECIMAL
CHAR(10)               becomes  CHAR
VARCHAR(10)            becomes  VARCHAR
ARRAY<DECIMAL(10,10)>  becomes  ARRAY<DECIMAL(10,10)>
ARRAY<CHAR(10)>        becomes  ARRAY<CHAR(10)>
ARRAY<VARCHAR(10)>     becomes  ARRAY<VARCHAR(10)>

DML语句的Kudu注意事项

目前,针对Kudu表通过JDBC接口发出的ImpalaINSERTUPDATE或其他DML语句不会针对重复的主键列等条件返回JDBC错误代码。因此,对于发出大量DML语句的应用程序,更喜欢直接使用KuduJavaAPI而不是JDBC应用程序。