初识Hive

1.Hive提供Hive查询语音(简称HiveQL或HQL)来查询存储在Hadoop集群中的数据。

2.Hive(本质)可以将大多数查询转换为MapReduce任务(job)

3.Hive适用于数据仓库应用程序,使该应用程序进行相关的静态数据分析,可以维护海量数据,并对数据进行挖掘,形成意见和报告,不需要快速响应给出结果,数据本身也不会频繁变化。

4.Hive的使用受限于Hadoop及HDFS设计本身的约束和局限性,Hive需要基于Hadoop,不能单独工作。

5.Hive不支持记录级别的更新,插入或者删除操作。用户可以通过查询生成新的表或者将查询结果导入到文件中。

6.Hadoop是一个面向批处理的系统,而MapReduce任务启动过程需要消耗较长时间,所以Hive延时比较严重

7.Hive不支持事务

8.MapReduce是一种计算模型,可以将大型数据处理任务分解成很多单个的,可以在服务器集群中并行执行的任务,这些任务的计算结果可以合并在一起来计算最终的结果。

9.在hadoop分布式文件系统(HDFS)中,每个数据块(block)都会被冗余多份(通常默认是3份),这样可以保证不会因为单个硬盘或服务器损坏导致数据丢失。

10.HDFS及类似的文件系统使用的数据块通常是64M,或这个值的若干倍,使大地的数据块可以在硬盘中连续存储,以最少的磁盘寻址次数进行写入和读取,从而最大化提高读写性能。

11.Pig,Hive(由Facebook开发)的替代工具中最有名的一款,由Yahoo!开发。

12.Pig被描述成一种数据流语言,而不是查询语音,流比一种复杂查询更直观,因此Pig常用语ETL过程的一部分,也就是将外部数据装载到Hadoop集群中,然后转换成所期望的数据格式。

13.HBase,可以满足用户需要Hive无法提供的数据块特性(如行级别的更新,快速查询相应,支持事务)的需求

14.HBase最重要的特性:列存储,其中的列可以组织成列族,列族在分布式集群中物理上是存储在一起的,因此当查询场景涉及的列只是所有列的一个子集时,读写速度会快得多,因为只需要读取需要的列而不需要读取多有的行然后丢弃大部分的列。

15.HBase可以像键-值存储一样使用,每一行都是用了唯一的键来提供非常快的速度读写这一行的列或列族,HBase还会对每个列保留多个版本的值(按照时间戳进行标记),版本数量可以配置,如有需要,可以回退至之前的某个版本。

16.HBase使用HDFS来持久化存储数据,使用内存缓存技术对数据和本地文件进行追加数据更新操作日志以实现行级别的数据更新和快速查询。持久化文件将定期地使用附加日志更新进行更新等操作。

Hive内部构造

1.$HIVE_HOME/lib目录下众多jar包实现Hive功能的特定部分

2.$HIVE_HOME/bin下包含Hive的可执行程序,除非特殊说明,hive(小写)来代表CLI。CLI是使用Hive最常用的方式,即Hive的命令行界面,用于提供交互式的界面供输入语句或者供用户执行含有Hive语句的脚本。

3.Hive的其他组件。Thrift服务提供了可远程访问其他进程的功能,也提供使用JDBC和ODBC访问Hive的功能

4.所有的Hive客户端都需要一个metastoreserive(元数据服务),Hive使用这个服务来存储表模式信息和其他元素信息。,通常会使用一个关系性数据库中的表来存储这些信息

5.Hive默认使用内置的Derby SQL数据库,其可提供有限的,单进程的存储服务(存储大小为2MB)

6.Hive提供简单的网页界面,即Hive网页界面(HWI),提供远程访问Hive的服务。

7.$HIVE_HOME/conf下存放Hive的配置文件,可设置元数据存储及其他各种各样的优化和安全控制。

Hive使用

Hive中的变量和属性命名空间

hive 编程 hive编程技术_hive 编程


hive 编程 hive编程技术_Hive编程_02


注:在CRT使用默认终端模式时,hive命令行下无法使用删除键,可以调整【会话选项】–【终端】–【linux模式】

