详解Hive的架构及安装步骤

一、Hive是什么?

   Hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop 分布式文件系统中的数据, 可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运行,通过自己的 SQL 去 查询分析需要的内容,这套 SQL 简称 Hive SQL。

  

二、理解Hive 架构

  Hive 架构可以分为四部分。 

  

   

  • 用户接口

      Hive 对外提供了三种服务模式,即 Hive 命令行模式(CLI),Hive 的 Web 模式(WUI),Hive 的远程服务(Client)。下面介绍这些服务的用法。

    1、 Hive 命令行模式

      Hive 命令行模式启动有两种方式。执行这条命令的前提是要配置 Hive 的环境变量。

       1) 进入 /home/hadoop/app/hive 目录,执行如下命令。

    ./hive

       2) 直接执行命令。

     hive –service cli

      Hive 命令行模式用于 Linux 平台命令行查询,查询语句基本跟 MySQL 查询语句类似,运行结果如下所示。

[hadoop@djt11 hive]$ hive
hive> show tables;
OK
stock
stock_partition
tst
Time taken: 1.088 seconds, Fetched: 3 row(s)
hive> select * from tst;
OK
Time taken: 0.934 seconds
hive> exit;
[hadoop@djt11 hive]$

2、Hive Web 模式

Hive Web 界面的启动命令如下。

hive –service hwi

通过浏览器访问 Hive,默认端口为 9999。

3、 Hive 的远程服务

远程服务(默认端口号 10000)启动方式命令如下,“nohup…&” 是 Linux 命令,表示命令在后台运行。

nohup hive --service hiveserver2 &  //在Hive 0.11.0版本之后,提供了HiveServer2服务

Hive 远程服务通过 JDBC 等访问来连接 Hive ,这是程序员最需要的方式。

hive  --service hiveserver2 &   //默认端口10000
hive --service hiveserver2 --hiveconf hive.server2.thrift.port 10002 &  //可以通过命令行直接将端口号改为10002

hive的远程服务端口号也可以在hive-default.xml文件中配置,修改hive.server2.thrift.port对应的值即可。

< property>
    < name>hive.server2.thrift.port< /name>
    < value>10000< /value>
    < description>Port number of HiveServer2 Thrift interface when hive.server2.transport.mode is ‘binary‘.< /description>
< /property>

Hive 的 JDBC 连接和 MySQL 类似,如下所示。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class HiveJdbcClient {
    private static String driverName = "org.apache.hive.jdbc.HiveDriver";//hive驱动名称  hive0.11.0之后的版本
    //private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";//hive驱动名称  hive0.11.0之前的版本
    public static  void main(String[] args) throws SQLException {

        try{
            Class.forName(driverName);
        }catch(ClassNotFoundException e){
            e.printStackTrace();
            System.exit(1);
        }
        //第一个参数:jdbc:hive://djt11:10000/default  连接hive2服务的连接地址
        //第二个参数:hadoop  对HDFS有操作权限的用户
        //第三个参数:hive  用户密码  在非安全模式下,指定一个用户运行查询,忽略密码
        Connection con = DriverManager.getConnection("jdbc:hive://djt11:10000/default", "hadoop", "");
        System.out.print(con.getClientInfo());
    }
}
  • 元数据存储

      Hive 将元数据存储在 RDBMS 中,一般常用 MySQL 和 Derby。默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用, 为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持,配置一个独立的元数据库需要增加以下步骤。

1) 在线安装 mysql 数据库。

[[email protected]  app]# yum install mysql-server
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirrors.yun-idc.com
 * extras: mirrors.btte.net
 * updates: mirrors.163.com

2) 启动 mysql 服务。

[[email protected] app]# service mysqld start
Initializing MySQL database:  Installing MySQL system tables...
OK
Filling help tables...
OK
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

3) 设置 mysql 的 root 密码。

MySQL在刚刚被安装的时候,它的 root 用户是没有被设置密码的。首先来设置 MySQL 的 root 密码。

[[email protected]  app]# mysql -u root -p
Enter password:           //默认密码为空,输入后回车即可
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
mysql>set password for [email protected]=password(‘root‘); 密码设置为root

4) 为 Hive 建立相应的 Mysql 账户,并赋予足够的权限。

