hive的作用:hive最初的设计目的是为了给哪些精通sql但是不熟悉Hadoop的分析师,用来分析大规模的结构化的数据文件而设计的。
首先最重要的一点:
hive的使用和关系型数据库的使用方式类似(类sql语句),那我们为什么不使用关系型数据库而使用hive?
1.hive能分析超大数据规模的数据。
2.hive用于分析存储在文件中的结构化的数据。而关系型数据库不能。
所以hive最初的设计目的是:给哪些精通sql但是编码不熟练。而要分析的结构化的数据存储于大规模的文件中。在hive出现之前。是用MR来进行统计和分析。但是对这些存储文件中的结构化的数据。MR都类似。分析的统计最终数据也类似于关系型数据库中的手法。所以索性就将这些MR统一封装。成一个HQL语句。在调用HQL语句分析这些数据时,转换成MR。
一:hive提供的服务
输入hive --service help。弹出hive提供的服务列表。在这里主要介绍常用的几个服务。 cli ,hiveserver,hwi,jar
[s201 ~]$ hive --service help
Usage ./hive <parameters> --service serviceName <service parameters>
Service List:
beeline cleardanglingscratchdir cli hbaseimport hbaseschematool
help hiveburninclient hiveserver2 hplsql jar lineage llapdump
llap llapstatus metastore metatool orcfiledump rcfilecat schemaTool version
1.1 hive cli 服务
默认的服务。输入hive直接启动这个服务,进入cli服务的交互式模式。
[s201 ~]$ hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/soft/apache-hive-2.3.4-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/soft/hadoop-2.9.2/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Logging initialized using configuration in jar:file:/soft/apache-hive-2.3.4-bin/lib/hive-common-2.3.4.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive>
进入cli的交互式模式。里面的命令如下
- quit,exit: 退出交互式shell
- reset: 重置配置为默认值
- set <key>=<value> : 修改特定变量的值(如果变量名拼写错误,不会报错)
- set : 输出用户覆盖的hive配置变量
- set -v : 输出所有Hadoop和Hive的配置变量
- add FILE[S] *, add JAR[S] *, add ARCHIVE[S] * : 添加 一个或多个 file, jar, archives到分布式缓存
- list FILE[S], list JAR[S], list ARCHIVE[S] : 输出已经添加到分布式缓存的资源。
- list FILE[S] *, list JAR[S] *,list ARCHIVE[S] * : 检查给定的资源是否添加到分布式缓存
- delete FILE[S] *,delete JAR[S] *,delete ARCHIVE[S] * : 从分布式缓存删除指定的资源
- ! <command> : 从Hive shell执行一个shell命令
- dfs <dfs command> : 从Hive shell执行一个dfs命令
- <query string> : 执行一个Hive 查询,然后输出结果到标准输出
- source FILE <filepath>: 在CLI里执行一个hive脚本文件
- !+ shell 命令,可以执行宿主机的命令如 !ls /;
- dfs 命令可访问Hadoop文件系统
可以在非交互模式下使用cli服务。
script.q是按行分隔的hive命令。这是一个脚本文件。
下面的命令不进入交互式模式而可以直接执行hive脚本。
[s201 ~]$ hive -f script.q
执行单条的hive命令
[s201 ~]$ hive -e 'select * from testTable'
hive会将所有输出打印到标准输出。如果只想看到结果不想看到其他输出信息。
[s201 ~]$ hive -e -S 'select * from testTable'
1.2 hiveserver 服务
hive 以提供Thrift服务的服务器形式运行。允许Hive Thrift client,hive jdbc client, hive odbc连接。设置hive_port来设置该服务器的监听端口号。
启动该服务器的方式:
$>hive --service hiveserver2 &
使用hive jdbc client方式连接到hiveserver。
方式一:使用beeline服务,在命令行连接。
$>beeline //进入beeline命令行(于hive --service beeline)
$beeline>!help //查看帮助
$beeline>!quit //退出
$beeline>!connect jdbc:hive://localhost:10000/mydb2//连接到hibve数据
注,这里连接不上。用
!connect jdbc:hive2://localhost:10000 root
再输入mysql的密码就可以连上了。
具体参考hive的安装配置。
metastore数据存在数据库中,
实际数据存在HDFS上。
所以要连上hive,就需要输入mysql的用户和密码。
$beeline>show databases ;
$beeline>use mydb2 ;
$beeline>show tables; //显式表
方式二:java编码中使用hive jdbc client方式连接到hiveserver
使用Hive-jdbc驱动程序采用jdbc方式访问远程数据仓库
----------------------------------------------------
1.创建java模块
2.引入maven
3.添加hive-jdbc依赖
<?xml version="1.0" encoding="UTF-8"?>
<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>com.it18zhang</groupId>
<artifactId>HiveDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
</project>
4.App
package com.it18zhang.hivedemo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* 使用jdbc方式连接到hive数据仓库,数据仓库需要开启hiveserver2服务。
*/
public class App {
public static void main(String[] args) throws Exception {
Class.forName("org.apache.hive.jdbc.HiveDriver");
//Connection conn = DriverManager.getConnection("jdbc:hive2://192.168.231.201:10000/mydb2");
Connection conn = DriverManager.getConnection("jdbc:hive://192.168.231.201:10000/mydb2");//应该是这个
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select id , name ,age from t");
while(rs.next()){
System.out.println(rs.getInt(1) + "," + rs.getString(2)) ;
}
rs.close();
st.close();
conn.close();
}
}
1.3 hwi 服务
HWI是Hive Web Interface的简称,是hive cli的一个web替换方案。熟悉hive cli就够了,操作hwi更是简单。
所以这里就略过。
1.4 hive jar 服务
hive jar 和Hadoop jar一样,是运行类路径中同时包含Hadoop和hive类java应用程序的方式
1.5 hive metastore服务
要介绍metastore服务,必须先介绍metastore。
metastore包含metastore服务和metastore后台数据的存储。
metastore服务默认是和hive服务程序运行在一个jvm中。我们可以配置metastore服务和hive服务分离,运行在不同的进程中。这样做可以提供更好的管理性和安全性。
如上图,metastare的三种不熟方式。
一:内嵌的metastare。数据库采用内嵌的Derby,一次只能为一个metastare打开一个hive会话。如果尝试打开第二个会话则会报错。
二:本地的metastare。数据库采用mysql,mysql运行在本机或者远程机器。可以打开多个会话。但是metastare服务和hive服务仍然在一个进程中。
三:远程的metastare。数据库采用mysql,mysql运行在本机或者远程机器。可以打开多个会话。metastare服务和hive服务仍然在不同的进程中。
具体的配置,略。入门使用内嵌的,一般情况为了方便都使用本地的,为了考虑安全,商用性可用性等一般使用远程的。