Hive变量内部是以Java字符串的方式存储的,用户可以在查询中引用变量。Hive先使用变量值替换掉查询的变量引用,然后才会将查询语句提交给查询处理器。

create table x(a int);
FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: 
java.lang.RuntimeException: Unable to instantiate 
org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

解决:
在终端执行date命令,查看时间
mysql -uroot -ppassword
进入mysql,在mysql中执行
show variables like ‘%time_zone%’;
select nows();
发现终端时间和mysql的时间不一致(也有可能时间看着差不多,其实有时间差),这就是问题的原因了。
然后在mysql中执行 set time_zone=SYSTEM;
mysql中继续执行 set global time_zone=’+8:00’;
刷新权限 flush privileges;
按步骤执行完毕后,退出mysql,再次执行schematool -dbType mysql -info
在使用hive就可以了

hive> create table x (a int);
OK
Time taken: 9.257 seconds
hive> create table x (a int);
OK
Time taken: 9.257 seconds
hive> select * from x;
OK
Time taken: 4.385 seconds
hive> select * from x;   #再次查询时间明显变短
OK
Time taken: 0.398 seconds
hive> drop table x;
OK
Time taken: 0.553 seconds
hive> 
    > exit;   #退出
hive> set hivevar:foo=bar2;
hive> set foo;
foo=bar2
hive> create table toss1(i int,${hivevar:foo} string);
OK
Time taken: 1.439 seconds
hive> desc toss1;
OK
i                       int                                         
bar2                    string                                      
Time taken: 0.246 seconds, Fetched: 2 row(s)
hive> create table toss2(i2 int,${foo} string);
OK
Time taken: 0.148 seconds
hive> desc toss2;
OK
i2                      int                                         
bar2                    string                                      
Time taken: 0.213 seconds, Fetched: 2 row(s)
hive> set system:;
system:=root
hive> set env:HOME;
env:HOME=/root

#插入数据

hive> insert into toss1 values (1,'a'),(2,'b'),(3,'c');
WARNING: 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.
Query ID = root_20190916031302_93dc1858-d408-4166-8b44-ba744bebc59d
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1568594271375_0002, Tracking URL = http://bigdata:8088/proxy/application_1568594271375_0002/
Kill Command = /opt/module/hadoop-2.8.5/bin/hadoop job  -kill job_1568594271375_0002
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2019-09-16 03:13:35,993 Stage-1 map = 0%,  reduce = 0%
2019-09-16 03:13:43,828 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.86 sec
MapReduce Total cumulative CPU time: 1 seconds 860 msec
Ended Job = job_1568594271375_0002
Stage-4 is selected by condition resolver.
Stage-3 is filtered out by condition resolver.
Stage-5 is filtered out by condition resolver.
Moving data to directory hdfs://bigdata:9000/user/hive/warehouse/toss1/.hive-staging_hive_2019-09-16_03-13-02_453_7599300815627817646-1/-ext-10000
Loading data to table default.toss1
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 1   Cumulative CPU: 1.86 sec   HDFS Read: 4120 HDFS Write: 81 SUCCESS
Total MapReduce CPU Time Spent: 1 seconds 860 msec
OK
Time taken: 44.102 seconds
hive> select * from toss1;
OK
1       a
2       b
3       c
Time taken: 0.261 seconds, Fetched: 3 row(s)

在bash窗口使用命令查询

hive -e 'select * from toss1';  #一次性查看toss1表
hive -S -e 'select * from toss1' > /tmp/myquery  #静默查看toss1表,并将查询内容输出到文件中

示例:

