本文为您介绍在E-MapReduce集群提交Hive SQL的三种方式。
前提条件
已创建集群,且选择了Hive服务,详情请参见创建集群。
注意事项
方式一:通过Hive客户端连接Hive
普通集群
hive
高安全集群
执行如下命令进行认证。
执行如下命令进行认证。
kinit 用户名
根据提示输入用户的密码。
连接Hive。
kinit -kt /etc/ecm/hive-conf/hive.keytab hive/<主节点的节点名称>.cluster-xxx@EMR.xxx.COM
您也可以通过用户管理功能创建用户,在连接Beeline前使用kinit 用户名
并输入密码,即可通过新建用户使用Beeline客户端。创建用户详情请参见管理用户。
hive
方式二:通过Beeline客户端连接HiveServer2
普通集群
beeline -u jdbc:hive2://<主节点的节点名称>:10000
根据您的集群类型,对应命令如下:
DataLake集群
beeline -u jdbc:hive2://master-1-1:10000
Hadoop集群
beeline -u jdbc:hive2://emr-header-1:10000
高可用集群
根据您集群的类型,对应命令如下:
DataLake集群
设置serviceDiscoveryMode为zooKeeper的方式
beeline -u 'jdbc:hive2://master-1-1:2181,master-1-2:2181,master-1-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'
设置serviceDiscoveryMode为multiServers的方式
beeline -u 'jdbc:hive2://master-1-1:10000,master-1-2:10000,master-1-3:10000/default;serviceDiscoveryMode=multiServers'
Hadoop集群
设置serviceDiscoveryMode为zooKeeper的方式
beeline -u 'jdbc:hive2://emr-header-1:2181,emr-header-2:2181,emr-header-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'
设置serviceDiscoveryMode为multiServers的方式
beeline -u 'jdbc:hive2://emr-header-1:10000,emr-header-2:10000,emr-header-3:10000/default;serviceDiscoveryMode=multiServers'
高安全集群
执行如下命令进行认证。
kinit -kt /etc/ecm/hive-conf/hive.keytab hive/<主节点的节点名称>.cluster-xxx@EMR.xxx.COM
您也可以通过用户管理功能创建用户,在连接Beeline前使用
kinit 用户名
并输入密码,即可通过新建用户使用Beeline客户端。创建用户详情请参见管理用户。执行如下命令进行认证。
kinit 用户名
根据提示输入用户的密码。
连接Beeline。
beeline -u "jdbc:hive2://<主节点的节点名称>:10000/;principal=hive/<主节点的节点名称>.cluster-xxx@EMR.xxx.COM"
说明jdbc
链接串需要用双引号括起来。
方式三:通过Java连接HiveServer2
在执行本操作前,确保您已安装Java环境和Java编程工具,并且已配置环境变量。
在pom.xml文件中配置项目依赖(hadoop-common和hive-jdbc)。本示例新增的项目依赖如下所示。
<dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>2.3.9</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.8.5</version> </dependency> </dependencies>
编写代码,连接HiveServer2并操作Hive表数据。示例代码如下所示。
import java.sql.*; public class App { private static String driverName = "org.apache.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 1. 代码打包后,运行JAR包的环境需要在hosts文件中把master-1-1 // 映射到E-MapReduce集群的公网IP地址(或内网IP地址) // 2. 更多JDBC连接串路径可以参考“方式二:通过Beeline客户端连接HiveServer2” Connection con = DriverManager.getConnection( "jdbc:hive2://master-1-1:10000", "root", ""); Statement stmt = con.createStatement(); String sql = "select * from sample_tbl limit 10"; ResultSet res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1) + "\t" + res.getString(2)); } } }
打包项目工程(即生成JAR包),并上传JAR包至运行环境。
重要JAR包的运行需要依赖hadoop-common和hive-jdbc。如果运行环境的环境变量中未包含这两个依赖包,则您需要下载依赖包并配置环境变量,或者直接一起打包这两个依赖包。运行JAR包时,如果缺少这两个依赖包,则会提示以下错误:
缺失hadoop-common:提示
java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
。缺失hive-jdbc:提示
java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver
。
本示例生成的JAR包为emr-hiveserver2-1.0.jar,上传到E-MapReduce集群的Master节点。
测试JAR包是否可以正常运行。
重要运行JAR包的服务器与E-MapReduce集群需要在同一个VPC和安全组下,并且网络可达。如果两者的VPC不同或网络环境不同,则需要通过公网地址访问,或先使用网络产品打通两者的网络,再通过内网访问。网络连通性测试方法:
公网:
telnet master-1-1的公网IP地址 10000
内网:
telnet master-1-1的内网IP地址 10000
java -jar emr-hiveserver2-1.0.jar