第12章 Hive:进阶

12.3 HiveServer2


12.3.1 HiveServer1

HiveServer是一种可选服务,允许远程客户端可以使用各种编程语言向Hive提交请求并检索结果。HiveServer是建立在Apache ThriftTM(http://thrift.apache.org/) 之上的,因此有时会被称为Thrift Server,这可能会导致混乱,因为新服务HiveServer2也是建立在Thrift之上的.自从引入HiveServer2后,HiveServer也被称为HiveServer1。

HiveServer无法处理来自多个客户端的并发请求.这实际上是HiveServer导出的Thrift接口所施加的限制,也不能通过修改HiveServer源代码来解决。HiveServer2对HiveServer进行了重写,来解决这些问题,从Hive 0.11.0版本开始。建议使用HiveServer2。

12.3.2 HiveServer2

HiveServer2是一种能使客户端执行Hive查询的服务。 HiveServer2是HiveServer1的改进版,HiveServer1已经被废弃。从Hive 2.0版本开始,为HiveServer2提供了一个简单的WEBUI界面,界面中可以直观的看到当前链接的会话、历史日志、配置参数以及度量信息, 所以配置一个HiveServer2的UI端口 
默认值: 
hive.server2.thrift.port:10000 
hive.server2.webui.port:10002

开启hiveserver2服务

[root@node3 ~]# hive --service hiveserver2  >/dev/null 2>/dev/null &
[4] 3889
[root@node3 ~]#

其中,输出的3889是hiveserver2的pid,需要关闭hiveserver2服务时可以通过该pid进行kill。

[root@node3 ~]# jps
2723 QuorumPeerMain
3889 RunJar
2873 JournalNode
2779 DataNode
2973 NodeManager
4093 Jps
[root@node3 ~]# jps -ml
2723 org.apache.zookeeper.server.quorum.QuorumPeerMain /opt/zookeeper-3.4.10/bin/../conf/zoo.cfg
3889 org.apache.hadoop.util.RunJar /opt/hive-2.1.1/lib/hive-service-2.1.1.jar org.apache.hive.service.server.HiveServer2
4103 sun.tools.jps.Jps -ml
2873 org.apache.hadoop.hdfs.qjournal.server.JournalNode
2779 org.apache.hadoop.hdfs.server.datanode.DataNode
2973 org.apache.hadoop.yarn.server.nodemanager.NodeManager
[root@node3 ~]#

通过命令netstat -pan查看所有的进程和端口使用情况,其中最后一栏是PID/Program name

[root@node3 ~]# netstat -pan | grep 10000
tcp        0      0 0.0.0.0:10000           0.0.0.0:*               LISTEN      3889/java
[root@node3 ~]#

发现端口号10000被PID是3889的Java进程占用。

http://192.168.80.133:10002/hiveserver2.jsp

Beeline工作模式有两种,即本地嵌入模式和远程模式。嵌入模式情况下,它返回一个嵌入式的Hive(类似于Hive CLI)。 
而远程模式则是通过Thrift协议与某个单独的HiveServer2进程进行连接通信。

12.3.3 JDBC连接Hive

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.hadron</groupId><artifactId>hive</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>hive</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc --><dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>1.2.1</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.1</version></dependency><dependency><groupId>jdk.tools</groupId><artifactId>jdk.tools</artifactId><version>1.8</version><scope>system</scope><systemPath>${JAVA_HOME}/lib/tools.jar</systemPath></dependency></dependencies>
</project>
package cn.hadron.hive.dao;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class HiveDao {// hive的jdbc驱动类private static String dirverName = "org.apache.hive.jdbc.HiveDriver";// 连接hive的URL hive1.2.1版本需要的是jdbc:hive2,而不是 jdbc:hiveprivate static String url = "jdbc:hive2://192.168.1.160:10000/default";// 登录linux的用户名 一般会给权限大一点的用户,否则无法进行事务形操作private static String user = "root";// 登录linux的密码private static String password = "123456";private Connection connection;private PreparedStatement ps;private Statement st;private ResultSet rs;public void getConnection() {try {Class.forName("org.apache.hive.jdbc.HiveDriver");connection = DriverManager.getConnection("jdbc:hive2://192.168.18.130:10000/", user, password);System.out.println(connection);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}public void getConnection(String ip) {try {Class.forName("org.apache.hive.jdbc.HiveDriver");connection = DriverManager.getConnection("jdbc:hive2://" + ip + ":10000/", user, password);System.out.println(connection);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}public void getConnection(String ip, String db) {try {StringBuilder sb = new StringBuilder();sb.append("jdbc:hive2://").append(ip).append(":10000/").append(db);Class.forName("org.apache.hive.jdbc.HiveDriver");connection = DriverManager.getConnection(sb.toString(), user, password);System.out.println(connection);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}public void createDatabase(String dbName) {try {String sql = "create database if not exists " + dbName;ps = connection.prepareStatement(sql);// true if the first result is a ResultSet object;// false if the first result is an update count or there is no resultps.execute();} catch (SQLException e) {e.printStackTrace();}}public void createTable(String sql) {try {ps = connection.prepareStatement(sql);ps.execute();} catch (SQLException e) {e.printStackTrace();}}public void dropTable(String tableName) {String sql = "drop table if exists " + tableName;try {st = connection.createStatement();st.execute(sql);} catch (SQLException e) {e.printStackTrace();}}// 添加数据public boolean load(String loadData) {try {ps = connection.prepareStatement(loadData);return ps.execute();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;}}public ResultSet query(String sql) {try {ps = connection.prepareStatement(sql);return ps.executeQuery();} catch (SQLException e) {e.printStackTrace();return null;}}  public void descTables(String tableName){  String sql = "desc " + tableName;    try {st = connection.createStatement();rs=st.executeQuery(sql);while (rs.next()) {  System.out.println(rs.getString(1) + "\t" + rs.getString(2));  } } catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}  // 关闭连接public void close() {try {if (rs != null) {rs.close();}if (ps != null) {ps.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}public static void main(String[] args) {HiveDao dao = new HiveDao();dao.getConnection("192.168.1.157");dao.createDatabase("mydb");dao.dropTable("mydb.goods");dao.createTable("create table mydb.goods(id int,name string) row format delimited fields terminated by '\t' ");dao.load("load data inpath 'input/goods.txt' into table mydb.goods");dao.descTables("mydb.goods");ResultSet rs=dao.query("select * from mydb.goods");try {while(rs.next()){System.out.println(rs.getInt(1)+"\t"+rs.getString(2));}} catch (SQLException e) {e.printStackTrace();}dao.close();}}
log4j:WARN No appenders could be found for logger (org.apache.hive.jdbc.Utils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
org.apache.hive.jdbc.HiveConnection@7a0ac6e3
id  int
name    string
1   Java
2   Java EE
3   Android
4   Hadoop
5   Zookeeper
6   Hive
7   HBase
8   Spark
hive> show databases;
OK
default
mydb
Time taken: 2.165 seconds, Fetched: 2 row(s)
hive> use mydb;
OK
Time taken: 0.056 seconds
hive> show tables;
OK
goods
Time taken: 0.063 seconds, Fetched: 1 row(s)
hive> select * from goods;
OK
1   Java
2   Java EE
3   Android
4   Hadoop
5   Zookeeper
6   Hive
7   HBase
8   Spark
Time taken: 0.908 seconds, Fetched: 8 row(s)
hive>

12.3.5 HiveServer2 HA

(1)HiveServer2的优点 
在生产环境中使用Hive,强烈建议使用HiveServer2来提供服务,好处很多: 
在应用端不用部署Hadoop和hive客户端; 
相比hive-cli方式,HiveServer2不用直接将HDFS和Metastore暴漏给用户; 
有安全认证机制,并且支持自定义权限校验; 
有HA机制,解决应用端的并发和负载均衡问题 
JDBC方式,可以使用任何语言,方便与应用进行数据交互; 
从2.0开始,HiveServer2提供了WEB UI。

(2)单点故障 
如果使用HiveServer2的Client并发比较少,可以使用一个HiveServer2实例,没问题。 

但如果这一个实例挂掉,那么会导致所有的应用连接失败。

(3)高可用 
Hive从0.14开始,使用Zookeeper实现了HiveServer2的HA功能(ZooKeeperService Discovery),Client端可以通过指定一个nameSpace来连接HiveServer2,而不是指定某一个host和port。 

(4)HA 配置

hive-site.xml

    <property><name>hive.server2.support.dynamic.service.discovery</name><value>true</value></property><property><name>hive.server2.zookeeper.namespace</name><value>hiveserver2_zk</value></property><property><name>hive.zookeeper.quorum</name><value>node1:2181,node2:2181,node3:2181</value></property><property><name>hive.zookeeper.client.port</name><value>2181</value></property><property><name>hive.server2.thrift.bind.host</name><value>0.0.0.0</value></property><property><name>hive.server2.thrift.port</name><value>10001</value> //两个HiveServer2实例的端口号要一致</property>

Hadoop基础教程-第12章 Hive:进阶(12.3 HiveServer2)(草稿)相关推荐

  1. Hadoop基础教程-第10章 HBase:Hadoop数据库(10.1 NoSQL介绍)(草稿)

    第10章 HBase:Hadoop数据库 10.1 NoSQL介绍 10.1.1 NoSQL简介 随着互联网技术(互联网+,物联网)发展,特别是大数据时代到来,我们需要存储处理更多数据,这种需求远远超 ...

  2. 《Hadoop基础教程》之初识Hadoop

    Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...

  3. hadoop基础教程

    Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...

  4. Hadoop基础教程》之初识Hadoop【转】

    Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...

  5. 《Hadoop基础教程》读后感

    Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...

  6. Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍

    Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍 本书主要讲解的是,如何使用Unity开发2D游戏.但在开始讲解之前,最好先熟悉一下Unity这个工具.本章会首先介绍Unity的下 ...

  7. 【Hadoop基础教程】7、Hadoop之一对一关联查询

    我们都知道一个产品唯一对应一个单价,本案例将通过两种类型输入文件:product类(产品)和price类(价格)进行一对一的关联查询,得到产品名(例如:手表)与产品价格(例如:$100)的关联信息. ...

  8. 计算机应用基础李健,计算机应用基础教程 李健苹 计算机应用基础教程 第4章...

    计算机应用基础教程 李健苹 计算机应用基础教程 第4章 (58页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 主讲人:李健苹 2011.2 ...

  9. iOS游戏框架Sprite Kit基础教程第1章编写第一个Sprite Kit程序

    iOS游戏框架Sprite Kit基础教程第1章编写第一个Sprite Kit程序 程序是为了实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.本章将以编写第一个Sprite Kit程序为 ...

最新文章

  1. python3下载文件-python3 下载文件方法汇总
  2. 静态成员函数调用方式--收藏帖子
  3. SSD: how to optimize your Solid State Drive for Linux Mint 17.3, Ubuntu 16.04 and Debian
  4. 【Java】输出10-1000中间既能被3整除又能被7整除的数
  5. (转载)查看Oracle字符集及怎样修改字符集
  6. 蚂蚁员工持股平台管理权变更 马云持股降至34%
  7. 企业办公oa系统医药OA办公后台管理会议管理用户管理物料管理活动管理/Axure医药内部管理平台/web端后台管理系统原型/医药OA系统/权限管理
  8. UIAppearance
  9. windows安装vnm
  10. leetcode 448. 找到所有数组中消失的数字(Find All Numbers Disappeared in an Array)
  11. 记一次接口压力测试与性能调优
  12. 华为U2000北向接口开发中遇到的坑——获取HW_MSTPInventory管理对象失败
  13. uniapp H5文件预览,PDF预览
  14. 并行处理系统 计算机网络 分布式系统,分布式并行信号处理系统,Distributed parallel signal processing system,音标,读音,翻译,英文例句,英语词典...
  15. 基督教的旧约圣经和新约圣经
  16. 2020年科协第一次硬件培训总结
  17. O2O无缝营销 将独步天下
  18. 图谱实战 | 10 个前沿落地应用案例分享(附下载)
  19. 利用Python做一个简单的对战小游戏
  20. 专访中医大师王柏枝:国医泰斗的济世情怀

热门文章

  1. linux里添加网卡,Linux添加虚拟网卡的多种方法
  2. ICE之Slice语言
  3. 4套主题bootstrap后台管理模板源码下载
  4. java项目如何分工合作,JavaWeb基础 jsp+servlet分工合作的简单示例
  5. 【Beta阶段】第一次Scrum Meeting
  6. 作业辅导视频 SS2023-HW10:Laplace变换性质练习题
  7. 可扩展标记语言XML
  8. 内部总线、系统总线、外部总线
  9. VMware虚拟机扩容——Ubuntu的/dev/sda1分区挂在根目录(“/“)下用LVM(逻辑卷管理)模式扩容无效
  10. c语言程序设计形成性作业3,C语言程序设计形成性作业3-4..doc