hadoop离线分析(简单版)-Hive

23 篇文章 0 订阅
22 篇文章 0 订阅

目录

 

Hive概述

Hive架构

Hive运行机制

Hive安装配置


Hive概述

基于Hbase的高层语言。类似于SQL --- 访问和处理关系型数据库的计算机语言。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件(例如xml)映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

Apache Hive™ 数据仓库软件为分布式存储的大数据集上的读、写、管理提供很大方便,同时还可以用SQL语法在大数据集上查询。Hive是一种以SQL风格进行任何大小数据分析的工具,其特点是采取类似关系数据库的SQL命令。其特点是通过 SQL处理Hadoop的大数据,数据规模可以伸缩扩展到100PB+,数据形式可以是结构或非结构数据。

Hive特点:

通过SQL轻松访问数据的工具,从而使数据仓库任务,如提取/转换/加载(ETL),报告和数据分析变得可行。
一种对各种数据格式结构化的机制。
访问直接存储或在Apache HDFS™的文件,或其他数据存储系统的文件如Apache HBase™
通过Apache TEZ™,Apache Spark™™,或MapReduce采用HPL-SQL执行查询。
通过Apache YARN和Apache Slider实现亚秒级的查询检索。
可扩展:Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
容错:良好的容错性,节点出现问题SQL仍可完成执行。

Hive供标准SQL功能,包括许多后来的SQL:2003和SQL:2011分析功能。    
Hive的SQL也可以通过用户自定义函数(UDF)、用户自定义聚合(UDAFs),和用户定义的表的功能(UDTFs))进行扩展。这并不是说有一种HIVE格式,用来存储数据。Hive带有内置的连接器,可以连接逗号、制表符 分隔的文件(CSV/TSV),Apache Parquet™格式文件, Apache ORC™格式文件, 以及其它格式的文件。

用户可以用连接器扩展到其它格式,详细信息请参考开发者指南中的文件格式章节, Hive SerDe 章节。
Hive并不是为联机事务处理(OLTP)设计的,它最适用于传统的数据仓库任务。
Hive设计时考虑了最大限度的提高可测量性(扩展了更多的机器动态添加到Hadoop集群)、性能、可扩展性,容错和弱耦合其输入格式。

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

Hive的组件包括Hcatalog和WebHcat:    
    HCatalog是Hive的一部分。它是一个Hadoop的表和存储管理层,使用户能够使用不同的数据处理工具-包
    括 Pig 和 MapReduce , 更容易地读取和写入网格上的数据。
    WebHcat提供了一个服务,使用户可以运行Hadoop MapReduce(或者YARN), Pig,Hive作业,也可以采用
    HTTP(REST类型)接口执行Hive元数据。

Hive与传统关系数据库比较有如下几个特点:        
    1.侧重于分析,而非实时在线交易    
    2.无事务机制    
    3.不像关系数据库那样可以随机进行 insert或update.     
    4.通过Hadoop的map/reduce进行分布式处理,传统数据库则没有    
    5.传统关系数据库只能拓展最多20个服务器,而Hive可以拓展到上百个服务器。    
    6.Hive和关系型数据库存储文件的系统不同,Hive使用的是Hdoop的HDFS,关系型数据库则是服务器本地的文件系统    
    7.关系型数据库都是为实时查询的业务进行设计的,而Hive则是为海量数据做数据挖掘设计的,实时性很差    
    实时性的区别导致Hive的应用场景和关系型数据库又很大不同    
    8.Hive很容易扩展自己的存储能力和计算能力,这个是继承Hadoop的,而关系数据库再这方面比Hive差很多

为什么使用Hive??    
    1)操作接口采用类SQL语法,提供快速开发的能力。
    2)避免了去写MapReduce,减少开发人员的学习成本。Hive可以认为是MapReduce的一个封装、包装。
    Hive的意义就是在业务分析中将用户容易编写、会写的Sql语言转换为复杂难写的MapReduce程序,从而大大降低了Hadoop学习的门槛,让更多的用户可以利用Hadoop进行数据挖掘分析。
    3)扩展功能很方便。

Hive架构

为了让大家容易理解Hive的实质——-“Hive就是一个SQL解析引擎,将SQL语句转化为相应的MapReduce程序”这句话用一个图示进行示例:

 从图示可以看出,Hive从某种程度上讲就是很多“SQL—MapReduce”框架的一个封装,可以将用户编写的Sql语言解析成对应的MapReduce程序,最终通过MapReduce运算框架形成运算结果提交给Client。

