第二章 hive简介及安装

1 Hive简介

在Hadoop生态圈中属于数据仓库的角色。Hive能够管理Hadoop中的数据,同时可以查询Hadoop中的数据。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制;

 Hive定义了简单的类SQL查询语言,称为HQL ,它允许熟悉SQL的用户查询数据。同时,这个语言也允许熟悉MapReduce开发者的开发自定义的mapper和reducer来处理内建的mapper和reducer无法完成的复杂的分析工作;

 本质上讲,Hive是一个SQL解析引擎。Hive可以把SQL查询转换为MapReduce中的job然后在Hadoop执行。Hive有一套映射工具,可以把SQL转换为MapReduce中的job,可以把SQL中的表、字段转换为HDFS中的文件(夹)以及文件中的列。这套映射工具称之为metastore,一般存放在derby、mysql中;

 Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在M/R的Job里使用这些数据。
Hive的系统架构用户接口主要有三个:CLI,JDBC/ODBC和WebUI 
CLI,即Shell命令行 
JDBC/ODBC是Hive的Java,与使用传统数据库JDBC的方式类似 
WebUI是通过浏览器访问Hive

Hive将元数据存储在数据库中(metastore),支持mysql、derby。Hive中的元数据包括表的名字、表的列和分区及其属性、表的属性(是否为外部表等)、表的数据所在目录等

解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在 HDFS 中,并在随后有MapReduce调用执行


Hive的数据存储在HDFS中,大部分的查询由MapReduce完成(包含 * 的查询,比如select * from table不会生成MapRedcue任务,where后的条件是partition也不会生成M/R任务)
3 安装Hive

A:安装jdk
B:安装Hadoop,并配置HADOOP_HOME
C:设置Hive的配置文件
    在目录$HIVE_HOME/conf/下,执行命令 
    cp hive-log4j2.properties.template hive-log4j2.properties拷贝一份重命名 
    修改property.hive.log.dir = /usr/local/hive-2.1.1/logs/

D:Hadoop集群要先启动

与 Hadoop 类似,Hive 也有 3 种运行模式:
1. 内嵌模式
将元数据保存在本地内嵌的 Derby 数据库中,这是使用 Hive 最简单的方式。但是这种方式缺点也比较明显,因为一个内嵌的 Derby 数据库每次只能访问一个数据文件,这也就意味着它不支持多会话连接。
    由于Hive默认内嵌的是derby数据库,先使用默认的数据库运行
    执行schematool -dbType derby -initSchema进行初始化

2. 本地模式
这种模式是将元数据保存在本地独立的数据库中(一般是 MySQL),这用就可以支持多会话和多用户连接了。

3. 远程模式
此模式应用于 Hive 客户端较多的情况。把 MySQL 数据库独立出来,将元数据保存在远端独立的 MySQL 服务中,避免了在每个客户端都安装 MySQL 服务从而造成冗余浪费的情况。
   修改Hive配置文件,在目录$HIVE_HOME/conf/下,执行命令cp hive-default.xml.template hive-site.xml拷贝重命名 ,修改:
   <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://spark: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>

   为了支持mysql远程访问首先设置当前mysql用于允许master远程机访问,并修改root用户的密码为123456:
    mysql> grant all privileges on *.* to root@'master' identified by '123456';
    mysql> flush privileges;
    *.*代表全部数据库的全部表授权,也可以指定数据库授权,如test_db.*; 
    all privileges代表全部权限,也可以insert,update,delete,create,drop等; 
    允许root用户在spark(Linux系统的主机名,IP映射)进行远程登陆,并设置root用户的密码为root。 
    flush privileges告诉服务器重新加载授权表。

hive执行初始化命令时
    MySQL的驱动包放置到$HIVE_HOME/lib目录下 
    执行schematool -dbType mysql -initSchema进行初始化;
    Error: Duplicate key name 'PCS_STATS_IDX' (state=42000,code=1061)
    以下异常说明mysql已经启动。 应先关掉先前启动的mysql.再执行初始化schema操作。

    $service mysql stop

第二个报错
    Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bhive.session.id%7D_resources

    原因:环境变量设置问题 

    <property>
        <name>Hive.exec.local.scratchdir</name>
        <value>${system:Java.io.tmpdir}/${system:user.name}</value>
        <description>Local scratch space for hive jobs</description>
    </property>
    <property>
        <name>hive.downloaded.resources.dir</name>
        <value>${system:java.io.tmpdir}/${hive.session.id}_resources</value>
        <description>Temporary local directory for added resources in the remote file system.</description>
    </property>
    <property>


    解决方案如下:
    1.查看hive-site.xml配置,会看到配置值含有"system:java.io.tmpdir"的配置项
    2.新建文件夹/home/grid/hive-0.14.0-bin/iotmp
    3.将含有"system:java.io.tmpdir"的配置项的值修改为如上地址
    启动hive,成功!

    启动情况如下:
    $ ./hive
    Logging initialized using configuration in jar:file:/home/grid/hive-0.14.0-bin/lib/hive-common-0.14.0.jar!/hive-log4j.properties
    hive>
4 数据类型
原始类型
类型与表的列相关。支持以下原始类型:
Integers(整型) 
TINYINT -1位的整型
SMALLINT -2位的整型
INT -4位的整型
BIGINT -8位的整型
布尔类型 
BOOLEAN -TRUE/FALSE
浮点数 
FLOAT -单精度
DOUBLE -双精度
定点数 
-DECIMAL -用户可以指定范围和小数点位数
字符串 
-STRING -在特定的字符集中的一个字符串序列 
-VARCHAR -在特定的字符集中的一个有最大长度限制的字符串序列 
-CHAR -在特定的字符集中的一个指定长度的字符串序列
日期和时间 
-TIMESTAMP -一个特定的时间点,精确到纳秒。 
-DATE -一个日期
二进制 
-BINARY -一个二进制位序列
复杂类型
复杂类型可以由原始类型和其他组合类型构建: 
- 结构体类型(Stuct): 使用点(.)来访问类型内部的元素。例如,有一列c,它是一个结构体类型{a INT; b INT},字段a可以使用表达式c.a来访问。 
- Map(key-value键值对):使用['元素名']来访问元素。例如,有一个MapM,包含'group'->gid的映射,则gid的值可以使用M['group']来访问。 
- 数组:数组中的元素是相同的类型。可以使用[n]来访问数组元素,n是数组下标,以0开始。例如有一个数组A,有元素['a','b','c'],则A[1]返回'b'。

猜你喜欢

转载自blog.csdn.net/wshsdm/article/details/80494947