[root@bigdata ~]# hive -e 'select * from toss1';  #一次性输出
which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_221/bin:/opt/module/hadoop-2.8.5/sbin:/opt/module/hadoop-2.8.5/bin:/opt/module/zookeeper-3.4.10/bin:/opt/module/hive-2.3.6-bin/bin:/usr/local/mysql/lib:/usr/local/mysql/bin:/root/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/module/hive-2.3.6-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/module/hadoop-2.8.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.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 file:/opt/module/hive-2.3.6-bin/conf/hive-log4j2.properties Async: true
OK
1       a
2       b
3       c
Time taken: 20.622 seconds, Fetched: 3 row(s)
[root@bigdata ~]#  hive -S -e 'select * from toss1' > /tmp/myquery  #静默方式
which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_221/bin:/opt/module/hadoop-2.8.5/sbin:/opt/module/hadoop-2.8.5/bin:/opt/module/zookeeper-3.4.10/bin:/opt/module/hive-2.3.6-bin/bin:/usr/local/mysql/lib:/usr/local/mysql/bin:/root/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/module/hive-2.3.6-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/module/hadoop-2.8.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.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]
[root@bigdata ~]# cat /tmp/myquery   #查看
1       a
2       b
3       c

#模糊检索hive属性

hive -S -e "set" |grep warehouse

输出如下:

[root@bigdata ~]# hive -S -e "set" |grep warehouse
which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_221/bin:/opt/module/hadoop-2.8.5/sbin:/opt/module/hadoop-2.8.5/bin:/opt/module/zookeeper-3.4.10/bin:/opt/module/hive-2.3.6-bin/bin:/usr/local/mysql/lib:/usr/local/mysql/bin:/root/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/module/hive-2.3.6-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/module/hadoop-2.8.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.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]
hive.metastore.warehouse.dir=/user/hive/warehouse
hive.warehouse.subdir.inherit.perms=true

使用文件中的数据插入到表

hive> 
    > 
    > create table src(s STRING);
OK
Time taken: 0.281 seconds
[root@bigdata hive_query]# echo "one row" > /tmp/myfile
[root@bigdata hive_query]# hive -e "LoAD DATA LOCAL INPATH '/tmp/myfile' INTO TABLE src;"
[root@bigdata hive_query]# hive -e 'SELECT * FROM src';
one row
Time taken: 9.479 seconds, Fetched: 1 row(s)

hiverc文件

CLI -i 文件名

  • 这个选项允许用户指定一个文件,在CLI启动时,在提示符出现前会先执行这个文件。Hive会自动在HOME目录下寻找名为.hiverc的文件,且自动执行这个文件中的命令(如果文件存在)
  • 可以利用此文件设置系统属性或增加对于Hadoop的分布式内存进行自定义的Hive扩展的Java包。

hive 的历史记录

  • Hive会将最近的100,00行命令记录到文件$HOME/.hivehistory中,如需再次执行此命令只需在此命令上敲Enter键即可,修改命令可使用左右键移动光标进行编辑
  • $HOME表示当前用户的home目录,
  • 如root用户,hive历史记录位置为:/root/.hivehistory;
  • 其他用户应存放的位置为:/home/username/.hivehistory

在hive中调用shell命令

以感叹号(!)开头并以分号(;)结尾
不支持需要用户输入的交互命令
不支持管道符和自动补全功能

hive> !echo 'what up dog';
'what up dog'
hive> !pwd;
/root

注:!ls .hql;表示查找名称为。hql的文件,而不是找所有以.hql结尾的文件

在hive中使用Hadoop的dfs命令

dfs -ls /;等价于 hadoop fs -ls /
性能上前者由于使用同一个进程执行这些命令,所以更高效;后者每次都会启动一个新的JVM实例。

hive> dfs -ls /;
Found 4 items
-rw-r--r--   3 root supergroup        175 2019-09-15 23:03 /test02
drwxr-xr-x   - root supergroup          0 2019-09-15 23:11 /test02_
drwx-wx-wx   - root supergroup          0 2019-09-15 23:11 /tmp
drwxr-xr-x   - root supergroup          0 2019-09-16 02:37 /user

hive中注释

使用–(两个短横线)表示注释

hive> 
    > 
    > 
    > --i love you 
    > !echo "i love you ";
"i love you "

hive中显示字段名称

hive> set hive.cli.print.header=true;
hive> select * from toss1;
OK
toss1.i toss1.bar2
1       a
2       b
3       c
Time taken: 2.452 seconds, Fetched: 3 row(s)

如果希望中是看到字段名称,可以将第一行放置到$HOME/.hiverc文件中

[root@bigdata ~]# echo 'set hive.cli.print.header=true;' > /root/.hiverc