一、Hive简介
Hive是一个基于 Hadoop的文件系统上的数据仓库架构。它为数据仓库的管理提供了许多功能:数据 ETL (抽取、转换和加载)工具、数据存储管理和大型数据集的查询与分析能力。同时 Hive 还定义了类 SQL 的语言 ― Hive QL , Hive QL 允许用户进行和 SQL 相似的操作。 Hive QL 还允许开发人员方便地使用 mapper 和 reducer 操作,这样对 MapReduce 框架是一个强有力的支持。
由干 Hadoop 是批量处理系统,任务是高延迟性的,所以在任务提交和处理过程中会消耗一些时间成本。同样,即使 Hive 处理的数据集非常小(比如几百 MB ) ,在执行时也会出现延迟现象。这样, Hive 的性能就不可能很好地和传统的 Oracle 数据库进行比较了。 Hive 不能提供数据排序和查询cache功能,也不提供在线事务处理,不提供实时的查询和记录级的更新,但 Hive 能更好地处理不变的大规模数据集(例如网络日志)上的批量任务。所以, Hive 最大的价值是可扩展性(基于 Hadoop 平台,可以自动适应机器数目和数据量的动态变化)、可延展性(结合 MaPReduce 和用户定义的函数库),并且拥有良好的容错性和低约束的数据输入格式。
二、Hive 的数据存储
Hive 的存储是建立在 Hadoop 文件系统之上的。 Hive 本身没有专门的数据存储格式,也不能为数据建立索引,用户可以非常自由地组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符就可以解析数据了。 Hive 中主要包含四类数据模型:表( Table )、外部表( Extemal Table )、分区( P 叭 ition ) 和桶( Bucket )。 Hive 中的表和数据库中的表在概念上是类似的,每个表在 Hive 中都有一个对应的存储目录。例如,一个表 htable 在 HDFS 中的路径为阳区 tawarehouse / h table ,其中, / datawarehouse 是 hivc 一 sitc . xml 配置文件中由${ hive . metastore . warehouse . dir }指定的数据仓库的目录,所有的表数据(除了外部表)都保存在这个目录中。
三、Hive 的元数据存储
由于 Hive 的元数据可能要面临不断的更新、修改和读取,所以它显然不适合使用 Hadoop 文件系统进行存储。目前 Hive 将元数据存储在 RDBMS 中,比如 MySQL 、 Derby 中, Hive 有三种模式可以连接到 Derby 数据库: l ) Single User Mode ,此模式连接到一个 In - memo 尽(内存)数据库 Derby ,一般用于单元测试; 2 ) Multi User Modc ,通过网络连接到一个数据库中,是最常使用的模式; 3 ) Remote Server Mode ,用于非 Java 客户端访问元数据库,在服务器端启动一个 MetaStoreServer ,客户端利用 Thrift 协议通过 MetaStoreServer 访问元数据库。
四、系统环境
[hadoop@MASTER ~]$ cat /etc/redhat-release
CentOS release 6.6 (Final)
本机已安装hadoop
主机名 IP
MASTER 192.168.231.160
SLAVER01 192.168.231.161
SLAVER02 192.168.231.162
五、mysql5.5.62在非root用户下二进制安装
(也可以在root用户下直接Yum安装,更方便,但是也要创建hive数据库,及hive用户,可以参考下面的)
我的hadoop是在hadoop用户目录下创建的,所以mysql及Hive也安装在hadoop用户目录下。
1.解压
tar xf mysql-5.5.62-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.5.62-linux-glibc2.12-x86_64 mysql
2.编辑mysql配置文件my.cnf
cd mysql/support-files/
cp my-huge.cnf my.cnf
vim my.cnf
#添加入下内容
[client]
#password = your_password
port = 3306
socket = /home/hadoop/mysql/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /home/hadoop/mysql/mysql.sock
basedir=/home/hadoop/mysql
datadir=/home/hadoop/mysql/data
pid-file=/home/hadoop/mysql/mysql.pid
log_error=/home/hadoop/mysql/error.log
3.初始化数据库
#--defaults-file后为my.cnf路径,--basedir为mysql路径,--datadir为data路径
[hadoop@MASTER ~]$/home/hadoop/mysql/scripts/mysql_install_db --defaults-file=/home/hadoop/mysql/support-files/my.cnf --basedir=/home/hadoop/mysql --datadir=/home/hadoop/mysql/data --socket=/home/hadoop/mysql/socket
#初始化成功,为0成功,其它失败
[hadoop@MASTER ~]$ echo $?
0
4.替换mysqld_safe和mysql.server文件中的路径,根据自己的路径修改(如果mysql路径本身为/usr/local/mysql,就不用修改)
[hadoop@MASTER support-files]$ sed 's#/usr/local#/home/hadoop#g' /home/hadoop/mysql/bin/mysqld_safe /home/hadoop/mysql/support-files/mysql.server -i
5.启动mysql
# '&'后台运行,运行过程中不动,回车就行,此时mysql已启动,不需要再启动
[hadoop@MASTER ~]$/home/hadoop/mysql/bin/mysqld_safe --defaults-file=/home/hadoop/mysql/support-files/my.cnf &
6.添加环境变量
[hadoop@MASTER ~]$ vim .bash_profile
#mysql
export MYSQL_HOME=/home/hadoop/mysql
export PATH=$PATH:$MYSQL_HOME/bin
#使环境变量生效
[hadoop@MASTER ~]$source .bash_profile
7.进入Mysql修改root用户密码
2018.12.21 #如果数据库进不去,就把mysql目录中的mysql.pid删除,并再次开启mysql服务
#第一次进入,密码为空
[hadoop@MASTER ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 39
Server version: 5.5.62 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#修改密码
mysql> set password=password('root')
-> ;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
#创建hive数据库,为下边做准备
mysql> create database hive;
Query OK, 1 row affected (0.00 sec)
mysql> create user 'hive'@'MASTER' identified by 'hive';
#授权,其中MASTER为本地主机名,已在hosts中做域名解析
mysql> grant all privileges on *.* to 'hive'@'MASTER' identified by 'hive';
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
exit
8.开启、重启、关闭数据库
#开启数据库
[hadoop@MASTER ~]$ ./mysql/support-files/mysql.server start
#重启数据库
[hadoop@MASTER ~]$ ./mysql/support-files/mysql.server restart
#关闭数据库
[hadoop@MASTER ~]$ ./mysql/support-files/mysql.server stop
六、Hive安装
1.解压安装包
[hadoop@MASTER ~]$ tar xf apache-hive-2.3.4-bin.tar.gz
[hadoop@MASTER ~]$ mv apache-hive-2.3.4-bin hive
2.添加环境变量
[hadoop@MASTER ~]$ vim .bash_profile
#hive
export HIVE_HOME=/home/hadoop/hive
export PATH=$PATH:$HIVE_HOME/bin
#使环境变量生效
[hadoop@MASTER ~]$ source .bash_profile
3.查看
[hadoop@MASTER ~]$ hive --version
Hive 2.3.4
Git git://daijymacpro-2.local/Users/daijy/commit/hive -r 56acdd2120b9ce6790185c679223b8b5e884aaf2
Compiled by daijy on Wed Oct 31 14:20:50 PDT 2018
From source with checksum 9f2d17b212f3a05297ac7dd40b65bab0
6.1 mysql作为Hive的元数据库
1.编辑hive-site.xml(上一次修改后,粘贴错了,以下为修改后的)
[hadoop@MASTER ~]$ cd hive/conf/
[hadoop@MASTER conf]$ cp hive-default.xml.template hive-site.xml
#可以把内容全部删除,添加下面内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--MASTER为主机名-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://MASTER:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<!--数据库用户名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<!--MYSQL用户名密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
<!--mysql驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
</configuration>
2.编辑hive-env.sh
[hadoop@MASTER conf]$ cp hive-env.sh.template hive-env.sh
[hadoop@MASTER conf]$ vim hive-env.sh
#在文末添加,java,hadoop,hive环境变量
export JAVA_HOME=/home/hadoop/jdk1.8.0_151
export HADOOP_HOME=/home/hadoop/hadoop
export HIVE_HOME=/home/hadoop/hive
3.把mysql-connector-java-5.1.47-bin.jar复制到hive/lib下
网盘链接:https://pan.baidu.com/s/17Vqz9WlRFij9lmNSR6CvHg
mv mysql-connector-java-5.1.47-bin.jar /home/hadoop/hive/lib
4.初始化schema
[hadoop@MASTER conf]$ schematool -dbType mysql -initSchema
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/hive/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL: jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: hive
Starting metastore schema initialization to 2.3.0
Initialization script hive-schema-2.3.0.mysql.sql
Initialization script completed
schemaTool completed
注意:设置安全模式为leave,否则执行hive会报错
[hadoop@MASTER conf]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
5.执行hive(已启动HDFS)
#启动hdfs
start-all.sh
[hadoop@MASTER ~]$ hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/hive/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/
SLF4J: Found binding in [jar:file:/home/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4s]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Logging initialized using configuration in jar:file:/home/hadoop/hive/lib/hive-common-2.3.4.ja
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider u using Hive 1.X releases.
hive>
6.2 Hive客户端配置
1.把hive文件复制到从节点
[hadoop@MASTER ~]$ scp -r hive [email protected]:/home/hadoop
[hadoop@MASTER ~]$ scp -r hive [email protected]:/home/hadoop
2.添加hive环境变量
#SLAVER01客户端
[hadoop@SLAVER01 ~]$ vim .bash_profile
#hive
export HIVE_HOME=/home/hadoop/hive
export PATH=$PATH:$HIVE_HOME/bin
[hadoop@SLAVER01 ~]$ source .bash_profile
#SLAVER02客户端
[hadoop@SLAVER02 ~]$ vim .bash_profile
#hive
export HIVE_HOME=/home/hadoop/hive
export PATH=$PATH:$HIVE_HOME/bin
[hadoop@SLAVER02 ~]$ source .bash_profile ’
3.修改hive-site.xml
#MASTER为Hive服务器主机名,SLAVER01和SLAVER02都需要修改
[hadoop@SLAVER01 ~]$ vim hive/conf/hive-site.xml
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://MASTER:9083</value>
</property>
</configuration>
[hadoop@SLAVER01 ~]$ vim hive/conf/hive-site.xml
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://MASTER:9083</value>
</property>
</configuration>
4.Hive服务端启动(已经启动HDFS,start-all.sh)
#后台启动
[hadoop@MASTER ~]$ hive --service metastore &
5.启动后会发现RunJar
6.3 Hive测试
Hive服务端访问
1.进入
[hadoop@MASTER ~]$ hive
创建数据库
hive> create database hive_2;
OK
Time taken: 5.806 seconds
显示库
hive> show databases;
OK
default
h1
hive_2
Time taken: 0.168 seconds, Fetched: 3 row(s)
2.查看HDFS变化(生成hive_2.db)
3.查看数据库
[hadoop@MASTER ~]$ mysql -uhive -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hive |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use hive;
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 * from DBS;
+-------+-----------------------+--------------------------------------------------+---------+------------+------------+
| DB_ID | DESC | DB_LOCATION_URI | NAME | OWNER_NAME | OWNER_TYPE |
+-------+-----------------------+--------------------------------------------------+---------+------------+------------+
| 1 | Default Hive database | hdfs://MASTER:9000/user/hive/warehouse | default | public | ROLE |
| 6 | NULL | hdfs://MASTER:9000/user/hive/warehouse/h1.db | h1 | hadoop | USER |
| 11 | NULL | hdfs://MASTER:9000/user/hive/warehouse/hive_2.db | hive_2 | hadoop | USER |
+-------+-----------------------+--------------------------------------------------+---------+------------+------------+
3 rows in set (0.00 sec)
Hive客户端访问
[hadoop@SLAVER01 ~]$ hive
hive> show databases;
OK
default
h1
hive_2
Time taken: 1.348 seconds, Fetched: 3 row(s)
[hadoop@SLAVER02 ~]$ hive
hive> show databases;
OK
default
h1
hive_2
Time taken: 1.231 seconds, Fetched: 3 row(s)
创建成功!
参考文档
[1]https://blog.csdn.net/wangshuminjava/article/details/79303824
[2]http://www.cnblogs.com/dxxblog/p/8193967.html
[3]https://blog.csdn.net/u013967628/article/details/82867422