hive-1

Hive是由Facebook创建的基于Hadoop的数据仓库工具,用于管理和查询大规模结构化数据。它提供了一种SQL-like的语言(HQL)来操作数据,简化了MapReduce的编写。本文介绍了Hive的出现原因、定义、优缺点、架构,特别是元数据、驱动组件,以及Hive与关系型数据库的比较。还详细阐述了Hive的安装部署过程,包括嵌入式模式和本地模式,并提供了常见错误的解决方案。
摘要由CSDN通过智能技术生成

Hive

出现原因

Hive最早来源于FaceBook ,因为FaceBook⽹站每天产⽣海量的结构化⽇志数据,为 了对这些数据进⾏管理,并且因为机器学习的需求,产⽣了Hive这⻔技术,并继续发 展成为⼀个成功的Apache项⽬。

定义

Hive是⼀个基于 Hadoop 的数据仓库⼯具,可以将结构化的数据⽂件映射成⼀张数据 表,并可以使⽤类似SQL的⽅式来对数据⽂件进⾏读写以及管理。这套Hive SQL 简 称HQL。Hive的执⾏引擎可以是MR、Spark、Tez。

本质

Hive的本质是将HQL转换成MapReduce任务,完成整个数据的分析查询,减少编写 MapReduce的复杂度 。

Hive的优缺点

优点

1. 学习成本低:提供了类SQL查询语⾔HQL,使得熟悉SQL语⾔的开发⼈员⽆需关⼼细
节,可以快速上⼿.
2. 海量数据分析:底层是基于海量计算到MapReduce实现.
3. 可扩展性:为超⼤数据集设计了计算/扩展能⼒(MR作为计算引擎,HDFS作为
存储系统),Hive可以⾃由的扩展集群的规模,⼀般情况下不需要重启服务。
4. 延展性:Hive⽀持⽤户⾃定义函数,⽤户可以根据⾃⼰的需求来实现⾃⼰的函
数。
5. 良好的容错性:某个数据节点出现问题HQL仍可完成执⾏。
6. 统计管理:提供了统⼀的元数据管理

缺点

1. Hive的HQL表达能⼒有限
2. 迭代式算法⽆法表达.
3. Hive的效率⽐较低.
4. Hive⾃动⽣成的MapReduce作业,通常情况下不够智能化.
5. Hive调优⽐较困难,粒度较粗.

Hive的架构

⽤户连接接⼝

CLI:是指Shell命令⾏ JDBC/ODBC:是指Hive的JAVA实现,与传统数据库JDBC类似。 WebUI:是指可通过浏览器访问Hive。

thriftserver

hive的可选组件,此组件是⼀个软件框架服务,允许客户端使⽤包括Java、C++、 Ruby和其他很多种语⾔,通过编程的⽅式远程访问Hive。

元数据

Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括(表名、表所 属的数据库名、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据 所在⽬录等)

驱动(Driver)

解析器(SQLParser): 将HQL字符串转换成抽象语法树AST,这⼀步⼀般都⽤第三⽅⼯具库完成,⽐如 antlr;对AST进⾏语法分析,⽐如表是否存在、字段是否存在、SQL语义是否有误。

- 编译器(Compiler):
 对hql语句进⾏词法、语法、语义的编译(需要跟元数据关联),编译完成后会⽣成
⼀个执⾏计划。hive上就是编译成mapreduce的job。
- 优化器(Optimizer):
 将执⾏计划进⾏优化,减少不必要的列、使⽤分区、使⽤索引等。优化job。
- 执⾏器(Executer):
 将优化后的执⾏计划提交给hadoop的yarn上执⾏。提交job。

Hive与关系型数据库的异同

⽐较项 关系数据库 Hive
ANSI SQL ⽀持 不完全⽀持
更新 UPDATE INSERT DELETE INSERT OVERWRITE INTO TABLE
事务 ⽀持 ⽀持(部分⽀持)
模式 写模式 读模式
存储位置 块设备、本地⽂件系统 HDFS
延时 低 ⾼
多表插⼊ 不⽀持 ⽀持
⼦查询 完全⽀持 只能⽤在From⼦句中
视图 Updatable Read-only
可扩展性 低 ⾼
数据规模 ⼩ ⼤
实时响应 毫秒级 秒级

关键⽐较项解释

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语义的严格限制,扩展性⾮常
有限。⽬前最先进的并⾏数据库Oracle在理论上的扩展能⼒也只有100台左右。
9. 数据规模:由于Hive建⽴在集群上并可以利⽤MapReduce进⾏并⾏计算,因此
可以⽀持很⼤规模的数据;对应的,数据库可以⽀持的数据规模较⼩。

Hive和Hadoop的关

1. Hive是基于Hadoop的。
2. Hive本身其实没有多少功能,hive就相当于在Hadoop上⾯加了⼀个外壳,就是
对hadoop进⾏了⼀次封装。
3. Hive的存储是基于HDFS的,hive的计算是基于MapReduce。

Hive的安装部署