Hive体系结构的介绍:

Hive的体系结构可以分为以下几个部分:    
①用户接口:包括shell命令、Jdbc/Odbc和WebUi,其中最常用的是shell这个客户端方式对Hive进行相应操作。    
②Hive解析器(驱动Driver):Hive解析器的核心功能就是根据用户编写的Sql语法匹配出相应的MapReduce模板,形成对应的MapReduce job进行执行。     
③Hive元数据库(MetaStore):Hive将表中的元数据信息存储在数据库中,如derby(自带的)、Mysql(实际工作中配置的),Hive中的元数据信息包括表的名字、表的列和分区、表的属性(是否为外部表等)、表的数据所在的目录等。Hive中的解析器在运行的时候会读取元数据库MetaStore中的相关信息。 在这里和大家说一下为什么我们在实际业务当中不用Hive自带的数据库derby,而要重新为其配置一个新的数据库Mysql是因为derby这个数据库具有很大的局限性:derby这个数据库不允许用户打开多个客户端对其进行共享操作,只能有一个客户端打开对其进行操作,即同一时刻只能有一个用户使用它,自然这在工作当中是很不方便的,所以我们要重新为其配置一个数据库。     
④Hadoop:Hive用HDFS进行存储,用MapReduce进行计算——-Hive这个数据仓库的数据存储在HDFS中,业务实际分    
析计算是利用MapReduce执行的。 从上面的体系结构中可以看出,在Hadoop的HDFS与MapReduce以及MySql的辅助下,Hive其实就是利用Hive解析器将用户的SQl语句解析成对应的MapReduce程序而已,即Hive仅仅是一个客户端工具,这也是为什么我们在Hive的搭建过程中没有分布与伪分布搭建的原因。(Hive就像是刘邦一样,合理的利用了张良、韩信与萧何的辅助,从而成就了一番大事!) 

Hive运行机制

创建完表之后,用户只需要根据业务需求编写Sql语句,而后将由Hive框架将Sql语句解析成对应的MapReduce程序,通过MapReduce计算框架运行job,便得到了我们最终的分析结果。在Hive的运行过程中,用户只需要创建表、导入数据、编写Sql分析语句即可,剩下的过程将由Hive框架自动完成,而创建表、导入数据、编写Sql分析语句其实就是数据库的知识了。Hive的运行过程也说明了为什么Hive的存在大大降低了Hadoop的学习门槛以及为什么Hive在Hadoop家族中占有着那么重要的地位。

Hive安装配置

1)Hive安装前需要的环境:jdk+hadoop+mysql+zookeeper

Hive走的是hadoop集群,所以不需要每台机器都安装,本次只安装在hadoop01(master)机器上

2)安装配置Hive(hadoop01仅一台机器即可)

上传离线压缩包到apache-hive-2.3.3-bin.tar.gz到/home/hadoop01

mv /home/hadoop01/apache-hive-2.3.3-bin.tar.gz /usr/software

解压:tar -xzvf apache-hive-3.0.0-bin.tar.gz

创建软连接:ln -s apache-hive-3.0.0-bin hive

设置Hive环境变量

vim /etc/profile
export HIVE_HOME=/usr/software/hive
export PATH=${HIVE_HOME}/bin:$PATH
保存退出后:source /etc/profile
vim ~/.bashrc
export HIVE_HOME=/usr/software/hive
export PATH=${HIVE_HOME}/bin:$PATH
保存退出后:source ~/.bashrc
在运行 Hive 之前需要使用以下命令修改配置文件:
cd /usr/software/hive/conf
cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
cp hive-log4j2.properties.template hive-log4j2.properties
cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties
编辑hive-env.sh:
因为 Hive 使用了 Hadoop, 需要在 hive-env.sh 文件中指定 Hadoop 安装路径:
export JAVA_HOME=/usr/software/java/jdk1.8.0_152
export HADOOP_HOME=/usr/software/hadoop-3.0.1
export HIVE_HOME=/usr/software/hive

创建HDFS目录:        
在 Hive 中创建表之前需要创建以下 HDFS 目录并给它们赋相应的权限:        
hdfs dfs -mkdir -p /user/hive/warehouse        
hdfs dfs -mkdir -p /user/hive/tmp        
hdfs dfs -mkdir -p /user/hive/log        
hdfs dfs -chmod g+w /user/hive/warehouse        
hdfs dfs -chmod g+w /user/hive/tmp        
hdfs dfs -chmod g+w /user/hive/log