[[email protected]  app]# mysql -u root -p root
mysql>create user ‘hive‘ identified by ‘hive‘;   //创建一个账号:用户名为hive,密码为hive
mysql> grant all on *.* to ‘hive‘@‘djt11‘ identified by ‘hive‘;  //将权限授予host为djt11的hive用户
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

如果 hive 账户无法登陆。为[email protected] 设置密码。

[root@ywendeng ~]#mysql -u root -p root
mysql>set password for hive@djt11=password(‘hive‘);

5) 建立 Hive 专用的元数据库,记得用刚才创建的 “hive” 账号登录,命令如下。

[[email protected] ~]#mysql -u hive -p //用hive用户登录,密码hive
Enter password:
mysql> create database hive;   //创建数据库的名称为hive
Query OK, 1 row affected (0.00 sec)

6) 找到Hive安装目录 conf/下的 hive-site.xml文件,修改以下几个属性。

[[email protected] conf]$ vi hive-site.xml
< property>
    < name>javax.jdo.option.ConnectionDriverName< /name>
    < value>com.mysql.jdbc.Driver< /value>
    < description>Driver class name for a JDBC metastore< /description>
< /property>

< property>
    < name>javax.jdo.option.ConnectionURL< /name>
    < value>jdbc:mysql://djt11:3306/hive?characterEncoding=UTF-8< /value>
    < description>JDBC connect string for a JDBC metastore< /description>
< /property>

< property>
    < name>javax.jdo.option.ConnectionUserName< /name>
    < value>hive< /value>
    < description>Username to use against metastore database< /description>
< /property>

< property>
    < name>javax.jdo.option.ConnectionPassword< /name>
    < value>hive< /value>
    < description>password to use against metastore database< /description>
< /property>

如果conf/目录下没有 hive-site.xml文件,则需要拷贝一个名为hive-site.xml的文件。

[[email protected]  conf]$ cp hive-default.xml.template hive-site.xml 

7)将mysql-connector-java-5.1.21.jar驱动包,拷贝到 $HIVE_HOME/lib 目录下。可点击下载 mysql驱动包

[hadoop@ywendeng lib]#rz   //回车,选择已经下载好的mysql驱动包即可
[hadoop@ywendeng lib]$ ls
mysql-connector-java-5.1.21.jar

8) 启动 Hive Shell,测试运行。

[hadoop@ywendeng hive]$ hive
hive> show databases;

hive切换到mysql元数据库之后,hive启动时如果遇到以下错误:

Exception in thread "main"java.lang.RuntimeException: java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D

解决方案:

在hive 安装目录下,创建一个临时的IO文件iotmp

[hadoop@ywendeng hive]$ mkdir iotmp
[hadoop@ywendeng hive]$ ls
bin   derby.log  hcatalog  lib      metastore_db  README.txt         scripts
conf  examples   iotmp     LICENSE  NOTICE        RELEASE_NOTES.txt

然后将路径配置到hive-site.xml文件的以下参数中:

[[email protected] conf]$ vi hive-site.xml
< property>
    < name>hive.querylog.location< /name>
    < value>/home/hadoop/app/hive/iotmp< /value>
    < description>Location of Hive run time structured log file< /description>
< /property>

< property>
    < name>hive.exec.local.scratchdir< /name>
    < value>/home/hadoop/app/hive/iotmp< /value>
    < description>Local scratch space for Hive jobs< /description>
< /property>

< property>
    < name>hive.downloaded.resources.dir< /name>
    < value>/home/hadoop/app/hive/iotmp< /value>
    < description>Temporary local directory for added resources in the remote file system.< /description>
< /property>

保存,重启hive即可。

[hadoop@ywendeng  hive]$ hive
hive> show databases;
OK
default
Time taken: 3.684 seconds, Fetched: 1 row(s)
hive>
  • 解释器、编译器、优化器。

      Driver 调用解释器(Compiler)处理 HiveQL 字串,这些字串可能是一条 DDL、DML或查询语句。编译器将字符串转化为策略(plan)。策略仅由元数据操作 和 HDFS 操作组成,元数据操作只包含 DDL 语句,HDFS 操作只包含 LOAD 语句。对插入和查询而言,策略由 MapReduce 任务中的具有方向的非循环图(directedacyclic graph,DAG)组成,具体流程如下。

1)解析器(parser):将查询字符串转化为解析树表达式。

