一、Hive初识入门

 

1.  Hive的背景及概念

hive数据库的schema是什么意思 hive schema_Hive

之前的程序员大多都使用sql,让他们写MapReduce需要培训,成本高。

hive数据库的schema是什么意思 hive schema_Hive_02

ETL( Extract-Transform-Load)



2.  Hive的架构、优点及使用场景讲解

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_03

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_04

hive数据库的schema是什么意思 hive schema_mysql_05

hive数据库的schema是什么意思 hive schema_Hive_06

hive数据库的schema是什么意思 hive schema_hive_07


3.  Hive安装部署及简单测试(使用derby存储元数据)

① 修改配置文件:

hive-env.sh(重命名hive-env.sh.template)

设置hadoop目录和hive的配置目录:

hive数据库的schema是什么意思 hive schema_hive_08


② 创建文件夹且添加权限

hive数据库的schema是什么意思 hive schema_mysql_09

一个公司,有多个部门,不同部门是不同的组,用的是不同的hive仓库,相当于每个部门装一个hive。但是,hive默认的数据仓库目录是一样的,所以需要手动改变。

hive数据库的schema是什么意思 hive schema_Hive_10

在hive-site.xml配置即可。

 

③ 使用schematool 初始化metastore的schema:

[root@hadoop-seniorapache-hive-2.1.1-bin]# bin/schematool -dbType derby –initSchema

 

④ 启动并测试:

hive数据库的schema是什么意思 hive schema_hive_11

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_12

hive数据库的schema是什么意思 hive schema_Hive_13

select count(*)转换成了mapreduce:

hive数据库的schema是什么意思 hive schema_Hive_14


创建表并加载数据:

hive数据库的schema是什么意思 hive schema_hive_15

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_16

(注意:overwrite覆盖表中的原有数据)


 

4.  Hive安装部署(使用mysql存储元数据)

注意:hive和mysql要安装到同一台机器上;接着上面的配置继续配置。


① 为什么不用derby(内存数据库)改用mysql?

内存数据库derby只能供一个人使用,在另外一个节点上同时开启就会报如下错误:

hive数据库的schema是什么意思 hive schema_Hive_17

而现在我们整个集群都要使用hive元数据,所以改用mysql。


② 安装配置mysql(通过rpm方式):

下载地址:

http://mirrors.sohu.com/mysql/


查看所有用户:

hive数据库的schema是什么意思 hive schema_mysql_18

 

修改mysql数据库的登陆权限:

GRANT ALL PRIVILEGES ON *.* TO'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;


刷新权限:

FLUSH PRIVILEGES;

 

③ 把mysql的驱动包放到hive的lib目录下

hive数据库的schema是什么意思 hive schema_Hive_19

 

④ 修改配置文件:

hive-site.xml(复制hive-default.xml.template)

因为default配置项太多,也可手动创建一个hive-site.xml


配置mysql四要素:

数据库地址、驱动名称、用户名、密码

hive数据库的schema是什么意思 hive schema_hive_20

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
</property>


⑤ 使用schematool 初始化metastore的schema:

[root@hadoop-seniorapache-hive-2.1.1-bin]# bin/schematool -dbType mysql -initSchema

(如果出现已存在的异常,把hive目录下的metastore_db重命名metastore_db.temp)


⑥ 启动hive

第一次启动慢,因为要初始化元数据

hive数据库的schema是什么意思 hive schema_mysql_21

查看mysql会发现多了hive数据库(存储元数据)

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_22

(“hive”是hive-site.xml中配置的名字)


5.  Hive的常用操作

查看表详细信息:

desc 表名

hive数据库的schema是什么意思 hive schema_Hive_23


desc extended 表名

hive数据库的schema是什么意思 hive schema_Hive_24


desc formatted 表名

hive数据库的schema是什么意思 hive schema_Hive_25

hive数据库的schema是什么意思 hive schema_mysql_26

 

查看所有函数:

hive> show functions;

hive数据库的schema是什么意思 hive schema_mysql_27


查看函数如何使用:

hive数据库的schema是什么意思 hive schema_mysql_28


如何在查看表的时候显示字段名称和数据库名称:

在hive-site.xml中添加如下配置:

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_29

<property>
   <name>hive.cli.print.header</name>
   <value>true</value>
</property>
<property>
   <name>hive.cli.print.current.db</name>
   <value>true</value>
</property>

重启hive

hive数据库的schema是什么意思 hive schema_hive_30


查看HDFS文件信息:

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_31

 

在hive 命令行中执行本地文件系统操作:

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_32


查看执行hive语句的历史记录:

保存在当前用户的家目录中的.history中:

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_33

hive数据库的schema是什么意思 hive schema_hive_34


不进hive命令行界面执行sql语句:

hive数据库的schema是什么意思 hive schema_Hive_35

bin/hive -e "select * from student;"

测试:

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_36


不进hive命令行界面执行sql脚本文件:

bin/hive -f hivef.sql

(在实际的开发中经常用) 

①写一个sql脚本

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_37

② 执行该脚本

hive数据库的schema是什么意思 hive schema_hive_38

把sql查询的结果保存到txt文件中

hive数据库的schema是什么意思 hive schema_Hive_39

 

查看数据所属的文件:

hive数据库的schema是什么意思 hive schema_mysql_40


6.  Hive运行日志配置和查看

默认的日志配置:

加载的是lib包下hive-common包中的日志配置

hive数据库的schema是什么意思 hive schema_mysql_41

 

修改:

hive数据库的schema是什么意思 hive schema_hive_42

将hive的conf目录下的hive-log4j2.properties.template重命名为hive-log4j2.properties,hive启动时将自动加载它。

hive数据库的schema是什么意思 hive schema_hive_43


日志的存放位置:

hive数据库的schema是什么意思 hive schema_Hive_44

可以将日志文件设置到hive目录下:

property.hive.log.dir =/usr/opt/modules/apache-hive-2.1.1-bin/logs


测试(日志存放目录已修改):

hive数据库的schema是什么意思 hive schema_mysql_45


设置日志信息显示在控制台:

hive数据库的schema是什么意思 hive schema_hive_46

[root@hadoop-seniorapache-hive-2.1.1-bin]# bin/hive --hiveconf hive.root.logger=INFO,console;

hive数据库的schema是什么意思 hive schema_hive数据库的schema是什么意思_47

7.  Hive常见属性配置(重点)

 

以下皆在上文有介绍,本小节作为回顾


Hive数据仓库位置配置 

default

       /user/hive/warehouse

注意事项

       *在仓库目录下,没有对默认的数据库default创建文件夹

       *如果某张表属于default数据库,直接在数据仓库目录下创建一个文件夹

hive数据库的schema是什么意思 hive schema_hive_48

(需要配置到hive-site.xml)

在hdfs上创建目录并赋予权限:

$ $HADOOP_HOME/bin/hadoop fs -mkdir   /tmp
$ $HADOOP_HOME/bin/hadoop fs -mkdir   /user/hive/warehouse
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse

Hive运行日志信息位置 

$HIVE_HOME/conf/hive-log4j.properties
              hive.log.dir=/opt/modules/hive-0.13.1/logs
              hive.log.file=hive.log


指定hive运行时显示的log日志的级别

$HIVE_HOME/conf/hive-log4j.properties
              hive.root.logger=INFO,DRFA


在cli命令行上显示当前数据库,以及查询表的行头信息

$HIVE_HOME/conf/hive-site.xml
              <property>
                     <name>hive.cli.print.header</name>
                     <value>true</value>
              </property>
              <property>
                     <name>hive.cli.print.current.db</name>
                     <value>true</value>
              </property>

在启动hive时设置配置属性信息

         

$ bin/hive --hiveconf <property=value>

 

查看当前所有的配置信息

hive > set ;  // 查看所有配置
system:user.name的值
              system:user.name=beifeng
system:user.name的值为beifeng

(此种方式,设置属性的值,仅仅在当前会话session生效)