笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。
我的公众号为:livandata
Hive是大数据中常用的数据仓库(按照主题、面向历史的一个数据集,被称作是数据仓库),可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能。
数据仓库中还有一个建模的模型。
数据仓库的用途主要是做数据分析使用,常用的建模数据取数据也是可以的,数据仓库中的表大多为宽表(即数据的维度比较多,按照主题划分);
数据建模时表的结构主要有:星型、雪花型等样式,比如上图的事实表为:星型结构。
为什么要用Hive?
操作接口采用类SQL的语法,提供快速开发的能力。
避免直接写MapReduce,减少开发人员的学习成本,扩展功能很方便。
Hive的特点:
1) 可扩展:
Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
2) 延展性:
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
3) 容错:
良好的容错性,节点出现问题SQL扔可完成执行。
Hive的架构为:
1)当在hive上创建一个database时,HIVE会在HDFS中创建一个database的目录,用来存放数据;
2)HIVE的元数据放在另外的一个数据库中,主要借助mysql,存放多个HIVE库的元数据。
3)当在HIVE中create一个table时,实践经验:创建的字段全用string,对应的表就会建立在HDFS中;
4)Hive中有一个mr的模板库,会将sql转换成mr,提交给YARN,当建表时,对数据的切块方法,需要什么参数都创建好了。
5)在这之前,程序会将日志信息,清洗放入到HDFS中,整整齐齐的字段,类似于一张表。
整体的架构图为:
Hive的安装非常简单,可以安装多个,也可以安装一个。
HA环境下hadoop的Hive的安装使用过程可以借用如下网页的操作流程:https://www.cnblogs.com/dxxblog/p/8193967.html,流程相对完整:
安装
一:下载hive——地址:http://mirror.bit.edu.cn/apache/hive/
这里以hive-2.1.1为例子,如图:
将hive解压到/usr/local下:
[root@s100 local]# tar -zxvf apache-hive-2.1.1-bin.tar.gz -C /usr/local/
将文件重命名为hive文件:
[root@s100 local]# mv apache-hive-2.1.1-bin hive
修改环境变量/etc/profile:
[root@s100 local]# vim /etc/profile
#hive
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
执行source/etc.profile:
执行hive--version
[root@s100 local]# hive --version
有hive的版本显现,安装成功!
配置
[root@s100 conf]# cd /usr/local/hive/conf/
修改hive-site.xml:
这里没有,我们就以模板复制一个:
[root@s100 conf]# cp hive-default.xml.template hive-site.xml
[root@s100 conf]# vim hive-site.xml
1.配置hive-site.xml(第5点的后面有一个单独的hive-site.xml配置文件,这个如果有疑问可以用后面的配置文件,更容易明白)
主要是mysql的连接信息(在文本的最开始位置):
<configuration>
<property>
<name>javax.jdo.option.ConnectionUserName</name>用户名(这4是新添加的,记住删除配置文件原有的哦!)
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>密码
<value>123456</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>mysql
<value>jdbc:mysql://192.168.1.68:3306/hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>mysql驱动程序
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- 到此结束代码 -->
</configuration>
此处的root即为连接mysql下hive的schema的名称;
2.复制mysql的驱动程序到hive/lib下面(这里已经拷贝好了):
[root@s100 lib]# ll mysql-connector-java-5.1.18-bin.jar
-rw-r--r-- 1 root root 789885 1月 4 01:43 mysql-connector-java-5.1.18-bin.jar
3.在mysql中hive的schema(在此之前需要创建mysql下的hive数据库):
[root@s100 bin]# pwd
/usr/local/hive/bin
[root@s100 bin]# schematool -dbType mysql -initSchema
4.执行hive命令
[root@localhost hive]# hive
成功进入hive界面,hive配置完成
5.查询mysql(hive这个库是在 schematool-dbType mysql -initSchema 之前创建的!)
[root@localhost ~]# mysql -uroot -p123456
mysql> use hive
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_hive |
+---------------------------+
| AUX_TABLE |
| BUCKETING_COLS |
| CDS |
| COLUMNS_V2 |
| COMPACTION_QUEUE |
| COMPLETED_COMPACTIONS |
备注(这里不计入正文不要重复配置hive-site.xml)
配置文件hive-site.xml
这里不得不说一下,如果你的 schematool -dbType mysql -initSchema 并没有执行成功怎么办,小博主昨天在这卡了一天,最后根据伟大的百度和hive官方文档,直接写了一个hive-site.xml配置文本:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hahive</value>(mysql地址localhost)
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>(mysql的驱动)
<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>
</configuration>
那我们做这些事干什么的呢,下面小段测试大家感受一下
hive测试:
备注:这里是第二个配置文件的演示:所以数据库名称是hahive数据库!
1.需要知道现在的hadoop中的HDFS存了什么
[root@localhost conf]# hadoop fs -lsr /
2.进入hive并创建一个测试库和测试表
[root@localhost conf]# hive
创建库:
1 hive> create database hive_1;
2 OK
3 Time taken: 1.432 seconds
显示库:
1 hive> show databases;
2 OK
3 default
4 hive_1
5 Time taken: 1.25 seconds, Fetched: 2 row(s)
创建库成功!
3.查询一下HDFS有什么变化
多了一个库hive_1
mysql下的hahive库有什么变化:
4.在hive_1下创建一个表hive_01
1 2 3 4 5 6 7 8 9 10 11 |
|
HDFS下的情况:
在web端是什么样子的呢:
总的来说,hive其实就和mysql差不多呢!那么后面就不说了
不过中间可能会遇到各种奇葩问题,简单描述我遇到过的问题:
1) mysql安装报错:
开始用的rpm的安装包进行安装,中间涉及到ssl升级,依赖包安装等各种问题,不胜其烦,经百度之后果断更换安装方式,采用解压tar.gz的方式安装,成功解决,主要的安装步骤可参考如下(https://blog.csdn.net/javaloveiphone/article/details/74276506):
1、下载地址:MySQL-5.6.30-Linux-glibc2.5-x86_64.tar.gz
2、查看linux系统版本:
[mysql@localhost scripts]$ uname -a
Linux localhost.localdomain 2.6.32-358.el6.x86_64
#1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
3、解压缩下载的mysql包:
[root@localhost mysql]# tar -zxvf mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
4、重命名解压包:
[root@localhost mysql]# mv mysql-5.6.30-linux-glibc2.5-x86_64 /usr/local/mysql
5、创建mysql用户:
[root@localhost mysql]# useradd mysql
6、设置mysql用户密码:
[root@localhost mysql]# passwd mysql
7、将mysql目录的权限授给mysql用户和mysql组:
[root@localhost local]# chown -R mysql:mysql /usr/local/mysql/
8、切换到mysql用户,执行安装:
[root@localhost ~]# su - mysql
[mysql@localhost scripts]$ /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
输出信息:
[mysql@localhost scripts]$ ./mysql_install_db
--user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
……
The latest information about MySQL is available on the web at
http://www.mysql.com
--defaults-file argument to mysqld_safe when starting the server
注意,如果安装报错:scripts/mysql_install_db: /usr/bin/perl: bad interpreter:No such file or directory
,切换到root用户,安装perl以及perl-devel,执行命令:
[root@master ~]# yum -y install perl perl-devel
9、切换到root用户,复制并修改配置文件,添加msql服务:
复制文件:
[root@master ~]# cd /usr/local/mysql/support-files/
[root@master support-files]# cp my-default.cnf /etc/my.cnf
[root@master support-files]# cp mysql.server /etc/init.d/mysql
修改文件中的两个变更值
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data/
10、配置mysql的环境变量:
[root@master ~]# vi /etc/profile
添加如下内容:
export PATH=$PATH:/usr/local/mysql/bin
保存退出,执行:
[root@master ~]# source /etc/profile
11、切换到mysql用户,启用mysql:
[mysql@localhost ~]$ chkconfig --add mysql
[mysql@localhost ~]$ chkconfig mysql on
[mysql@localhost ~]$ service mysql start
Starting MySQL.. SUCCESS!
12、设置mysql的root用户密码:
[mysql@localhost ~]$ /usr/local/mysql/bin/mysqladmin -u root password '123456'
13、root用户登录mysql:
[mysql@localhost ~]$ mysql -uroot -p
Enter password:
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
注意:当执行quit退出再重新登录,可能报ERROR 1045 (28000): Accessdenied for user ‘root’@’localhost’ (using password: YES)异常,解决方法如下: 方法一:
(1)关闭mysql
[mysql@localhost ~]$ service mysql stop
(2)屏蔽权限
[mysql@localhost ~]$ mysqld_safe --skip-grant-table
屏幕出现: Starting demo from …..
(3)新开起一个终端输入
[mysql@localhost ~]$ mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
mysql> FLUSH PRIVILEGES;
//记得要这句话,否则如果关闭先前的终端,又会出现原来的错误
mysql>quit
方法二:
(1)关闭mysql
[mysql@localhost ~]$ service mysql stop
(2)屏蔽权限
[mysql@localhost ~]$ mysqld_safe --skip-grant-table
屏幕出现: Starting demo from …..
(3)新开起一个终端输入
[mysql@localhost ~]$ mysql -u root mysql
mysql> delete from user where USER='';
mysql> FLUSH PRIVILEGES;
//记得要这句话,否则如果关闭先前的终端,又会出现原来的错误
mysql>quit
14、分享:Linux终端操作MySQL常用命令
转载于:mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz安装
15、让远程客户端可以连接mysql服务器:
使用 mysql库 :
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
查看用户表 :
mysql> SELECT `Host`,`User` FROM user;
更新用户表 :
mysql> UPDATE user SET `Host` = '%' WHERE`User` = 'root' LIMIT 1;
注:host=localhost 那此用户就不具有远程访问权限,修改为%的意思是允许所有的ip远程访问,如果需要指定具体的某个ip就写上具体的ip即可
强制刷新权限 :
mysql> flush privileges;
或者通过授权的方式:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456'
WITH GRANT OPTION;
如果需要指定具体的某个ip就把%替换成具体的ip:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.194.20' IDENTIFIED BY '123456'
WITH GRANT OPTION;
别忘记强制刷新权限 :
mysql> flush privileges;
补充,查看端口sql:
mysql> show global variables like'port';
注:如果还不通,请查看防火墙信息。
按照上面的步骤一次执行成功,不过在安装之前建议先将虚拟机做一下快照,因为一旦安装失败,再次安装mysql时会因上次安装的残留文件引发更为复杂的问题,为减少报错,重新安装时直接恢复快照较为便捷;
2)初始化mysql中hive的schema时会有:
A)state=42000,code=1061;依然使用的derby作为数据库
解决方案:https://blog.csdn.net/binyet/article/details/72871127;
B)fail to get version等报错;没有找到mysql中的metastore
解决方案:https://blog.csdn.net/lovebyz/article/details/71698267;
此时建议将hive-site.xml文件中的除连接mysql的四句保留外,其他的字段全部删除,避免不必要的错误;
3)另外,我还遇到过“Name node is in safe mode”的问题:
一检查发现是master中的namenode没有正常启动,经排查没有启动的原因是:got premature end-of-file at txid 2; expected file to go upto 4;主要是指nn和standby nn的editlog不一致:
解决方案为:执行hdfs namenode -bootstrapStandby
参考文章为:https://blog.csdn.net/hongweigg/article/details/7185328;
https://blog.csdn.net/linux_ja/article/details/51917928;
4)最后一个问题即为hive连接到了standby的namenode上,主要原因是namenode中间有过一次停止,zk将nn2调整为active,此问题重启集群就可以。
参看文章为:https://blog.csdn.net/tototuzuoquan/article/details/73002687;
上面问题搞定后,就可以正常启动hive了。
然后在hive中创建一些表信息:
然后对数据进行建表:
在hive中建一个表,然后需要往表中添加一些记录(内容写在了tj.dat文件中,以“,”分割):
然后再在hive中查询数据:
此时会报错,是因为查询方式不对,但数据已经成功导入到表中了。
在navicat中查看对应的mysql数据库为,其中就有hive的元数据表:
在columns_v2中就有相应的信息:
在浏览器上查看运行结果显示的参考网址为:
https://blog.csdn.net/bingzige/article/details/51169098;
Hive的数据存储:
Hive中的thrift将hive转换为一个服务器:
主要是启动hive下的一个hiveserver2:
然后再找一个客户端,主要是在bin下的beeline客户端:
如何连接hive的服务器:
即可,此时查询结果会相应的变快。
至此,hive的安装就完成了,如有问题,欢迎沟通~