Hive常⽤的安装分三种(注意:Hive会⾃动监测Hadoop的环境变量,如有就必须启 动Hadoop) 先从本地上传Hive安装⽂件apache-hive-2.1.1-bin.tar.gz到/root/soft

嵌⼊式模式

使⽤hive⾃带默认元数据库derby来进⾏存储,通常⽤于测试 1. 优点:使⽤简单,不⽤进⾏配置 2. 缺点:只⽀持单Session。

解压hive

[root@leetom01 local]# tar -zxvf apache-hive-2.1.1-bin.tar.gz
-C /usr/local
#修改Hive安装路径名,⽅便以后使⽤
[root@leetom01 local]# mv apache-hive-2.1.1-bin/ hive
[root@leetom01 local]# vi /etc/profile
# 添加如下内容:
export HIVE_HOME=/usr/local/hive
export PATH=$HIVE_HOME/bin:$PATH
#让profile⽣效
[root@leetom01 local]# source /etc/profile

配置hive-env.sh

export HIVE_CONF_DIR=/usr/local/hive/conf
export JAVA_HOME=/usr/local/jdk
export HADOOP_HOME=/usr/local/hadoop
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib

配置hive-site.xml

Hive2.1.1中默认是没有 hive-site.xml ,可以把 conf/hive-default.xml.template
拷⻉过来使⽤
[root@leetom01 conf] cp hive-default.xml.template hive-site.xml

修改dir

hive-site.xml 中有两个重要的配置如下:

<!-- 该参数主要指定Hive的数据存储⽬录 -->
<property>
 <name>hive.metastore.warehouse.dir</name>
 <value>/user/hive/warehouse</value>
 <description>location of default database for the
warehouse</description>
 </property>
<!-- 该参数主要指定Hive的临时⽂件存储⽬录 -->
<property>
 <name>hive.exec.scratchdir</name>
 <value>/tmp/hive</value>
 <description>HDFS root scratch dir for Hive jobs which gets
created with write all (733) permission. For each connecting
user, an HDFS scratch dir:
${hive.exec.scratchdir}/&lt;username&gt; is created, with
${hive.scratch.dir.permission}.</description>
 </property>

在linux中新建上⾯两个⽬录,并且进⾏权限赋值

[root@leetom01 hive] # hdfs dfs -mkdir -p /user/hive/warehouse 
[root@leetom01 hive] # hdfs dfs -mkdir -p /tmp/hive/ 
[root@leetom01 hive] # hdfs dfs -chmod 750
/user/hive/warehouse 
[root@leetom01 hive] # hdfs dfs -chmod 777 /tmp/hive

修改io.tmpdir路径

[root@leetom01 hive] # mkdir iotmp
[root@leetom01 hive] # chmod 777 iotmp

把hive-site.xml 中所有包含 ${system:Java.io.tmpdir}替换成/usr/local/hive/iotmp. 如果系统默认没有指定系统⽤户名,那么要把配置${system:user.name}替换成当前 ⽤户名root

启动hadoop

[root@leetom01 hadoop]# start-dfs.sh
[root@leetom01 hadoop]# start-yarn.sh

初始化hive

[root@leetom01 hive]# schematool -initSchema -dbType derby

启动hive

(注:启动之前要启动hdfs sbin/start-dfs.sh 和yarn sbin/start-yarn.sh ) 必须在初始化的⽬录启动hive(默认只有⼀个当前的session可⽤)

[root@leetom01 hive]# bin/hive
#进⼊后可以执⾏下⾯命令进⾏操作:
hive>show databases; #查看数据库
hive>show tables; #查看表

简单sql演示执⾏

# 创建表
hive> create table dog(id int,name string);
hive> select * from dog;
hive> insert into dog values(1,"wangcai");
hive> desc dog; #查看表结构
hive> quit # 退出

本地模式

(将元数据库放在该台机器上)(多⽤户模式)
通常使⽤关系型数据库来进⾏元数据存储(mysql、oracle等执⾏带jdbc驱动的数据
库)
优点:⽀持多Session
缺点:需要配置、还需要安装mysql等关系型数据库

配置安装mysql

#查看mysql是否安装,如果安装了,卸载mysql
[root@leetom01 hive] rpm -qa|grep mysql #如果出现下⾯的提示,就说
明系统已经有了mysql,要卸载
mysql-libs-5.1.73-7.el6.x86_64
# 卸载mysql
[root@leetom01 hive] rpm -e --nodeps mysql-libs-5.1.73-
7.el6.x86_64

安装MySql服务器

