apache-hive / 3.1.1 / reference / HiveODBC.html

Hive ODBC 驱动程序

Note

这些说明适用于 Hive HiveServer1中可用的 Hive ODBC 驱动程序。
作为 Apache Hive 的一部分,没有用于HiveServer2的 ODBC 驱动程序。有不同供应商提供的第三方 ODBC 驱动程序,其中大多数似乎是免费的。

HiveServer 已从 Hive 1.0.0 开始从 Hive 发行版中删除.参见HIVE-6977.请切换到 HiveServer2.

Introduction

Hive ODBC 驱动程序是一个软件库,为 Hive 数据库 Management 系统实现了开放数据库连接(ODBC)API 标准,从而使符合 ODBC 的应用程序可以通过标准接口与 Hive 无缝(理想地)交互。此驱动程序将不会作为典型的 Hive 生成过程的一部分进行构建,而是需要根据以下说明分别进行编译和构建。

Suggested Reading

本指南假定您已经熟悉以下内容:

Software Requirements

成功编译和操作 Hive ODBC 驱动程序需要以下软件组件:

  • Hive 服务器 –Client 端可以通过该服务远程发出 Hive 命令和请求的服务。 Hive ODBC 驱动程序取决于 Hive Server 来执行数据库交互的核心集。 Hive 服务器是在 Hive 构建过程中构建的。有关 Hive Server 使用情况的更多信息,请参见here

  • Apache Thrift –一种可扩展的跨语言软件框架,使 Hive ODBC 驱动程序(特别是 HiveClient 端)能够与 Hive Server 通信。有关Thrift Installation的详细信息,请参见此链接。 Hive ODBC 驱动程序是使用 Thrift 主干版本 r790732 开发的,但最新版本也应该不错。确保在 Thrift 构建过程中记下 Thrift 安装路径,因为在 HiveClient 端构建过程中将需要此信息。 Thrift 安装路径将称为 THRIFT_HOME。

Driver Architecture

在内部,Hive ODBC 驱动程序包含两个单独的组件:HiveClient 端和 unixODBC API 包装器。

  • HiveClient 端 –提供一组与 C 兼容的库函数,以类似于 ODBC 规范规定的模式与 Hive Server 进行交互。但是,HiveClient 端被设计为独立于 unixODBC 或任何 ODBC 特定的 Headers,从而使其可以在 ODBC 之外的许多通用情况下使用。

  • unixODBC API 包装器 –在 HiveClient 端之上提供一层直接实现 ODBC API 标准的层。 unixODBC API 包装器将被编译到共享库中,这将是 Hive ODBC 驱动程序的最终形式。包装文件将保留在关联 JIRA 上的文件附件,直到可以将其检入 unixODBC 代码存储库:HIVE-187HIVE-1101为止。

构建和设置 ODBC 组件

注意:必须先构建和安装 HiveClient 端,然后才能成功编译 unixODBC API 包装器。

HiveClient 端构建/设置

为了构建和安装 HiveClient 端:

  • 从 Subversion 或 Git 源代码存储库中签出并设置最新版本的 Apache Hive。有关更多详细信息,请参见Hive 入门。从这一点开始,到 Hive 根目录的路径将被称为 HIVE_SRC_ROOT。

Using a tarball source release

如果要根据 tarball 发行包中包含的源代码进行编译,则 HIVE_SRC_ROOT 引用“ src”子目录。

The ODBC driver is broken on trunk!

当前,ODBC 驱动程序依赖的 C ThriftClient 端库无法在中继上构建。 HIVE-4433中正在跟踪此问题。如果您在 0.12 发行版之前使用中继,请在 continue 之前检查此票证的状态。另请参见HIVE-4492

  • 通过从 HIVE_SRC_ROOT 运行以下命令来构建 HiveClient 端。这将编译并将库和头文件复制到HIVE_SRC_ROOT/build/odbc/。请记住,应完全指定所有路径(无相对路径)。如果遇到“ undefined reference to vtables”错误,请确保已为 thrift.home 指定了绝对路径。
$ ant compile-cpp -Dthrift.home=<THRIFT_HOME>

MVN:

$ cd odbc
$ mvn compile -Podbc,hadoop-1 -Dthrift.home=/usr/local -Dboost.home=/usr/local

您可以通过指定其他参数(假设您具有正确的编译库)来强制 HiveClient 端编译为非本机位体系结构:

$ ant compile-cpp -Dthrift.home=<THRIFT_HOME> -Dword.size=<32 or 64>
  • 您可以通过从 HIVE_SRC_ROOT 运行 Hive 测试套件来验证整个 Hive 编译。指定参数'-Dthrift.home =<THRIFT_HOME>'将启用 HiveClient 端的测试。如果您未指定 thrift.home,则 HiveClient 端测试将不会运行,只会成功返回。
$ ant test -Dthrift.home=<THRIFT_HOME>

MVN:

