前言
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计。
Hive:提供一个大数据的SQL的接口,不做计算。用来做数据分析。
使用Mysql保存元数据信息:字段、字段类型、分割方式、存储方式。
数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理中的决策制定。
注意
安装Hive前提是要先安装Hadoop集群,并且Hive只需要在Hadoop的Namenode节点集群里安装即可。
虽然修改配置文件并不需要你已经把Hadoop跑起来,但是启动Hive的前提也是需要Hadoop在正常运行,所以建议先将其他基础环境安装好。
版本
| 名称 |
版本 |
| Hadoop |
2.7.7 |
| MySql |
5.7 |
| Hive |
2.1.0 |
Hive的使用场景
从上面的理解介绍可以简单掌握Hive的特点:
优点:
1、使用SQL语法查询,不用再去写复杂的MapReduce程序,减少开发成版本,上手快。
2、基于MapReduce算法,所以在处理大数据时,优势非常明显
3、可以支持自定义函数,计算能力强
缺点:
1、Hive的执行延迟比较高,这是因为启动并运行一个MapReduce程序本身需要消耗非常多的资源
2、Hive的HQL语句表达能力有限,并且他是基于模板实现的,所以通常不够智能化,很多复杂的大数据计算无法支持,比如迭代式计算
3、Hive处理大数据量非常擅长,但是处理小数据量就没有优势了。
针对与优点和缺点总结:
所以,Hive通常适用于大数据的OLAP场景,做一些面向分析,允许有延迟的数据挖掘工作,并且结合其他组件也可以做一些数据清洗之类的简单数据处理工作。
Hive是针对数据仓库来进行设计的,这种场景下,通常是读多写少。并且数据都是来自外部的HDFS,所以Hive中不建议做数据的修改操作,所有的数据最好是在加载的时候就已经确定好了。
安装Mysql
https://www.psvmc.cn/article/2018-06-25-mysql-tips.html
安装
1 2 3 4 5 6 7
| curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum makecache yum install wget
wget -i https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum localinstall -y mysql57-community-release-el7-10.noarch.rpm yum repolist enabled | grep mysql
|
安装mysql 服务器 命令:
1
| yum install -y mysql-community-server --nogpgcheck
|
启动mysql 命令:
查看mysql是否自启动,并且设置开启自启动 命令:
1 2
| chkconfig --list | grep mysqld chkconfig mysqld on
|
配置修改
表名/编码/连接数/数据包大小
设置表名不区分大小写/字符编码/连接数
修改 /etc/my.cnf
添加以下的5行
1 2 3 4 5 6
| [mysqld] lower_case_table_names=1 character_set_server = utf8 max_connections = 1000 max_allowed_packet = 100M sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
|
重启
修改密码
默认密码
打开日志文件
找到密码
1
| [Note] A temporary password is generated for root@localhost: tr&:DeYtt8+k
|
修改密码:
MySQL 5.7推荐使用ALTER USER修改密码
MySQL修改用户的密码主要有:ALTER USER 和UPDATE用户表
ALTER USER
推荐用此方式
连接上以后
1 2 3 4 5
| set global validate_password_policy=0; set global validate_password_length=1; alter user user() identified by "123456"; flush privileges; quit
|
允许远程登录
1 2 3
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; FLUSH PRIVILEGES; quit
|
设置密码永不过期
1 2
| ALTER USER 'root'@'%' PASSWORD EXPIRE NEVER; flush privileges;
|
Hive安装及配置
下载与安装
https://dlcdn.apache.org/hive/hive-2.1.0/
解压
1
| tar -zxvf apache-hive-2.1.0-bin.tar.gz -C /data/tools/bigdata/
|
环境变量
添加环境变量
创建配置文件
1
| vi /etc/profile.d/hive.sh
|
加入:
1 2
| export HIVE_HOME=/data/tools/bigdata/apache-hive-2.1.0-bin export PATH=$HIVE_HOME/bin:$PATH
|
配置立即生效
查看ZK_HOME
复制Jar
复制Mysql连接的JAR
1
| cp mysql-connector-java-8.0.28.jar $HIVE_HOME/lib/
|
复制jdbc的jar
1
| cp $HIVE_HOME/jdbc/hive-jdbc-2.1.0-standalone.jar $HIVE_HOME/lib/
|
修改配置
进入目录
配置重命名
1 2 3
| cp hive-default.xml.template hive-site.xml cp hive-env.sh.template hive-env.sh cp hive-log4j2.properties.template hive-log4j.properties
|
创建文件夹
1 2
| mkdir -p /data/tools/bigdata/zdata/hive/tmp mkdir -p /data/tools/bigdata/zdata/hive/logs
|
hive-site.xml
hive-site.xml中修改下面的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.7.102:3306/metastore?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useSSL=false</value> <description></description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.cj.jdbc.Driver</value> <description></description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description></description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> <description></description> </property> <property> <name>hive.cli.print.current.db</name> <value>true</value> <description></description> </property> <property> <name>hive.cli.print.header</name> <value>true</value> <description></description> </property> <property> <name>hive.fetch.task.conversion</name> <value>more</value> <description></description> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> <description></description> </property> <property> <name>hive.metastore.schema.verification</name> <value>true</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://hadoop01:9083</value> </property>
<property> <name>hive.server2.long.polling.timeout</name> <value>5000ms</value> <description></description> </property> <property> <name>hive.server2.thrift.bind.host</name> <value>hadoop01</value> <description></description> </property> <property> <name>hive.server2.enable.doAs</name> <value>false</value> <description></description> </property> </configuration>
|
注意
value中不能换行。
一个大坑,我在部署的时候一直不行,后来发现时javax.jdo.option.ConnectionURL对应的value的值太长,VSCode自动给换行了。
删除换行就可以了,真是奇葩。
hive-log4j.properties
修改hive-log4j.properties配置
1
| property.hive.log.dir = /data/tools/bigdata/zdata/hive/logs/
|
配置分发
1 2 3 4 5 6 7
| ssh hadoop02 "rm -rf $HIVE_HOME" ssh hadoop03 "rm -rf $HIVE_HOME" ha-fenfa.sh $HIVE_HOME
ha-fenfa.sh /etc/profile.d/hive.sh ssh hadoop02 "source /etc/profile && echo $HIVE_HOME" ssh hadoop03 "source /etc/profile && echo $HIVE_HOME"
|
初始化库
Hive的数据库MySQL在安装的时候没有初始化
在MySQL中
1 2 3 4
| drop database metastore;
create database metastore;
|
命令行中执行
1 2
| $HIVE_HOME/bin/schematool -dbType mysql -initSchema
|
否则会报错
java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.Session
在Hive中无法执行任何命令
开启元数据服务
1
| nohup hive --service metastore >/dev/null 2>&1 &
|
查看Schema信息
1
| schematool -dbType mysql -info
|
可以看到
目录权限
修改HDFS系统中关于Hive的一些目录权限
1 2 3 4
| hadoop fs -mkdir -p /user/hive/warehouse
hadoop fs -chmod 777 /tmp/ hadoop fs -chmod 777 /user/hive/warehouse
|
启动Hive
查询表
Java中JDBC操作
添加依赖
1 2 3 4 5
| <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>2.1.0</version> </dependency>
|
Java中创建数据库和表
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package cn.psvmc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class HiveTest { private static final String driverName = "org.apache.hive.jdbc.HiveDriver"; private static final String url = "jdbc:hive2://192.168.7.101:10000/default";
private static final String user = "root"; private static final String password = "";
private static Statement stmt = null; private static final ResultSet rs = null;
public static void init() throws Exception { Class.forName(driverName); Connection conn = DriverManager.getConnection(url, user, password); stmt = conn.createStatement(); } public static void createDatabase() throws Exception { String sql = "create database hive_jdbc_test"; System.out.println("Running: " + sql); stmt.execute(sql); }
public static void createTable() throws Exception { String sql = "create table if not exists hive_jdbc_test.tuser(id int,name string)"; System.out.println("Running: " + sql); stmt.execute(sql); }
public static void main(String[] args) throws Exception { init(); createTable(); } }
|
JDBC读取数据
读取数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;
public class HiveTest { public static void main(String[] args) throws Exception { Statement stmt; ResultSet rs; Class.forName("org.apache.hive.jdbc.HiveDriver"); String url = "jdbc:hive2://192.168.7.101:10000/default"; String uname = "hive"; String pwd = ""; Connection conn = DriverManager.getConnection(url, uname, pwd); System.out.println(conn.getClass().getName()); stmt = conn.createStatement(); String sql = "select * from t_user"; rs = stmt.executeQuery(sql); while (rs.next()) { int id = rs.getInt("ID"); String name = rs.getString("NAME"); System.out.printf("id:%s name:%s%n", id + "", name); } } }
|