Hive安装及使用

本文是学习时的自我总结,用于日后温习。如有错误还望谅解,不吝赐教

 

一、安装方式(内嵌模式,本地模式远程模式)

安装环境以及前提说明:

    Hive是依赖于hadoop系统的,因此在运行Hive之前需要保证已经搭建好hadoop集群环境。

本例中使用的hadoop版本为2.6.1,Hive版本为2.1.1版。

1.Hive的3种安装方式:

    1)内嵌模式(元数据保存在内嵌的derby种,允许一个会话链接,尝试多个会话链接时会报错)

    2)本地模式(本地安装mysql 替代derby存储元数据)

    3)远程模式(远程安装mysql 替代derby存储元数据)

 

2.内嵌模式参数:

    <name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:derby:;databaseName=/usr/local/hive/bin/metastore_db;create=true</value>

    描述了hive元数据存储的位置

 

3.Mysql的几个操作

    1)查询平台本身的Mysql版本和安装的MySQL是否是同一个版本,不一致要删除旧的数据库

    2)安装缺少的两个rpm包:libaio 和 perl。联外网(虚拟机要桥接到外网,配置外网后如果ping IP可行,ping域名不行,则需要把ifcfg-eth0复制一份拷贝到dns中)或下载后拷贝到服务器

    3)按项目规模选择合适的配置文件

      ①my-small.cnf是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。

      ②my-medium.cnf是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。

      ③my-large.cnf是为专用于一个SQL数据库的计算机而设计的。由于它可以为该数据库使用多达512MB的内存,所以在这种类型的系统上将需要至少1GB的RAM,以便它能够同时处理操作系统与数据库应用程序。

      ④my-huge.cnf是为企业中的数据库而设计的。这样的数据库要求专用服务器和1GB或1GB以上的RAM。

    这些选择高度依赖于内存的数量、计算机的运算速度、数据库的细节大小、访问数据库的用户数量以及在数据库中装入并访问数据的用户数量。随着数据库和用户的不断增加,数据库的性能可能会发生变化。

    4)考虑安全问题要对root用户设置密码并删除空用户;创建一个普通用户,并给普通用户赋予localhost和%(远程)的权限;为普通用户创建一个数据库

    5)查看权限和更新权限

        SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;

        UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='hive';

    6)初始化MySQL数据库

        schematool -dbType mysql -initSchema

 

4.本地模式参数

    1)<name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true</value>

    为Hive创建的访问MySQL的用户的库空间

    2)<name>javax.jdo.option.ConnectionDriverName</name>

    <value>com.mysql.jdbc.Driver</value>

    MySQL的JDBC驱动(需要把mysql的驱动包放到目录 <HIVE_HOME>/lib 中)

    3)<name>javax.jdo.option.ConnectionUserName</name>

    <value>hive</value>

    为Hive创建的访问MySQL的用户

 

5.远程模式需要配置那些文件

    1)配置环境变量:/.bashrc

    2)配置Hadoop和Hive的路径:hive-env.sh

    3)hive-default.xml.template --> hive-site.xml

    4) hive.server2.thrift.port– TCP 的监听端口,默认为10000。 

   hive.server2.thrift.bind.host– TCP绑定的主机,默认为localhost

    5)启动

  hive --service metastore &

        hive --service hiveserver2 &

 

二、Hive

1. 什么是Hive

是建立在Hadoop基础上的数据仓库基础架构。可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为QL,类似于SQL语句。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的mapper和reducer来处理内建的mapper和 reducer 无法完成的复杂的分析工作。

Hive 是 SQL解析引擎,它将SQL语句转译成Map/Reduce Job然后在Hadoop执行

Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在Map/Reduce Job里使用这些数据。

2. Hive实现WordCount

  1. 创建一个数据库,如create database word;
  2. 建表

create external table word_data(line string) row format delimited fields terminated by '\n' stored as textfile location '/home/hadoop/worddata';

  1. 根据MapReduce的规则,我们需要进行拆分,把每行数据拆分成单词,这里需要用到一个hive的内置表生成函数(UDTF):explode(array),参数是array,其实就是行变多列:
    create table words(word string);
    insert into table words select explode(split(line, " ")) as word from word_data;
    split是拆分函数,跟java的split功能一样,这里是按照空格拆分,所以执行完hql语句,words表里面就全部保存的单个单词
  2. 这样基本实现了,因为hql可以group by,所以最后统计语句为:
    select word, count(*) from word.words group by word;
    注释:word.words 库名称.表名称,group by word这个word是create table words(word string) 命令创建的word string

 

3.Java连接Hive查询表信息

public class HiveTest {

    private static String driverName = "org.apache.hive.jdbc.HiveDriver";

    private static ResultSet res;