2)语义分析器(semantic analyzer):将解析树表达式转换为基于块(block-based)的内部查询表达式,将输入表的模式(schema)信息从 metastore 中进行恢复。用这些信息验证列名, 展开 SELECT * 以及类型检查(固定类型转换也包含在此检查中)。

3)逻辑策略生成器(logical plan generator):将内部查询表达式转换为逻辑策略,这些策略由逻辑操作树组成。

4)优化器(optimizer):通过逻辑策略构造多途径并以不同方式重写。优化器的功能如下。

将多 multiple join 合并为一个 multi-way join;

对join、group-by 和自定义的 map-reduce 操作重新进行划分;

消减不必要的列;

在表扫描操作中推行使用断言(predicate);

对于已分区的表,消减不必要的分区;

在抽样(sampling)查询中,消减不必要的桶。

此外,优化器还能增加局部聚合操作用于处理大分组聚合(grouped aggregations)和 增加再分区操作用于处理不对称(skew)的分组聚合。

  • Hive 文件格式

    hive文件存储格式包括以下几类:

1、TEXTFILE

2、SEQUENCEFILE

3、RCFILE

4、ORCFILE(0.11以后出现)

   其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。

   SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。

1、TEXTFILE 格式

   默认格式,数据不做压缩,磁盘开销大,数据解析开销大。 可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分, 从而无法对数据进行并行操作。

示例:

create table if not exists textfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by ‘\t‘
stored as textfile;
插入数据操作:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
insert overwrite table textfile_table select * from textfile_table; 

2、SEQUENCEFILE 格式

   SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。 SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。

示例:

create table if not exists seqfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by ‘\t‘
stored as sequencefile;
插入数据操作:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
SET mapred.output.compression.type=BLOCK;
insert overwrite table seqfile_table select * from textfile_table;  

3、RCFILE 文件格式

   RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。

RCFILE文件示例:

create table if not exists rcfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by ‘\t‘
stored as rcfile;
插入数据操作:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
insert overwrite table rcfile_table select * from textfile_table;

总结: 相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。

三 、Hive 安装步骤

Hive 安装依赖 Hadoop 的集群,它是运行在 Hadoop 的基础上。 所以在安装 Hive 之前,保证 Hadoop 集群能够成功运行。Hive的安装详细流程如下所示。

1、 下载Hive

Hive是Apache 的一个顶级开源项目,我们可以直接到官网下载需要的版本即可。官网下载地址:http://mirrors.cnnic.cn/apache/hive/

2、把Hive安装包apache-hive-1.0.0-bin.tar.gz移动到/home/hadoop/app/目录下并解压,然后将文件名称改为 hive。

[[email protected] app]$ tar -zxvf apache-hive-1.0.0-bin.tar.gz

[[email protected] app]$ mv apache-hive-1.0.0-bin hive

3、 添加hive环境变量

在/etc/profile文件中增加如下内容:

[root@ywendeng ~]$ vi /etc/profile
HIVE_HOME=/home/hadoop/app/hive
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HIVE_HOME/bin:$PATH
export HIVE_HOME

保存退出后,通过source命令使配置文件生效

[root@ywendeng ~]$ source /etc/profile

4、 启动 Hive

此时切换用户至 hadoop 用户,在命令行输入“hive”命令进行测试。

[[email protected] ywendeng ]$ hive

hive>

1) 测试 Hive 是否安装成功。

hive> show tables;
OK
Time taken: 0.043 seconds

2) 创建表。

hive> create table test_table (id int ,name string,no int);
OK
Time taken: 0.5 seconds

3) 查询表。

hive> select * from test_table;
OK
Time taken: 0.953 seconds

如果创建表和查询表操作没有出错,就说明 Hive 安装成功。

时间: 2024-08-10 23:30:33

详解Hive的架构及安装步骤的相关文章

详解Hive的架构、工作原理及安装步骤

一.Hive是什么? Hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop 分布式文件系统中的数据, 可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运行,通过自己的 SQL 去 查询分析需要的内容,这套 SQL 简称 Hive SQL. 二.理解Hive 架构 Hive 架构可以分为四部分. 用户接口 Hive 对外提供了三种服务模式,即 Hive

详解Sqoop的架构和安装部署

