hive简介--初学者最好看一下

hive简介

Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上。

Hive并不是一个完整的数据库, Hadoop以及HDFS的设计本身约束和局限性地限制了Hive所能胜任的工作。其中最大的限制就是Hive不支持记录级别的更新、插入或者删除操作。

同时hive用户可以通过查询生成新表或者将查询结果导人到文件中。因为Hadoop是一个面向批处理的系统,而MapReduce任务的启动过程需要消耗较长的时间,所以Hive查询延时比较严重。传统数据库中在秒级别可以完成的查询,在Hive中,即使数据集相对较小,往往也需要执行更长的时间。

由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在 Online 的应用中,而Hive 是为数据仓库而设计的它能够将结构化的文件映射为一张数据表,并能提供SQL查询功能,即将SQL语言转化为MapReduce任务进行运行。

hive与传统结构化查询语言对比

 

HiveQL

SQL(结构化查询语言)

ANSI SQL

不完全支持

支持

更新

insert OVERWRITE\INTO TABLE

UPDATE\INSERT\DELETE

事务

不支持

支持

模式

读模式

写模式

数据保存

HDFS

块设备、本地文件系统

延时

多表插入

支持

不支持

子查询

完全支持

只能用在From子句中

视图

Read-only

Updatable

可扩展性

数据规模

Hive在Hadoop生态系统所处位置

1.环境准备

本次教学基于centos 7.1系统

本次平台搭建需要三台云主机:

master作为 client 客户端

slave1作为 hive server 服务器端

slave2用于安装 mysql server

同时需要软件包:

apache-hive-2.1.1-bin.tar.gz

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/

mysql-connector-java-5.1.5-bin.jar

下载地址:https://dev.mysql.com/downloads/connector/j/

需要将apache-hive-2.1.1-bin.tar.gz上传到master 节点

2.搭建开始

slave2节点执行:

2.1 安装 EPEL 源:

yum -y install epel-release

2.2 安装 MySQL server 包,下载源安装包:

wget  http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

注意如果报错没找到命令就先安装wget命令

2.3安装源:

rpm -ivh mysql57-community-release-el7-8.noarch.rpm

查看是否安装成功:cd /etc/yum.repos.d

目录下会有Centos-Vault.repo  epel-testing.repo  mysql-community-source.repo

epel.repo  mysql-community.repo

2.4启动mysql

重载所有修改过的配置文件:systemctl daemon-reload

开启服务:systemctl start mysqld

开机自启:systemctl enable mysqld

获取初密码:grep password  /var/log/mysqld.log

登陆 MySQL:mysql -uroot -p

2.5更改数据库安全策略

设置密码强度为低级:set global validate_password_policy= 0;

设置密码长度:set global validate_password_length=4;

修改本地密码:alter user 'root'@'localhost' identified by '123456';

退出:exit

ps:密码强度分级如下: 0 low 级别,只检查长度; 1 medium 级别(默认),符合长度为 8,且必须含有数字,大小写,特殊 字符; 2 strong 级别,密码难度更大一些,需要包括字典文件。 密码长度最低长为 4,当设置长度为 123 时,其长度依然为 4

2.6 设置远程登录

以新密码登陆 MySQL:mysql -uroot -p123456

创建用户:create user 'root'@'%' identified by '123456';

允许远程连接:grant all privileges on *.* to 'root'@'%' with grant option;

刷新权限:flush privileges;

2.7Slave1 上安装 hive

master 中操作如下:

mkdir -p /usr/hive

tar -zxvf /opt/soft/apache-hive-2.1.1-bin.tar.gz -C /usr/hive/

然后再slave1节点也创建hive文件夹

scp -r /usr/hive/apache-hive-2.1.1-bin root@slave1:/usr/hive/

2.8修改环境变量

修改/etc/profile 文件设置 hive 环境变量。(master 和 slave1 都执 )。

vi /etc/profile

export HIVE_HOME=/usr/hive/apache-hive-2.1.1-bin

export PATH=$PATH:$HIVE_HOME/bin

验证环境变量

source /etc/profile

2.9修改配置文件

将上传到lib的mysql-connector-java-5.1.5-bin.jar分发到slave1

scp /lib/mysql-connector-java-5.1.5-bin.jar

root@slave1:/usr/hive/apache-hive-2.1.1-bin/lib

然后修改slave1 的配置文件hive-env.sh(在/usr/hive/apache-hive-2.1.1-bin/conf文件)

生成配置文件 

cp hive-env.sh.template hive-env.sh

 在配置文件添加:

HADOOP_HOME=/usr/hadoop/hadoop-2.7.3(根据自己设置来)

创建hive-site.xml文件

[root@slave1 conf]# vi hive-site.xml

<configuration>

        <property>

                <name>hive.metastore.warehouse.dir</name>

                <value>/user/hive_remote/warehouse</value>

        </property>

        <property>

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

                <value>jdbc:mysql://slave2: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>

        <property>

                <name>hive.metastore.schema.verification</name>

                <value>false</value>

        </property>

        <property>

                <name>datanucleus.schema.autoCreateAll</name>

                <value>true</value>

        </property>

