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}/<username> 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进程,将他删掉,重新启动
情况:第⼀次启动失败,进程没有关闭,第⼆次开服务⽆法启动