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

第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:hive
    private 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 result
            ps.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 block
            e.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 block
            e.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>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿杜的世界

Spring Cloud学习-Eureka、Ribbon和Feign引子实践源码下载参考资料

看完《微服务设计》后,算是补上了自己在服务化这块的理论知识,在业界,一般有两种微服务的实践方法:基于dubbo的微服务架构、基于Spring Cloud的微服务...

882
来自专栏Java学习之路

Hibernate学习---基本介绍+作用+配置

从今天开始重新学习(以前学的太匆忙)Hibernate,这篇文章主要就一下几点进行讲解和说明: Hibernate的基本介绍 Hibernate的作用 Hibe...

2697
来自专栏A周立SpringCloud

Spring Cloud各组件超时总结

Ribbon的超时 全局设置: ribbon: ReadTimeout: 60000 ConnectTimeout: 60000 局部设置: servi...

3436
来自专栏LanceToBigData

SpringBoot(三)整合Redis

spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化。 redis介绍 Redis是目前业界使用最广泛的内存数据存储。相比memc...

3204
来自专栏杨建荣的学习笔记

通过Java程序测试数据库连接信息 (r10笔记第64天)

很就没写Java了,今天简单问了下行情,如今都是Java 9的时代了,老系统基本上都是在Java 7。 Oracle中很早就糅合了Java,Oracle 10g...

3437
来自专栏Java帮帮-微信公众号-技术文章全总结

Spring-拾遗

Junit集成 前面多次用到@RunWith与@ContextConfiguration,在测试类添加这两个注解,程序就会自动加载spring配置并初始化Spr...

2815
来自专栏Java成神之路

hbase_异常_04_util.FSUtils: Waiting for dfs to exit safe mode...

可等Hadoop退出安全模式后再执行HBase命令,或者手动退出Hadoop的安全模式

652
来自专栏java思维导图

spring框架思维导图,简约概括

Spring之旅 简化java开发 激发pojo的潜能 依赖注入 应用切面 使用模版消除样板式代码 容纳你的bean 与应用上下文共事 bean的生命周期 俯翰...

2716
来自专栏菩提树下的杨过

ActiveMQ笔记(5):JMX监控

系统上线运行后,及时监控报警是很必要的手段,对于ActiveMQ而言,主要监控的指标有:MQ本身的健康状况、每个队列的生产者数量、消费者数量、队列的当前消息数等...

1978
来自专栏猿天地

Spring Cloud Gateway 网关尝鲜

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网...

973

扫码关注云+社区