从这篇开始介绍Hive的一些列的技术点。java
1.只能用Java开发,对于不会Java甚至不会编程的人员来讲,这是一个门槛,例如:数据仓库开发工程师。node
2.须要对Hadoop的底层及API比较了解才能开发复杂而高效的代码,例如:shuffle的过程。mysql
3.开发调试麻烦。linux
能不能想办法解决以上问题,最好可以用一种通用的方式开发大数据处理的程序,能够屏蔽掉底层细节,简化开发测试。sql
为线上系统提供实时数据,提供完整的增删改查的能力,具备完整的事务支持,尽可能的避免数据的冗余、节省存储空间和提升处理效率。数据库
离线历史数据的存储和处理。为离线的数据分析提供支持,只能一次写入屡次查询,不支持行级别的增删改,不强调事务特性,人为的制造冗余来提升数据查询的效率。apache
在Hadoop的基础上架设了一层SQL操做的接口,使咱们能够经过类SQL的HQL来操做HIVE。由HIVE将这些HQL语句翻译成mapreduce来处理海量数据。编程
HIVE基于HQL来操做海量数据,可不可认为它是基于Hadoop的数据库?不能够!vim
HIVE并非基于Hadoop的数据库工具,而是一种基于Hadoop的数据仓库工具。bash
HIVE将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询能力。可是只能一次写入屡次查询,不支持行级别的增删改(Hadoop2.0后能够追加了),这是受限于底层的HDFS。本质上只是在Hadoop的基础上加了一层SQL的壳,仍然是一种离线数据分析工具。不支持事务的特性。一般会经过制造冗余来提升数据的查询能力。
HIVE是基于Hadoop的一个数据仓库工具。
1.学习成本低,能够经过类SQL语句快速实现简单的MapReduce统计,没必要开发专门的MapReduce应用,十分适合数据仓库的统计分析。
2.提供了一系列的工具,能够用来进行数据提取转化加载(ETL),这是一种能够存储、查询和分析存储在Hadoop中的大规模数据的机制。
3.Hive定义了简单的类SQL查询语言,称为HiveQL,它容许熟悉SQL的用户查询数据。同时,这个语言也容许熟悉MapReduce开发者的开发自定义的mapper和reducer来处理内建的mapper和reducer没法完成的复杂的分析工做。
1.Hive不支持在线事务处理。
2.不支持行级的插入和更新和删除。
3.相对来讲速度比较慢。
安装好JDK而且配置JAVA_HOME环境变量。
须要hadoop的支持,安装好hadoop并配置HADOOP_HOME环境变量。
Hadoop的安装能够参见:Hadoop伪分布式模式搭建、Hadoop彻底分布式集群搭建。
从apache官网下载新版本hive,要注意和hadoop版本的匹配。
这里我用的版本分别是:Hadoop2.7.1,Hive1.2.0。
将下载好的hive安装包上传到linux中。
解压:
tar -zxvf apache-hive-1.2.0-bin.tar.gz
进入hive/bin目录,直接运行hive命令,便可进入hive提示符。
./hive
hive不须要任何配置就能够运行,由于它能够经过HADOOP_HOME环境变量获知hadoop的配置信息。
在使用hadoop2.5.x环境下,启动hive发现报错:
java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
形成这个错误的缘由是由于jline.Terminal这个类有错误。
通过检查发现,在hadoop/share/hadoop/yarn/lib目录下存在jline-0.9.x.jar。而在hive/lib/目录下存在jline-2.12.jar。重复的包不兼容形成了此问题。
1.复制hive/lib/jline-2.12.jar替换hadoop/share/hadoop/yarn/lib中的jline-0.9.x.jar,重启hadoop和hive便可。
2.直接将hadoop升级到更高版本,如2.7.x中已经解决此问题。
查看数据库:
show databases;
执行后发现默认有一个库default。
show tables;
发现没有任何表,证实不use其余库时,默认就是default库。
create database school;
发如今hdfs中多出了/user/hive/warehouse/tedu.db目录
结论1:hive中的数据库对应hdfs中/user/hive/warehouse目录下以.db结尾的目录。
use school; create table student (id int,name string); show tables; desc student; show create table student;
发现正确建立出来了表。
发如今hdfs中多出了/user/hive/warehouse/tedu.db/sutdent目录。
结论2:hive中的表对应hdfs/user/hive/warehouse/[db目录]中的一个目录。
load data local inpath '../mydata/student.txt' into table student;
发现/user/hive/warehouse/tedu.db/sutdent下多出了文件。
select * from student;
发现查出的数据不正确,缘由是建表时没有指定分隔符。默认的分隔符是空格。
create table student2 (id int,name string) row format delimited fields terminated by '\t'; load data local inpath '../mydata/student.txt' into table student2; select * from student2;
发现正确查询出了数据。
结论3:hive中的数据对应当前hive表对应的hdfs目录中的文件中的数据。
select count(*) from student;
发现执行了mapreduce做业,最终现实告终果
结论4:hive会将命令转换为mapreduce执行。
use default; create table teacher(id int,name string);
发如今hive对应的目录下多出了tedu.db文件夹,其中包含user文件夹。
结论5:hive默认的default数据库直接对应/user/hive/warehouse目录,在default库中建立的表直接会在该目录下建立对应目录。
MySQL metastore:元数据库。
HIVE中除了保存真正的数据之外,还要额外保存用来描述库、表、列的数据,称为HIVE的元数据。
这些元数据又存放在何处呢?
HIVE须要将这些元数据存放在另外的关系型数据库中。若是不修改配置HIVE默认使用内置的derby数据库存储元数据。derby是apache开发的基于java的文件型数据库。
能够检查以前入门案例执行命令的目录,会发现其中产生了一个metastore.db的文件,这就是derby产生的用来保存元数据的数据库文件。derby数据库仅仅能够用来进行测试,真正使用时会有不少限制。最明显的问题是不能支持并发。
经测试能够发现,在同一目录下使用HIVE,没法同时开启多个HIVE,不一样目录下能够同时开启HIVE可是会各自产生metastore.db文件,形成数据没法共同访问。因此真正生产环境中咱们是不会使用默认的derby数据库保存HIVE的元数据的。
HIVE目前支持derby和mysql两种数据库来存储元数据。
若是以前安装了MySQL数据库,能够正常使用,那么安装数据库的操做就能够不用进行,若是有问题,能够参见下面MySQL的相关问题。
将rpm包上传到本身的管理目录(也能够是其余目录)。
MySQL有不少版本,这里使用的是以下这样的cs架构的数据库。
MySQL-server-5.6.29-1.linux_glibc2.5.x86_64.rpm
MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rpm
此处检查的是没有安装过数据库,而系统自带的数据库。
查看以前是否安装过mysql,命令以下:
rpm -qa | grep -i mysql
若是安装过,执行如下代码,删除以前安装过的mysql:
rpm -ev --nodeps mysql-libs-5.1.71-1.el6.x86_64
增长用户组mysql:
groupadd mysql
增长用户mysql,加入mysql用户组:
useradd -r -g mysql mysql
安装server:
rpm -ivh MySQL-server-5.6.29-1.linux_glibc2.5.x86_64.rpm
安装client:
rpm -ivh MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rpm
mysql5.6安装后所在的目录:
Directory Contents of Directory
/usr/bin Client programs and scripts
/usr/sbin The mysqld server
/var/lib/mysql Log files, databases
/usr/share/info MySQL manual in Info format
/usr/share/man Unix manual pages
/usr/include/mysql Include (header) files
/usr/lib/mysql Libraries
/usr/share/mysql Miscellaneous support files, including error messages, character set files, sample configuration files, SQL for database installation
/usr/share/sql-bench Benchmarks
修改my.cnf,默认在/usr/my.cnf。
vim /usr/my.cnf
在配置文件[mysql]的位置增长以下内容,替换[mysql],以下内容主要配置MySQL的字符编码格式:
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] character_set_server=utf8
将mysqld加入系统服务,并随机启动,命令以下:
cp /usr/share/mysql/mysql.server /etc/init.d/mysqld
启动mysqld的命令以下:
service mysqld start
首先获取mysql安装时root用户的随机密码:
vim /root/.mysql_secret
也可以使用cat命令查看:
cat /root/.mysql_secret
此密码只能用来修改密码使用。
必需要修改root用户的密码才可使用mysql,不然只能链接不能操做
mysqladmin -u root -p password root
链接进入mysql,命令以下:
mysql -u root -p
查看mysql的安装运行路径,命令以下:
ps -ef|grep mysql
若是出现没有权限的问题,在mysql受权(在安装mysql的机器上执行)
mysql -u root -p
执行下面的语句,进行受权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;
*.*:全部库下的全部表。
%:任何IP地址或主机均可以链接。若是%配置不生效,就配置具体的主机名称。
配置hive使用mysql保存元数据信息,须要先删除默认安装的元数据信息。
①hdfs中的目录结构
删除hdfs中的/user/hive:
hadoop fs -rmr /user/hive
也可使用Eclipse中的视图模式删除。
②derby的文件
把使用过HIVE的目录中,derby数据库保存元数据的meta_store的文件夹删掉。
复制hive/conf/hive-default.xml.template为hive-site.xml。
cp hive-default.xml.template hive-site.xml
文件名必定要按上述格式进行修改,不然配置不会生效。
编辑hive-site.xml文件:
vim hive-site.xml
在<configuration>中进行配置,将标签中原有的配置信息所有删除,把如下配置信息填入便可,基本上是jdbc的配置信息:
<!--要使用的数据--> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop:3306/hive?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <!--jdbc驱动--> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <!--数据库账号--> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property> <!--数据库密码--> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> <description>password to use against metastore database</description> </property>
因为HIVE在MySQL中只支持latin1这种字符编码格式,因此须要手动建立元数据库。
注意此库必须是latin1,不然会出现奇怪问题!因此推荐手动建立!而且建立库以前不能有任意的hive操做,不然自动建立出来的库表将使用mysql默认的字符集,仍然报错!
另外一种方法是修改mysql的配置文件,让mysql默认编码集就是latin1,这样hive自动建立的元数据库就是latin1的了,可是这已修改将会影响整个mysql数据库,若是mysql中有其余库,这种方式并很差。
进入MySQL数据库,执行以下语句建立数据库:
create database hive character set latin1;
将mysql的链接jar包拷贝到$HIVE_HOME/lib目录下。
再进入hive命令行,试着建立库表发现没有问题。
测试发现开启多个链接没有问题。
链接mysql,发现多了一个hive库。其中保存有hive的元数据。
HIVE内置了29个表,来记录HIVE自己的元数据。
存放重要信息的以下:
DBS:数据库的元数据信息。
TBLS:表信息。
COLUMNS_V2:表中字段信息。
SDS:表对应hdfs目录。
下一篇:HIVE中的表以及语法