配置hive-site.xml

<configuration>                                
<property>                                
    <name>hive.exec.scratchdir</name>                    //HDFS路径,用于存储不同map/reduce阶段的执行计划            
    <value>/user/hive/tmp</value>                    //和这些阶段的中间输出结果。            
</property>                                
<property>                                
    <name>hive.metastore.warehouse.dir</name>                    //Hive 默认的数据文件存储路径,通常为 HDFS 可写的路径。            
    <value>/user/hive/warehouse</value>                                
</property>                                
<property>                                
    <name>hive.querylog.location</name>                    //Hive 实时查询日志所在的目录,如果该值为空,将不创建实            
    <value>/user/hive/log</value>                    //时的查询日志。            
</property>                                                                
//配置 MySQL 数据库连接信息。                                
<property>                                
    <name>javax.jdo.option.ConnectionURL</name>                                
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>    
  </property>                                
  <property>                                
    <name>javax.jdo.option.ConnectionDriverName</name>                                
    <value>com.mysql.jdbc.Driver</value>                                
  </property>                                
  <property>                                
    <name>javax.jdo.option.ConnectionUserName</name>                                
    <value>hive</value>        
  </property>                                
  <property>                            
    <name>javax.jdo.option.ConnectionPassword</name>        
    <value>hive</value>                                
  </property>                                
                                
//配置hive中支持事务,否则hive中不支持INSERT INTO等操作                                
<property>                                
    <name>hive.support.concurrency</name>                                
    <value>true</value>                                
</property>                                
<property>                                
    <name>hive.exec.dynamic.partition.mode</name>                                
    <value>nonstrict</value>                                
</property>                                
<property>                                
    <name>hive.txn.manager</name>                                
    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>                                
</property>                                
<property>                                
    <name>hive.compactor.initiator.on</name>                                
    <value>true</value>                                
</property>                                
<property>                                
    <name>hive.compactor.worker.threads</name>                                
    <value>1</value>                                
</property>                                
</configuration>

保存退出

3)安装mysql数据库替换Derby                
默认情况下,Hive元数据保存在内嵌的Derby数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不使用,为了支持多用户会话,则需要一个独立的元数据库,使用MySQL作为元数据库,                
Hive内部对MySQL提供了很好的支持。                
mysql安装步骤已在mysql-cluster中安装完成,此处不再描述                
进入mysql shell界面mysql>后,配置mysql数据库允许Hive接入:                
新建hive数据库,用来保存hive的元数据                
mysql> create database hive;                
mysql> use hive;                
mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';                
mysql> GRANT ALL ON hive.* TO 'hive'@'localhost' IDENTIFIED BY 'hive';                
mysql> GRANT ALL ON hive.* TO 'hive'@'%' IDENTIFIED BY 'hive';                
mysql> FLUSH PRIVILEGES;                
mysql> quit;                
出现错误:ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement                
解决办法:flush privileges;                
4)启动Hive                
在命令行运行 hive 命令时必须保证以下两点:                
HDFS 已经启动。可以使用 start-dfs.sh 脚本来启动 HDFS。                
MySQL Java 连接器添加到 $HIVE_HOME/lib 目录下。我安装时使用的是mysql-connector-java-5.1.46.jar                
从 Hive 2.1 版本开始, 我们需要先运行 schematool 命令来执行初始化操作。                
cd /usr/software/hive/                
bin/schematool -dbType mysql -initSchema

初始化成功后
查看Hive在HDFS创建目录/usr/software/hadoop-3.0.1/bin/hdfs dfs -ls /

cd /usr/software/hive/    
bin/hive    
第一次执行出错说tmp没有写权限,那么添加写权限    
hdfs dfs -chmod 777 /user/hive/tmp

hive> create table test(id int, name string)row format delimited fields terminated by ',';
创建数据库表,上传的文件以","逗号分隔
hive> show tables;

在hdfs的目录:/user/ceshi/hive上传hive.txt
load data inpath '/user/test/hive/hive.txt' into table test;

因为创建表时候指定需要用逗号分隔,所以创建的hive.txt数据中需要以逗号分隔上传后才能识别    
hive的退出用:exit;    
select count(*) from test;    
hive3.0.0没有jar包冲突,版本匹配正确之后没有任何问题!!!    
bin/hive --hiveconf hive.root.logger=DEBUG,console    
set hive.execution.engine=tez;    
bin/hive --hiveconf hive.execution.engine=tez

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戰士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值