一.Sqoop是什么 Sqoop 是连接传统关系型数据库和 Hadoop 的桥梁.它包括以下两个方面: 1. 将关系型数据库的数据导入到 Hadoop 及其相关的系统中,如 Hive和HBase. 2. 将数据从 Hadoop 系统里抽取并导出到关系型数据库. Sqoop 的核心设计思想是利用 MapReduce 加快数据传输速度.也就是说 Sqoop 的导入和导出功能是通过 MapReduce 作业实现的.所以它是一种批处理方式进行数据传输,难以实现实时的数据进行导入和导出. 二.为什么选择S

详解LAMP源码编译安装

实战:LAMP源码编译安装 家住海边喜欢浪:zhang789.blog.51cto.com 目录 详解LAMP源码编译安装 LAMP简介 一.准备工作 二.编译安装 Apache 三.编译安装 MySQL 四.编译安装 PHP 测试LAMP搭建开源数据web管理程序phpMyadmin 详解LAMP源码编译安装 LAMP简介 LAMP是当下非常流行的一套Web架构,我们可以在GNU/Linux下通过其他人打包的程序包来进行安装; 但是在生产环境中,很多时候都需要我们自己定制安装AMP,编译安装L

详解VMware 9.0.1安装MAC OS X 10.8(历时近3日感想篇)

突然心血来潮,想用VMware 9.0.1安装MAC OS X,但网上的文章多多少少总有点缺陷,不能适合每一个人,在综合了近30篇安装MAC OS X的文章后,我决定发布一篇比较大众化,比较详尽的MAC OS X安装过程. 一.准备工作: (1)虚拟机系统:vmware workstation 9,(或vmware player),请自行在网上下载. (2)vmware的MAC补丁包.如果你使用的是vmware10,请下载补丁包V1.20,如果是vmware8或9,请下载补丁包V1.10. (3

CentOs之yum详解及程序的编译安装

CentOs之yum详解 yum的地位:yum是rpm的前端管理工具,而且依赖于rpm.  yum仓库:yum repository,仓库里存储了众多rpm包,以及包的相关的元数据文件.yum仓库里会有个repodata目录存在. yum支持的文件服务器类型: ftp://  http:// file:///(本地服务器,例光盘)   /nfs:// 查看yum的信息: [[email protected]]# rpm -q yum ------查看yum命令的安装包是哪个 yum-3.4.3-

【Git使用详解】Egit插件的安装图解

Egit插件安装主要有在线和离线两种方式,下面就分别讲解一下两种方式的具体步骤. 一.在线安装 1.打开Eclipse的Help>Install New SoftWare 如图: 2.在弹出的界面中的Work with:中输入如下网址:http://download.eclipse.org/egit/updates然后等待资源的加载. 在加载出的软件列表中选择Eclipse Git Team Provider. 如图: 3.然后Next>Finish. 如图:   4.等待插件安装完成,重启E

详解“FTP文件传输服务”安装配置实例

"FTP文件传输服务"安装配置实例 家住海边喜欢浪:zhang789.blog.51cto.com 目录 简介 ftp工作原理 常见的FTP服务 Vsftpd服务器的安装 Vsftpd.conf配置文件详解 配置FTP服务器实例 实例:配置匿名用户 实例:配置本地用户登录 实例:配置虚拟用户登录(MySQL认证) 实例:控制用户登录 实例:设置欢迎信息 分析vsftpd日志管理 FTP服务器配置与管理 简介 FTP 是File Transfer Protocol(文件传输协议)的英文简

刨根问底:详解Hadoop核心架构(转载)

通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS.MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心. 通过这一阶段的调研总结,从内部机理的角度详细分析,HDFS.MapReduce.Hbase.Hive是如何运行,以及基于Hadoop数据仓库的构建和分布式数据库内部具体实现.如有不足,后续及时修改. HDFS的体系架构 整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持,并通过M

ansible深入理解和操作——03(roles详解+搭建LAMP架构)

ansible roles 在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高.playbook长而维护成本大.灵活性低等一系列的问题.使用roles能巧妙的解决这一系列的问题.roles是ansible1.2版本后加入的新功能,适合于大项目playbook的编排架构. ansible roles目录结构 roles能够根据层次型结构自动装载变量文件.task以及handlers等.简单来讲,roles就是通过分别将变量.文