    public static void main(String[] args) throws Exception {

        Class.forName(driverName);//加载驱动

        Connection conn = DriverManager.getConnection(

                "jdbc:hive2://192.168.111.219:10000/default", "hive", "123456");//建立连接

        Statement stmt = conn.createStatement();//声明

        res = stmt.executeQuery("select * from userinfo");//用声明stmt对象下的executeQuery方法查询

        while (res.next()) {

            System.out.println(res.getInt(1) + "\t" + res.getString(2));

        }

        res.close();

        stmt.close();

        conn.close();

    }

}

4.Hive支持的数据类型

    1)基本数据类型:数值类型、布尔型和字符串(TIMESTAMP、BINARY)

        TINYINT 1字节 有符号整数

        SMALLINT2字节 有符号整数

        INT 4字节 有符号整数

        BIGINT  8字节 有符号整数

        FLOAT   4字节 单精度浮点数

        DOUBLE  8字节 双精度浮点数

    2)复杂数据类型:ARRAY、MAP 和 STRUCT

 

5.Hive的数据类型转换

    1)隐式类型转换的规则:

    任何整数类型可以隐式地转换为一个范围更广的类型。

    所有整数类型、FLOAT 和 STRING 类型都能隐式转换为 DOUBLE。

    TINYINT、SMALLINT 和 INT 都可以转换为 FLOAT。

    BOOLEAN 类型不能转换为其他任何类型。

    TIMESTAMP 可以被隐式转换为 STRING。

    2)显示数据类型转换(CAST)

    例如,CAST(‘1’ AS INT)  把字符串’1’转换成整数值 1。

 

6.内表和外表

EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)。

Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

 

11.Hive的三种启动方式

1)   hive  命令行模式

进入hive安装目录,输入bin/hive的执行程序,或者输入 hive –service cli

用于linux平台命令行查询,查询语句基本跟mysql查询语句类似

2)   hive  web界面的启动方式

bin/hive –service hwi  (& 表示后台运行)

用于通过浏览器来访问hive,感觉没多大用途,浏览器访问地址是:127.0.0.1:9999/hwi

3)   hive  远程服务 (端口号10000) 启动方式

   bin/hive –service hiveserver2  &(&表示后台运行)

用java,python等程序实现通过jdbc等驱动的访问hive就用这种起动方式了,这个是程序员最需要的方式

 

二、数据库

1.hive会为每个数据库创建一个目录。数据是库中的表将会以这个数据库目录的子目录形式存储。

有一个例外就是default数据中的表,因为这个数据库本身没有自己的目录。

数据库所有的目录位于属性hive.metastore.warehouse.dir所指定的顶层目录之后。

用户可以通过如下命令来修改这个默认的位置

create database financials location '/my/preferred/directory';

  1. 建立数据库:create database if not exists financials;
  2. 显示Hive中所包含的数据库:show databases;
  3. 使用正则表达式匹配来筛选出需要的数据库名:show databases like 'h.*';
  4. 为数据库增加一个描述信息并查看:create database financials comment 'Holds all financial tables';   describe database financials
  5. 切换数据库:use financials
  6. 显示当前数据库:set hive.cli.print.current.db=true
  7. 删除数据库:drop database if exists financials(库中没有表);   drop database if exists financials CASCADE;(库中有标强删)
  8. 用root登陆Mysql,给用户添加CREATE,DROP权限:

    GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON hive.* TO hive@'%' identified by '123456';

    FLUSH PRIVILEGES;

 

 

三、数据类型举例

1、建表命令

CREATE TABLE employee(

name STRING,

salary FLOAT,

subordinates ARRAY<STRING>,

deductions MAP<STRING,FLOAT>,

address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>)

row format delimited fields terminated by '\001'

collection items terminated by '\002'

MAP KEYS terminated by '\003'

LINES terminated by '\n'

stored as textfile;

2、查看表结构:describe employee;

3、导数据:load data local inpath '/root/employees.txt' into table employee;

4、查询表内容

SELECT * FROM employee;

SELECT name ,salary FROM employee;

SELECT name , subordinates[0] FROM employee;

SELECT name , deductions["State Taxes"] FROM employee;

SELECT name , address.city FROM employee;

 

 

四、建表方式

1.直接建立表

2.指定表空间建立表

CREATE TABLE mydb.employee(

name STRING,

subordinates ARRAY<STRING>)

row format delimited fields terminated by '\001'

collection items terminated by '\002'

LINES terminated by '\n'

stored as textfile;

3.复制表结构建立新表(LIKE)

CREATE TABLE IF NOT EXISTS copy_employee LIKE employee;

4.复制指定表字段结构及数据并建立表(AS SELECT)

CREATE TABLE copy_part_employee AS SELECT name,subordinates from employee;

 

 

