【Hive】Hive开启远程连接及访问方法

您所在的位置:网站首页 hive远程模式配置 【Hive】Hive开启远程连接及访问方法

【Hive】Hive开启远程连接及访问方法

2024-07-13 07:26| 来源: 网络整理| 查看: 265

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。

对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论和学习的问题可联系我:[email protected]。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。 Hive开启远程连接及访问方法

本文关键字:Hive、远程连接、MetaStore、JDBC、SparkSQL

文章目录 Hive开启远程连接及访问方法一、Hive连接配置1. 默认初始配置2. 开启远程连接 二、界面化工具1. DBeaver2. DataGrip 三、IDEA插件1. Big Data Tools2. 内置DataGrip 三、HiveJDBC1. 所需依赖2. 案例代码 四、SparkSQL1. 所需依赖2. 嵌入模式连接3. 网络模式连接

一、Hive连接配置 1. 默认初始配置

一般我们会使用一些关系型数据库,如MySQL作为Hive的MetaStore位置。所以默认会在hive-site.xml中存在如下配置:

javax.jdo.option.ConnectionURL jdbc:mysql://localhost:3306/hive_metastore?createDatabaseIfNotExist=true;useSSL=false;serverTimezone=UTC Metadata store connection URL javax.jdo.option.ConnectionDriverName com.mysql.cj.jdbc.Driver Metadata store JDBC driver javax.jdo.option.ConnectionUserName root Metadata store username javax.jdo.option.ConnectionPassword root Metadata store password

用来配置Hive连接关系型数据库时的连接参数,此时我们已经可以通过hive命令直接进行访问了: 其它详细安装及初始化步骤可以参考:Hive 3.x的安装部署 - Ubuntu。

2. 开启远程连接

在进行开发时,我们通常需要能够在代码中访问Hive进行查询,此时我们要做一些配置和修改。第一种方式是直接开启一个hiveserver2的Hive服务端,用来提供执行 SQL 查询和获取结果的接口。第二种模式是直接开启一个Metastore服务,以网络模式/远程模式来为访问提供支持。两种模式都有各自的使用场景,在多节点的生产环境中多采用网络模式【有利于保证数据的一致性】,开发测试环境中多采用伪分布模式,因此嵌入模式通常足够。

嵌入模式

HiveServer2 可以接收来自各种客户端(如 Beeline、JDBC/ODBC 驱动、程序语言库等)的请求,然后在 Hive 中执行相应的操作。在这种情况下,Hive依然运行在嵌入模式下,我们只需要在后台开启一个hiveserver2服务,就可以满足Beeline、JDBC的远程访问。使用以下命令:

nohup hive --service hiveserver2 --hiveconf hive.server2.thrift.bind.host=0.0.0.0 --hiveconf hive.server2.thrift.port=10000 &

使用beeline访问:

beeline -u jdbc:hive2://ubuntu:10000

如果出现连接异常,尝试在Hadoop的core-site.xml添加以下配置【其中hadoop为启动Hadoop进程的用户名】并重启集群与hiveserver2:

hadoop.proxyuser.hadoop.hosts * hadoop.proxyuser.hadoop.groups * 网络模式

有很多界面化的工具或插件并不是基于JDBC封装的,因此有时需要手动开启网络模式。特别对于其它大数据集群框架,有时需要直接访问到Hive的Metastore,则也需要开启相关的配置。首先修改hive-site.xml,添加如下配置:

hive.metastore.uris thrift://ubuntu:9083

特别说明:添加该配置以后必须启动metastore后才能正常使用hive客户端连接。启动命令如下:

nohup hive --service metastore &

如果每次Hadoop集群发生重启或异常,也需要重新启动metastore和hiveserver2。

二、界面化工具

很多基于JDBC封装的软件,如DBeaver、DataGrip都可以使用这样的方式进行连接。只需要填写主机及端口,也可以通过SSH隧道连接,需要已经开启hiveserver2。

1. DBeaver

2. DataGrip

三、IDEA插件 1. Big Data Tools

这是一款IDEA中使用的比较多并且相对的稳定的大数据插件,整合了多种组件的支持,用起来十分的顺手,有了它基本不需要再切换到其它软件了,远程会话和文件传输也都是可以的。在这个组件中,新建一个Hive的连接使用的是thrift协议,也就代表我们要保证metastore服务的配置和启动。

2. 内置DataGrip

IDEA中有一款内置的数据源连接插件,也就是停靠在界面右侧的数据库图标,如果没有出现可以在视图 - 工具窗口中找到。界面和DataGrip是一样的,同样是基于hiveserver2,以JDBC的方式连接。