# 1. 先从本地上传服务端和客户端到服务器,尽量使⽤root⽤户操作)
# 2. 通过命令进⾏安装:
将下⾯的解包,得到所有相关的包
[root@leetom01 soft]# rpm -ivh mysql-5.7.28-1.el7.x86_64.rpm•bundle.tar
将相关包按照顺序依次安装
[root@leetom01 soft]# rpm -ivh mysql-community-common-5.7.28-
1.el7.x86_64.rpm
[root@leetom01 soft]# yum -y install perl
[root@leetom01 soft]# yum -y install net-tools
[root@leetom01 soft]# rpm -ivh mysql-community-libs-5.7.28-
1.el7.x86_64.rpm
[root@leetom01 soft]# rpm -ivh mysql-community-client-5.7.28-
1.el7.x86_64.rpm
[root@leetom01 soft]# rpm -ivh mysql-community-server-5.7.28-
1.el7.x86_64.rpm
# 3. 启动mysql服务
# 启动数据库
[root@leetom01 soft]# systemctl start mysqld 
# 设置开机⾃启数据库
[root@leetom01 soft]# systemctl enable mysqld
# 4. 查看产⽣的随机密码,运⾏命令后最后显示的xuzmpubKv0(f即为密码
[root@leetom01 soft]# grep 'password' /var/log/mysqld.log
2020-04-14T19:20:47.261622Z 1 [Note] A temporary password is
generated for root@localhost: xuzmpubKv0(f
# 5. ⽤上述密码登录数据库
[root@leetom01 soft] mysql -u root -p
# 6. 修改密码(root与@与localhost之间不能有空格)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root123@';

安装步骤说明

步骤(下⾯三个步骤同嵌⼊式安装):
1. 解压并配置环境变量
2. 配置hive的配置⽂件
cp hive-env.sh.template hive-env.sh
vi hive-env.sh(可以配置jdk、hive的conf路径)
2. 在Hive的conf配置hive的⾃定义配置⽂件
vi hive-site.xml:添加如下内容
注意:要把原来的默认的derby的连接配置,连接驱动,⽤户,密码改成mysql 的
添加以下内容
<!--配置mysql的连接字符串-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?
createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC
metastore</description>
</property>
<!--配置mysql的连接驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC
metastore</description>
</property>
<!--配置登录mysql的⽤户-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore
database</description>
</property>
<!--配置登录mysql的密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123123</value>
<description>password to use against metastore
database</description>
</property>

将mysql的驱动包 mysql-connector-java-5.1.27-bin.jar 上传到 $HIVE_HOME/lib下(==注意:驱动是jar结尾,不是tar结尾==)

[root@leetom01 hive]# bin/schematool -initSchema -dbType mysql

启动hive

[root@leetom01 hive]# bin/hive

远程连接mysql服务器

可以先⽤windows平台的⼯具访问linux系统上的mysql服务器,如果提示不让远程登
录,看下⾯的解决办法
常⻅错误分析:
1.不让远程登录的解决办法
⾸先注意:设置完成后,root的密码变成了mysql
不让远程登录:如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执⾏)
mysql -uroot -p
#(执⾏下⾯的语句 .:所有库下的所有表 %:任何IP地址或主机都可以连接)
输⼊命令说明:GRANT ALL PRIVILEGES ON . TO ‘⽤户名’@’%’ IDENTIFIED
BY ‘你的密码’ WITH GRANT OPTION;
让客户端在远程登录拥有权限,密码重新设置成mysql
输⼊命令:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED
BY 'mysql' WITH GRANT OPTION;
输⼊命令:FLUSH PRIVILEGES; 将命令写⼊授权表
让客户端在本地登录拥有权限,密码重新设置成mysql
输⼊命令:grant all privileges on *.* to root@"localhost"
identified by "mysql" with grant option;
输⼊命令:FLUSH PRIVILEGES;
2.执⾏mysql -uroot -p
 或者
第⼀次安装完mysql后 执⾏/usr/bin/mysql_secure_installation 脚本,
 出现 Enter current password for root (enter for none): 点击回
⻋后出现下⾯的错误
mysql Can't connect to local MySQL server through socket
'/var/lib/mysql/mysql.sock' (2)
错误原因:/var/lib/mysql⽬录中socket⽂件不存在。
连接mysql服务器有两种⽅式:tcp连接,通过socket⽂件连接。通过socket⽂件,
启动mysql服务,mysql服务会⾃动⽣成⼀个sock⽂件,⽣成的sock⽂件默认放在 -
-datadir=/var/lib/mysql,mysql默认从/var/lib/mysql⽬录读取sock⽂
件。
解决办法:
1、看看/var/lib/mysql/mysql 有没有mysql.sock⽂件
2、没有mysql.sock,重启mysql服务,看看有没有。
3、没有的话,ps aux|grep mysql|grep -v 'grep' 查看mysql服务⽣成的
sock在哪个⽬录,看看这个⽬录有没有。
4、如果mysql服务⽣成在其他⽬录,解决办法有:
⽅法⼀ 修改mysql服务⽣成的⽬录,在/etc/my.cnf 中[mysqld] socket
⾸先确认在etc/下有没有my.cnf⽂件
如果是rpm安装的mysql,默认这⾥没有.需要将usr/share/mysql下的my•medium.cnf拷⻉到/etc/下并改名成my.cnf
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
⽅法⼆ mysql从/var/lib/mysql/读取sock⽂件,建⽴⼀个软连接,或者copy过来
⽅法三 还可以找到当前的mysql进程,将他删掉,重新启动
情况:第⼀次启动失败,进程没有关闭,第⼆次开服务⽆法启动

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值