五、加载数据

1.从本地加载数据到表中:load data local inpath '/root/employees.txt' into table employee;

从HDFS中加载数据到表中:load data inpath '/test/employees.txt' OVERWRITE into table employee;

2.从原有的表employee中追加数据到表copy_employee:

insert INTO table copy_employee select * from employee

从原有的表employee中加载数据到表copy_employee,并替换掉原来的数据

insert OVERWRITE table copy_employee select * from employee;

3.创建表的时候通过select加载数据:

create table cr_employee as SELECT * from employee;

创建表的时候通过select 指定建立的字段并加载指定字段的数据

create table cr_employee1 as SELECT name from employee;

4.直接把与表结构相符的数据文件复制到表指定的存储位置

dfs -put /root/employees.txt /user/hive/warehouse/employee;

 

六、表操作

1.表重命名(RENAME TO):ALTER TABLE employee RENAME TO rm_emp;

2.修改列信息(CHANGE COLUMN对某个字段进行重命名,并修改其位置、类型或者注释):

ALTER TABLE employee CHANGE COLUMN

name rename STRING COMMENT 'The people name';

3.增加列(ADD COLUMNS在表的最后添加字段)

ALTER TABLE employee ADD COLUMNS(

addcol1 STRING COMMENT  'Application name',

addclo2 INT COMMENT 'The current session id');

4.删除列或者替换列(REPLACE COLUMNS替换原来所有的字段)

ALTER TABLE employee REPLACE COLUMNS(

rename  STRING  COMMENT  'name to rename',

resalary  FLOAT COMMENT  'salary to resalary',

resub  ARRAY<STRING> COMMENT  'subordinates to resub');

 

八、分区和分桶、视图

1. 分区:

  所谓分区(Partition) 对应于数据库的 Partition 列的密集索引。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中

  有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。

  分区表指的是在创建表时指定的partition的分区空间。一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。

  分区是以字段的形式在表结构中存在,通过describetable命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列)

2. 分桶

  桶是更为细粒度的数据范围划分。

  Hive采用对 列值哈希 除以 桶的个数 求余 的方式决定该条记录存放在哪个桶当中

  优点:获得更高的查询处理效率;使取样(sampling)更高效。

3. 视图

  和关系数据库中的视图一个概念,可以向用户集中展现一些数据,屏蔽一些数据,提高数据库的安全性。

 

九、Hive中order by、sort by、distribute by、cluster by的区别

order by对输入做全局排序,只有一个reducer(多个reducer无法进行全局),输入规模较大时,需要较长的计算时间。与数据库的区别在于必须指定limit,因为数据量大时也只在一台服务器上,会出现无法输出结果的情况,进行limit,就只有n*map number条记录,一个reduce也可以处理

sort by在数据进入reducer前排序,sort by只保证同一reduce中的数据可以按指定字段排序

distribute by按照指定的字段对数据进行划分到不同的输出reduce/文件中

cluster by具有distribute by和sort by的功能,但是排序只能是倒排

 

十、Hive在建表时,可以通过'STORED AS FILE_FORMAT' 指定存储文件格式。有以下几种:

  1. TextFile:存储空间较大,压缩之后的文件不能分割与合并,查询效率低;可直接存储,加载速度最快;这种是默认的格式。
  2. SequenceFile:hadoop API提供的一种二进制文件支持,存储空间最大,可分割与合并,查询效率高,需要text文件转换来加载
  3. RcFile:是一种行列存储相结合的存储方式。

    1)将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block;

    2)块数据列式存储,有利于数据压缩和快速的列存取。查询效率最高、存储空间最小、但加载最慢。

 

 

十一、Sqoop = Sql to Hadoop

  1. Sqoop的作用:允许用户将数据从结构化存储器抽取到Hadoop 中,用于如MapReduce、Hive的进一步的处理。Sqoop可以将这些结果导回数据存储器,供其他客户端使用。
  2. Sqoop import命令参数的含义

    sqoop import

    --connect jdbc:mysql://localhost/hadoopguide    #jdbc连接字符串

    --table widgets     #读取的表名

    -m 1 map    #任务的个数

    --target-dir /widgets   #hdfs目标路径

  3.  Sqoop导出命令的含义

     sqoop export --connect jdbc:mysql://localhost/hadoopguide -m 1 --table sales_by_zip --export-dir /user/hive/warehouse/zip_profits --input-fields-terminated-by '\0001'

    --connect mysql连接字符串

    -m mapreduce的个数

    --table 表明

    --export-dir 导出路径

    --input-fields-terminated-by 输入字段的分割字符

 

posted @ 2017-12-18 08:38  mflood  阅读(8717)  评论(0编辑  收藏  举报