Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
Jobtracker是hadoop1.x中的组件,它的功能相当于: Resourcemanager+AppMaster
TaskTracker 相当于: Nodemanager + yarnchild
基本组成
各组件的基本功能
Hive利用HDFS存储数据,利用MapReduce查询数据
运行原理:
Operator 操作符:
数据格式。Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
总结:hive具有sql数据库的外表,但应用场景完全不同,hive只适合用来做批量数据统计分析
1、Hive中的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text ,SequenceFile,ParquetFile,RCFILE等)
2、只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
3、Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。
4、ANTLR词法语法分析工具解析hql :https://baike.baidu.com/item/antlr/9368750?fr=aladdin
Hive官网上介绍了Hive的3种安装方式,分别对应不同的应用场景。(按照元数据存储方式)
元数据保存在内嵌的derby种,允许一个会话链接,尝试多个会话链接时会报错,一般用于Unit Test
这种方式是最简单的存储方式,只需要在hive-site.xml做如下配置便可
javax.jdo.option.ConnectionURL
jdbc:derby:;databaseName=metastore_db;create=true
javax.jdo.option.ConnectionDriverName
org.apache.derby.jdbc.EmbeddedDriver
hive.metastore.local
true
hive.metastore.warehouse.dir
/user/hive/warehouse
多用户的模式,使用MySQL来存储元数据。连接之前无需知道数据库的密码。这种方式一般作为公司内部同时使用Hive。
配置环境变量:
hive.metastore.warehouse.dir
/usr/hive_remote/warehouse
javax.jdo.option.ConnectionURL
jdbc:mysql://node02/hive_remote?createDatabaseIfNotExist=true
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName
root
javax.jdo.option.ConnectionPassword
123
本地元存储和远程元存储的区别:本地元存储不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程元存储的metastore服务和hive运行在不同的进程里。
这种模式需要使用hive安装目录下提供的beeline+hiveserver2配合使用才可以。
其原理就是将metadata作为一个单独的服务进行启动。各种客户端通过beeline来连接,连接之前无需知道数据库的密码。
将hive-site.xml配置文件拆为如下两部分
1)、服务端配置文件
hive.metastore.warehouse.dir
/user/hive/warehouse
javax.jdo.option.ConnectionURL
jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=true
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName
root
javax.jdo.option.ConnectionPassword
123456
2)、客户端配置文件
hive.metastore.warehouse.dir
/user/hive/warehouse
hive.metastore.local
false
hive.metastore.uris
thrift://192.168.57.5:9083
启动hive服务端程序: hive --service metastore (或者 hive --service metastore 2>&1 >> /dev/null & )
客户端直接使用hive命令即可
root@my188:~$ hive
Hive history file=/tmp/root/hive_job_log_root_201301301416_955801255.txt
hive> show tables;
OK
test_hive
Time taken: 0.736 seconds
hive>
客户端启动的时候要注意:[ERROR] Terminal initialization failed; falling back to unsupportedjava.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected at jline.TerminalFactory.create(TerminalFactory.java:101)错误的原因: Hadoop jline版本和hive的jline不一致
不需要启动server,使用本地的metastore,可以直接做一些简单的数据操作和测试。
metastore可以和hive客户端不在一个机器上。
同样不需要启动server,只需要启动元数据服务,即可使用远程的metastore
远端启动方式,(假如是在服务器1上):
方式(1)-- hive/bin/beeline 回车,进入beeline的命令界面
输入命令连接hiveserver2: beeline> !connect jdbc:hive2//mini1:10000
(mini1是hiveserver2所启动的那台服务器1,端口默认是10000)
方式(2)-- 或者启动就连接:bin/beeline -u jdbc:hive2://mini1:10000 -n hadoop
扩展:以前Hive Cli 服务器是HiveServer,而beeline Cli服务器是HiveServer2。HiveServer不能处理多个客户端的并发请求,所以产生了HiveServer2。但是,从hive1.0.0开始,HiveServer已经不存在了,从Hive代码中删除了,Hive Cli 也使用的是HiveServer2了,这对用户来说是透明的。(Hive社区一直建议使用Beeline + HiveServer2配置,由于Hive CLI的广泛使用,所以Hive CLI的实现已被替换)
方式(3)-- 使用客户端软件$HIVE_HOME/bin/hive --service hiveserver2
hive提供网页GUI来访问Hive数据仓库 ,可以通过以下命令启动hwi,默认端口号9999
$HIVE_HOME/bin/hive --service hwi
从Hive 2.2.0开始不再支持hwi,故此处不再赘述。
hiveserver2 也可以用来访问元数据的,他和metastoreServer是访问元数据的二种不同服务。