master节点配置客户端

由于客户端需要和 Hadoop 通信,所以需要更改 Hadoop 中 jline 的版本。即 保留一个高版本的 jline jar 包,从 hive 的 lib 包中拷贝到 Hadoop 中 lib 位置为/usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib。

cp /usr/hive/apache-hive-2.1.1-bin/lib/jline-2.12.jar  /usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/

同样修改 hive-env.sh

[root@master conf]# vi hive-site.xml

<configuration>

        <property>

                <name>hive.metastore.warehouse.dir</name>

                <value>/user/hive_remote/warehouse</value>

        </property>

        <property>

                <name>hive.metastore.local</name>

                <value>false</value>

        </property>

        <property>

                <name>hive.metastore.uris</name>

                <value>thrift://slave1:9083</value>

        </property>

</configuration>

3.启动hive

在slave1节点输入bin/hive(在/usr/hive/apache-hive-2.1.1-bin输入)

同样在master输入  bin/hive

成功进入hive它会显示 hive>

在hive内输入: hive>show databases;

查看是否返回数据库列表,返回则成功。

同时输入jps查看进程会显示RunJar

4.命令解析

查询类

show databases; //查看某个数据库

use 数据库; //进入某个数据库

show 表名; //展示所有表

desc 表名; // 显示表结构

show partitions 表名; //显示表名的分区

show create 表名; //显示创建表的结构

 

# 创建内部表

create table 表名; //创建一个表

例如:create table user;

 

create table 表名 like 表名; //创建一个表,结构与xxx一样

例如:create table AAA like BBB;  //创建一个AAA,结构与BBB一样

 

# 创建外部表

create external table表名 ; //创建外部一个表,

例如:create external table user;

 

# 内外部表转化

alter table 表名 set TBLPROPROTIES ('EXTERNAL'='TRUE'); //内部表转外部表

例如:alter table user set TBLPROPROTIES ('EXTERNAL'='TRUE');

alter table 表名 set TBLPROPROTIES ('EXTERNAL'='FALSE'); //外部表转内部表

例如:alter table user set TBLPROPROTIES ('EXTERNAL'='FALSE');

 

# 表结构修改

alter table 表名 rename to 新表名; //重命名表

例如:alter table user rename to demo; //将user表重命名为demo

alter table 表名 add columns (newcol1 int comment ‘新增’);// 修改字段

例如:alter table table_name add columns (newcol1 int comment ‘新增’);

alter table 表名 replace columns (col1 int,col2 string,col3 string);// 删除表

例如:alter table table_name change col_name new_col_name new_type;

drop table 表名;//删除分区

例如:drop table table_name;

 

5.hive实例讲解

1.启动Hive并通过Hive查看hadoop所有文件路径。

[root@master ~]# hive

hive> dfs -ls;

Found 1 items

drwxr-xr-x   - root hdfs          0 2019-04-07 23:14 .hiveJars

 

2. 使用Hive工具来创建数据表bigdata,将zhangjing.txt导入到该表中,其中bigdatae表的数据结构如下表所示。导入完成后,通过hive查询数据表bigdata中数据在HDFS所处的文件位置列表信息,将以上操作命令(相关数据库命令语言请全部使用小写格式)和输出结果以文本形式提交到答题框。

stname(string)

stID(int)

class(string)

opt_cour(string)

create table bigdatae (stname string,stID int,class string,opt_cour string)row format delimited fields terminated by '\t';

load data local inpath '/root/fujian/Hive/zhangjing.txt' into table bigdatae;

show create table bigdatae;

简述Hive和数据库的异同

 

1.查询语言。由于 SQL 被广泛的应用在数据仓库中,因此专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。

 

2.数据存储位置。Hive是建立在Hadoop之上的,所有Hive的数据都是存储在HDFS中的。而数据库则可以将数据保存在块设备或者本地文件系统中。

 

3.数据格式。Hive中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive中默认有三个文件格式TextFile,SequenceFile以及RCFile)。由于在加载数据的过程中,不需要从用户数据格式到Hive定义的数据格式的转换,因此,Hive在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的HDFS目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。

 

4.数据更新。由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERT INTO ... VALUES添加数据,使用UPDATE ... SET修改数据。

 

5.索引。之前已经说过,Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于MapReduce的引入, Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了Hive不适合在线数据查询。

6.执行。Hive中大多数查询的执行是通过Hadoop提供的MapReduce来实现的(类似select * from tbl的查询不需要MapReduce)。而数据库通常有自己的执行引擎。

7.执行延迟。之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致Hive执行延迟高的因素是MapReduce框架。由于MapReduce本身具有较高的延迟,因此在利用MapReduce执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

 

8.可扩展性。由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的。而数据库由于ACID语义的严格限制,扩展行非常有限。

 

9.数据规模。由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值