$ cd odbc
$ mvn test -Podbc,hadoop-1 -Dthrift.home=/usr/local -Dboost.home=/usr/local

您可以通过从HIVE_SRC_ROOT/odbc/运行上述命令来专门执行 HiveClient 端测试。注意:HiveClient 端测试要求本地 Hive 服务器在端口 10000 上运行。

  • 要将 HiveClient 端库安装到您的计算机上,请从HIVE_SRC_ROOT/odbc/运行以下命令。注意:安装路径默认为/usr/local。尽管目前没有从 ant 构建过程中更改此默认目录的方法,但是可以通过跳过以下命令并将HIVE_SRC_ROOT/build/odbc/libHIVE_SRC_ROOT/build/odbc/include的内容复制到其本地文件系统副本中来执行手动安装。
$ sudo ant install -Dthrift.home=<THRIFT_HOME>

注意:编译后的静态库 libhiveclient.a 需要与 stdc 和 thrift 库链接才能正常运行。
注意:当前,无法为 unixODBC 构建过程指定非系统库和头文件目录。因此,必须将 HiveClient 端库和 Headers 安装到默认系统位置,以使 unixODBC 构建过程能够检测到这些文件。将来可能会解决此问题。

unixODBC API 包装器构建/设置

构建并安装 HiveClient 端后,现在可以安装 unixODBC API 包装器:

  • 在 unixODBC 根目录中,运行以下命令:
$ ./configure --enable-gui=no --prefix=<unixODBC_INSTALL_DIR>

如果遇到以下错误:“ redefinition of 'struct _hist_entry'”或“ previous declaration of 'add_history' was here”,请使用以下命令重新执行配置:

$ ./configure --enable-gui=no --enable-readline=no --prefix=<unixODBC_INSTALL_DIR>

要强制将 unixODBC API 包装器编译为非本机位体系结构,请修改 CC 和 CXX 环境变量以包含适当的标志。例如:

$ CC="gcc -m32" CXX="g++ -m32" ./configure --enable-gui=no --enable-readline=no --prefix=<unixODBC_INSTALL_DIR>
  • 使用以下命令编译 unixODBC API 包装器:
$ make

如果要完全安装 unixODBC 和所有相关的驱动程序,请从 unixODBC 根目录运行以下命令:

$ sudo make install

如果在安装后系统在 unixODBC 测试期间(例如isqlodbcinst)抱怨undefined symbols,请尝试运行ldconfig来更新动态链接程序的运行时库。
如果只想获取 Hive ODBC 驱动程序共享对象库:

  • 编译后,驱动程序将位于<unixODBC_BUILD_DIR>/Drivers/hive/.libs/libodbchive.so.1.0.0
    可以根据需要将其复制到任何其他位置。请记住,Hive ODBC 驱动程序依赖于 HiveClient 端共享对象库:libhiveclient.solibthrift.so.0
    您可以通过执行以下操作来手动安装 unixODBC API 包装器:
$ cp <unixODBC_BUILD_DIR>/Drivers/hive/.libs/libodbchive.so.1.0.0 <SYSTEM_INSTALL_DIR>
  $ cd <SYSTEM_INSTALL_DIR>
  $ ln -s libodbchive.so.1.0.0 libodbchive.so
  $ ldconfig

将驱动程序连接到驱动程序 Management 器

本部分假定您已经在当前计算机上构建并安装了 HiveClient 端和 unixODBC API 包装共享库。要将 Hive ODBC 驱动程序连接到先前安装的驱动程序 Management 器(例如 unixODBC 或单独的应用程序提供的驱动程序 Management 器):

  • 找到与驱动程序 Management 器(DM)关联的 odbc.ini 文件。

  • 如果要在系统 DM 上安装驱动程序,则可以运行以下命令以打印 DM 配置文件的位置。

$ odbcinst -j
  unixODBC 2.2.14
  DRIVERS............: /usr/local/etc/odbcinst.ini
  SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
  FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
  USER DATA SOURCES..: /home/ehwang/.odbc.ini
  SQLULEN Size.......: 8
  SQLLEN Size........: 8
  SQLSETPOSIROW Size.: 8
  • 如果要在应用程序 DM 上安装驱动程序,那么您必须在这一方面有所帮助

(wink)

。提示:尝试在您的应用程序的安装目录中查找。

  • 请记住,应用程序的 DM 可以与系统 DM 同时存在,并且可能会使用其自己的配置文件,例如 odbc.ini。

  • 另外,请注意,某些应用程序没有自己的 DM,而仅使用系统 DM。

  • 将以下部分添加到 DM 的相应 odbc.ini 中:

[Hive]
 Driver = <path_to_libodbchive.so>
 Description = Hive Driver v1
 DATABASE = default
 HOST = <Hive_server_address>
 PORT = <Hive_server_port>
 FRAMED = 0

使用 ISQL 进行测试

一旦安装了必要的 Hive ODBC 库并在系统的默认 odbc.ini 中添加了 Hive 条目,便可以使用 isql 交互地测试驱动程序:

$ isql -v Hive

如果您的系统没有 isql,则可以通过安装整个 unixODBC 获得它。如果遇到错误消息说 isql 无法打开共享库,请使用ldd工具确保解决了所有动态库依赖关系,并使用file工具确保将 isql 和所有必要的库编译到相同的体系结构中(32 或 64 位)。

为 3rd Party Driver Manager 构建 libodbchive.so

如果要为其他驱动程序 Management 器构建 libodbchive.so(例如,MicroStrategy 使用包含其自己的驱动程序 Management 器的 DataDirect ODBC 库),则需要针对该驱动程序 Management 器(libodbc.so 和 libodbcinst.so)配置和构建 libodbchive.so。 )。

如果安装了第三方驱动程序 Management 器,最简单的方法是找到包含 libodbc.so 和 libodbcinst.so 的安装目录,并将该目录设置为 LD_LIBRARY_PATH。然后,您需要为 Hive ODBC 驱动程序运行 configure 和 make。获取 libodbchive.so 之后,请确保第 3 方应用程序可以访问动态库 libodbchive.so,libthrift.so 和 libhiveclient.so(通过 LD_LIBRARY_PATH 或 ldconfig)。

如果为第三方驱动程序 Management 器构建 libodbchive.so,则 isql 可能无法与同一组.so 文件一起使用。因此,您可能需要为每个驱动程序 Management 器编译一个不同的 libodbchive.so。

Troubleshooting

  • HiveClient 端构建过程

  • “ libthrift.a:无法读取符号:错误值”或“在创建共享库时无法使用针对“本地符号”的重定位 R_X86_64_32”?

  • 尝试使用-fPIC 选项为 C 编译器重新编译 Apache Thrift 库

    • “对 vtable 的未定义引用”?
  • 确保从正确的 Thrift 目录中包含了 Apache Thrift 库,并且与 HiveClient 端具有相同的体系结构(32 或 64 位)。

    • 另外,请检查以确保为 thrift.home 参数提供了完全限定的路径。

    • 通常,lddfilenm是用于调试共享对象库问题的基本 UNIX 工具。如果您不知道它们是什么,请使用man获取更多详细信息。

Current Status

  • Comments:请记住,这仍然是初始版本,并且仍然非常粗糙。但是,它为连接,执行查询,提取等提供了基本的 ODBC 3.51 API 支持。此驱动程序已在具有 iSQL 的 32 位和 64 位 linux 计算机上成功进行了测试。它也已经在 MicroStrategy 等企业应用程序上获得了部分成功的测试。由于许可原因,unixODBC API 包装器文件将作为单独的 JIRA 附件上载,该附件不属于此代码存储库。

  • Limitations:

  • 仅支持 Linuxos

    • 不支持 Unicode

    • 不支持异步执行查询

    • 不支持 SQLColumns 和 SQLTables 等函数的模式匹配;需要完全匹配。

    • Hive Server 当前不是线程安全的(请参阅 JIRA HIVE-80:https://issues.apache.org/jira/browse/HIVE-80)。这将阻止驱动程序安全地构建到同一 Hive 服务器的多个连接。我们需要解决此问题,以使驱动程序正常运行。

    • Hive Server 的 getSchema()函数似乎对某些类型的查询(例如“ SELECT * ...”或“ EXPLAIN”)有问题,因此 Hive ODBC 驱动程序有时也难以处理这些查询。

  • ODBC API 函数支持(有人知道如何从函数名称中删除链接吗?):

SQLAllocConnect supported
SQLAllocEnv supported
SQLAllocHandle supported
SQLAllocStmt supported
SQLBindCol supported
SQLBindParameter NOT supported
SQLCancel NOT supported
SQLColAttribute supported
SQLColumns supported
SQLConnect supported
SQLDescribeCol supported
SQLDescribeParam NOT supported
SQLDisconnect supported
SQLDriverConnect supported
SQLError supported
SQLExecDirect supported
SQLExecute supported
SQLExtendedFetch NOT supported
SQLFetch supported
SQLFetchScroll NOT supported
SQLFreeConnect supported
SQLFreeEnv supported
SQLFreeHandle supported
SQLFreeStmt supported
SQLGetConnectAttr NOT supported
SQLGetData 支持(但是,SQLSTATE 不返回值)
SQLGetDiagField NOT supported
SQLGetDiagRec supported
SQLGetInfo 部分支持; (以运行 MSTR v9)
SQLMoreResults NOT supported
SQLNumParams NOT supported
SQLNumResultCols supported
SQLParamOptions NOT supported
SQLPrepare 支持的;但不允许使用参数标记
SQLRowCount NOT supported
SQLSetConnectAttr NOT supported
SQLSetConnectOption NOT supported
SQLSetEnvAttr Limited support
SQLSetStmtAttr NOT supported
SQLSetStmtOption NOT supported
SQLTables supported
SQLTransact NOT supported