三、HiveJDBC 1. 所需依赖

在pom.xml中添加如下内容,具体版本可以根据需要修改:

org.apache.hive hive-jdbc 3.1.3 2. 案例代码

以下为使用Java连接Hive的基本步骤,因为JDBC是一个标准化的工作流程,所以只有URL和DRIVER需要修改:

import java.sql.*; public class JDBC { private static final String DRIVER_NAME = "org.apache.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { try { Class.forName(DRIVER_NAME); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 根据需要替换 Hive的 服务器地址,用户名和密码【如有】 String hiveUrl = "jdbc:hive2://ubuntu:10000/"; String user = ""; String password = ""; // 建立连接 Connection con = DriverManager.getConnection(hiveUrl, user, password); // 获得操作对象 Statement stmt = con.createStatement(); // 使用你自己的 Hive SQL 查询 String sql = "SELECT * FROM test.user_info"; System.out.println("Running: " + sql); ResultSet res = stmt.executeQuery(sql); // 简单遍历输出 while (res.next()) { System.out.println(res.getString(1) + "\t" + res.getString(2) + "\t" + res.getString(3)); } // 关闭资源 res.close(); stmt.close(); con.close(); } }

四、SparkSQL

我们经常会使用Spark去操作Hive中的表,这样做通常会比较高效。在建立连接时,如果Hive使用的是嵌入模式,我们必须告知元数据存储的连接信息,包括连接字符串,用户名,密码等等。如果Hive使用的是网络模式,我们可以直接访问已经配置的uri。

1. 所需依赖

在pom.xml中添加如下内容,具体版本可以根据需要修改:

org.apache.hive hive-metastore 2.3.9 org.apache.spark spark-core_2.12 3.3.2 org.apache.spark spark-sql_2.12 3.3.2 org.apache.spark spark-hive_2.12 3.3.2 com.mysql mysql-connector-j 8.0.33

特别注意:使用Java开发时,可能会存在版本兼容问题,这是因为Spark 3.x并没有完全兼容Hive 3.x,因此指定依赖版本时需要使用2.x。但是如果使用SBT构建Scala项目,则不存在这个问题。

2. 嵌入模式连接

如果Hive没有运行单独的Metastore服务,则此时需要保证Spark能够直接访问到存储元数据的关系型数据库,需要添加如下四个配置:

javax.jdo.option.ConnectionURLjavax.jdo.option.ConnectionDriverNamejavax.jdo.option.ConnectionUserNamejavax.jdo.option.ConnectionPassword

也可以直接将hive-site.xml放置在resources文件夹,可以自动读取其中的配置。

import org.apache.spark.sql.*; public class Hive { public static void main(String[] args) { SparkSession spark = SparkSession .builder() .appName("Spark Hive Example") .master("local[*]") .config("javax.jdo.option.ConnectionURL", "jdbc:mysql://ubuntu:3306/hive_metastore?" + "createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC") .config("javax.jdo.option.ConnectionDriverName", "com.mysql.cj.jdbc.Driver") .config("javax.jdo.option.ConnectionUserName", "root") .config("javax.jdo.option.ConnectionPassword", "root") .enableHiveSupport() .getOrCreate(); // 使用 Spark SQL 查询 Hive 表 String sql = "SELECT * FROM test.user_info"; Dataset result = spark.sql(sql); // 打印结果 result.show(); // 运行结束 spark.stop(); } }

以上代码为使用本地模式运行Spark,用于快速测试,不需要搭建Spark环境。

附:Ubuntu - MySQL 8.x开启远程连接步骤

修改配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf:

bind-address = 0.0.0.0

登录mysql执行以下sql语句:

CREATE USER 'root'@'%' IDENTIFIED BY 'root'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; 3. 网络模式连接

如果Hive开启了Metastore服务,则可以直接通过该端口进行连接,连接时只要保证端口可以访问即可。代码如下:

import org.apache.spark.sql.*; public class Hive { public static void main(String[] args) { SparkSession spark = SparkSession .builder() .appName("Spark Hive Example") .master("local[*]") .config("hive.metastore.uris", "thrift://ubuntu:9083") .enableHiveSupport() .getOrCreate(); // 使用 Spark SQL 查询 Hive 表 String sql = "SELECT * FROM test.user_info"; Dataset result = spark.sql(sql); // 打印结果 result.show(); // 运行结束 spark.stop(); } }

扫描下方二维码,加入CSDN官方粉丝微信群,可以与我直接交流,还有更多福利哦~ 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3