赞
踩
Hive是基于Hadoop的数据仓库工具,可以用来对HDFS中存储的数据进行查询和分析。Hive能够将HDFS上结构化的数据文件映射为数据库表,并提供SQL查询功能,将SQL语句转变成MapReduce任务来执行。Hive通过简单的SQL语句实现快速调用MapReduce机制进行数据统计分析,因此不必专门开发MapReduce应用程序即可实现大数据分析。
Hive对存储在HDFS中的数据进行分析和管理,它可以将结构化的数据文件映射为一张数据库表,通过SQL查询分析需要的内容,查询Hive使用的SQL语句简称Hive SQL(HQL)。Hive的运行机制使不熟悉MapReduce的用户也能很方便地利用SQL语言对数据进行查询、汇总、分析。同时,Hive也允许熟悉MapReduce开发者们开发自定义的Mappers和Reducers来处理内建的Mappers和Reducers无法完成的复杂的分析工作。Hive还允许用户编写自己定义的函数UDF,用来在查询中使用。
优点:
1.简单容易上手 提供了类SQL的查询语言HQL。
2.热扩容 不需要重启服务Hive即可自由的扩展集群计算节点的规模。
3.延展性强 Hive支持用户自定义函数,用户可以根据自己的需求来编写功能函数,在Hive中实现调用,扩展Hive的计算能力。
4.可扩展强 为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统)。
5.元数据管理 提供统一的元数据管理。
6.容错行强 Hive具有良好的容错性,某个或某几个计算节点出现故障时,Hive仍可利用其它正常的计算节点完成计算任务执行。
缺点:
1.Hive的HQL表达能力有限,更适用于完成基础的数据分析任务。
2.Hive的效率比较低。
3.Hive调优比较困难,可优化程度不高。
4.Hive计算过程可控性差。
1.Hive与Hadoop的关系
Hive构建在Hadoop之上,HQL中对查询语句的解释、优化、生成查询计划是由Hive完成的。Hive读取的所有数据都是存储在Hadoop文件系统中。Hive查询计划被转化为MapReduce任务,在Hadoop中执行。
2.Hive与数据库的异同
由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。MapReduce开发人员可以把自己写的Mapper和Reducer作为插件支持Hive做更复杂的数据分析。它与关系型数据库的SQL略有不同,但支持了绝大多数的语句(如DDL、DML)以及常见的聚合函数、连接查询、条件查询等操作。
Hive不适合用于联机(online)事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive的特点是可伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive的入口是DRIVER,执行的SQL语句首先提交到DRIVER驱动,然后调用COMPILER解释驱动,最终解释成MapReduce任务执行,最后将结果返回。
Hive组件需要基于Hadoop系统进行安装。因此,在安装Hive组件前,需要确保Hadoop系统能够正常运行。本章节内容是基于之前已部署完毕的Hadoop全分布系统,在master节点上实现Hive组件安装。
Hive组件的部署规划和软件包路径如下:
(1)当前环境中已安装Hadoop全分布系统。
(2)本地安装MySQL数据库(账号root,密码Password123$),
软件包在/opt/software/mysql-5.7.18路径下。
(3)MySQL端口号(3306)。
(4)MySQL的JDBC驱动包/opt/software/mysql-connector-java-5.1.47.jar,
在此基础上更新Hive元数据存储。
(5)Hive软件包/opt/software/apache-hive-2.0.0-bin.tar.gz。
(1)使用root用户,将Hive安装包
/opt/software/apache-hive-2.0.0-bin.tar.gz路解压到/usr/local/src路径下。
[root@master ~]# tar -zxvf /opt/software/apache-hive-2.0.0-bin.tar.gz -C /usr/local/src
(2)将解压后的apache-hive-2.0.0-bin文件夹更名为hive;
[root@master ~]# mv /usr/local/src/apache-hive-2.0.0-bin usr/local/src/hive
(3)修改hive目录归属用户和用户组为hadoop
[root@master ~]# chown -R hadoop:hadoop /usr/local/src/hive
(1)将Linux系统中/opt/sofeware/mysql-5.7.18.rar包移动到home目录下并下载到windows系统中
[root@master ~]# mv /opt/sofeware/mysql-5.7.18.rar ~/
(2)解压Windows中的mysql-5.7.18.rar
(3)将这5个rpm文件上传到Linux系统中
(4)将文件移动到/opt/sofeware/mysql-5.7.18/目录下
[root@master ~]# mkdir /opt/sofeware/mysql-5.7.18/
[root@master ~]# mv ~/*.rpm /opt/software/mysql-5.7.18/
(5)按如下顺序依次按照MySQL数据库的mysql common、mysql libs、mysql client软件包。
[root@master ~]# cd /opt/software/mysql-5.7.18/ # MySQL软件包路径
[root@master ~]# rpm -ivh mysql-community-common-5.7.18-1.el7.x86_64.rpm
[root@master ~]# rpm -ivh mysql-community-libs-5.7.18-1.el7.x86_64.rpm
[root@master ~]# rpm -ivh mysql-community-client-5.7.18-1.el7.x86_64.rpm
(6)安装mysql server软件的两个依赖软件包。
[root@master ~]# yum install -y net-tools
[root@master ~]# yum install -y perl
(7)将以下配置信息添加到/etc/my.cnf文件symbolic-links=0配置信息的下方。
default-storage-engine=innodb
innodb_file_per_table
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server=utf8
(8)启动MySQL数据库
[root@master ~]# systemctl start mysqld
(9)查询MySQL数据库状态。
mysqld进程状态为active (running),则表示MySQL数据库正常运行。
如果mysqld进程状态为failed,则表示MySQL数据库启动异常。此时需要排查/etc/my.cnf文件。
[root@master ~]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since 一 2020-05-11 16:28:27 CST; 1h 26min ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 941 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
Process: 911 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 944 (mysqld)
CGroup: /system.slice/mysqld.service
└─944 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
(10)查询MySQL数据库默认密码。
MySQL数据库安装后的默认密码保存在/var/log/mysqld.log文件中,在该文件中以password关键字搜索默认密码。
[root@master ~]# cat /var/log/mysqld.log | grep password
2020-05-07T02:34:03.336724Z 1 [Note] A temporary password is generated for root@localhost: MPg5lhk4?>Ui #默认密码为MPg5lhk4?>Ui
MySQL数据库是安装后随机生成的,所以每次安装后生成的默认密码不相同。
(11)MySQL数据库初始化。
执行mysql_secure_installation命令初始化MySQL数据库,初始化过程中需要设定数据库root用户登录密码,密码需符合安全规则,包括大小写字符、数字和特殊符号,可设定密码为Password123$。
在进行MySQL数据库初始化过程中会出现以下交互确认信息:
1)Change the password for root ? ((Press y|Y for Yes, any other key for No)表示是否更改root用户密码,在键盘输入y和回车。
2)Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No)表示是否使用设定的密码继续,在键盘输入y和回车。
3)Remove anonymous users? (Press y|Y for Yes, any other key for No)表示是否删除匿名用户,在键盘输入y和回车。
4)Disallow root login remotely? (Press y|Y for Yes, any other key for No)表示是否拒绝root用户远程登录,在键盘输入n和回车,表示允许root用户远程登录。
5)Remove test database and access to it? (Press y|Y for Yes, any other key for No)表示是否删除测试数据库,在键盘输入y和回车。
6)Reload privilege tables now? (Press y|Y for Yes, any other key for No) 表示是否重新加载授权表,在键盘输入y和回车。
(12) 添加root用户从本地和远程访问MySQL数据库表单的授权。
mysql> grant all privileges on *.* to root@'localhost' identified by 'Password123$'; # 添加root用户本地访问授权
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> grant all privileges on *.* to root@'%' identified by 'Password123$'; # 添加root用户远程访问授权
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges; # 刷新授权
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user where user='root'; # 查询root用户授权情况
+------+-----------+
| user | host |
+------+-----------+
| root | % |
| root | localhost |
+------+-----------+
2 rows in set (0.00 sec)
mysql> exit; # 退出MySQL数据库
Bye
(1)设置Hive环境变量并使其生效。
[root@master ~]# vi /etc/profile # 在文件末尾追加以下配置内容
# set hive environment
export HIVE_HOME=/usr/local/src/hive
export PATH=$PATH:$HIVE_HOME/bin
source /etc/profile # 使环境变量配置生效
(2)修改Hive组件配置文件。
切换到hadoop用户执行以下对Hive组件的配置操作。
将/usr/local/src/hive文件夹下hive-default.xml.template文件,更名为hive-site.xml。
[root@master ~]# su - hadoop
[hadoop@master ~]$ cp /usr/local/src/hive/conf/hive-default.xml.template /usr/local/src/hive/conf/hive-site.xml
(3)通过vi编辑器修改hive-site.xml文件实现Hive连接MySQL数据库,并设定Hive临时文件存储路径。
[hadoop@master ~]$ vi /usr/local/src/hive/conf/hive-site.xml
1)设置MySQL数据库连接。
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
2)配置MySQL数据库root的密码。
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Password123$</value>
<description>password to use against metastore database</description>
</property>
3)验证元数据存储版本一致性。若默认false,则不用修改。
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
<description>
Enforce metastore schema version consistency.
True: Verify that version information stored in is compatible with one from Hive jars. Also disable automatic
False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.
</description>
</property>
4)配置数据库驱动。
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
5)配置数据库用户名javax.jdo.option.ConnectionUserName为root。
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>Username to use against metastore database</description>
</property>
(1)将MySQL数据库驱动文件/opt/software/mysql-connector-java-5.1.47.jar
拷贝到Hive安装目录的/usr/local/src/hive/lib目录下。
[hadoop@master ~]$ exit # 返回到root用户登录状态
[root@master ~]# cp ~/mysql-connector-java-5.1.47.jar /usr/local/src/hive/lib
[root@master ~]# chown -R hadoop:hadoop /usr/local/src/hive/lib/mysql-connector-java-5.1.47.jar
[root@master ~]# su - hadoop # 再次切换到hadoop用户
(2)删除/usr/local/src/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar
文件,若未删除该文件会导致Hive元数据初始化失败。
[hadoop@master ~]$ rm -f /usr/local/src/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar
(3)启动Hadoop相关进程。
[hadoop@master ~]$ start-all.sh
(4)分布在master、slave1、slave2三个节点执行JPS命令检查Hadoop进程运行是否正常。需要关注进程ID号每次启动会发生变化。
master:
[hadoop@master ~]$ jps # master节点
1152 NameNode
1472 ResourceManager
1330 SecondaryNameNode
2025 Jps
slave1:
[root@slave1 ~]# su - hadoop # slave1节点
[hadoop@slave1 ~]$ jps
1173 NodeManager
1322 Jps
1069 DataNode
slave2:
[root@slave2 ~]# su - hadoop # slave2节点
[hadoop@slave2 ~]$ jps
1076 DataNode
1317 Jps
1180 NodeManager
(4)初始化Hive元数据。
使用schematool升级元数据,将Hive的元数据重新写入MySQL数据库中。
[hadoop@master ~]$ schematool -initSchema -dbType mysql
Metastore connection URL: jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: root
Starting metastore schema initialization to 2.0.0
Initialization script hive-schema-2.0.0.mysql.sql
Initialization script completed
schemaTool completed
以上命令结果显示schemaTool completed,则表示Hive元数据写入MySQL数据库成功
若执行schematool -initSchema -dbType mysql显示schemaTool failed报错,很可能是
[hadoop@master ~]$ schematool -initSchema -dbType mysql
Metastore connection URL: jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: root
Starting metastore schema initialization to 2.0.0
Initialization script hive-schema-2.0.0.mysql.sql
Error: Duplicate key name 'PCS_STATS_IDX' (state=42000,code=1061)
org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !!
*** schemaTool failed ***
解决方法:可以删除MySQL中的hive数据库后,重新执行schematool -initSchema -dbType mysql处理。
(1)在系统的任意目录下,执行hive命令即可启动Hive组件。
[hadoop@master ~]$ hive
Logging initialized using configuration in jar:file:/usr/local/src/hive/lib/hive-common-2.0.0.jar!/hive-log4j.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/src/hive/lib/hive-jdbc-2.0.0-standalone.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.slf4j.impl.Log4jLoggerFactory]
hive>
(2)执行exit命令退出Hive命令行状态。
hive> exit;
[hadoop@master ~]$
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。