IDEA的扩展功能
之前每次我们想要去修改集群中的一些配置文件,采用的方式是vim
,这种方式对于非常熟悉vim
命令的程序员来说是很方便的,但是对于我们大多数初学者很不友好。前面我们使用过IDEA
去编写Java
代码,这种方式十分高效,那么如果可以使用IDEA
去直接修改配置文件,那我们代码的编写效率就可以大大提升了。
在IDEA
中是有这样的功能的,接下来我们一起操作。
依次点击工具->部署->浏览远程主机
这个时候会弹出以下界面,比如我们想要连接hadoop102
,我们可以在其中填写以下内容:
- 名称:
hadoop102
- 类型:
SFTP
接下来点击图示中的...
选择SSH
配置。
此时点击+
去添加一个SSH
配置,然后填入hadoop102
的SSH
登录信息。
填写完毕后,点击测试连接。
显示成功连接就说明SSH
连接是正常的,接下来每个页面中都点击确定。
这个时候在右侧的侧边栏中就会多出一个选项,点击该选项后就可以查看远程的主机文件信息。
我们可以直接在该界面中操作远程服务器的文件系统,比如去修改配置文件获取是上传文件,都十分方便。
例如我们点击之前在hadoop
中的配置文件core-site.xml
。
双击打开文件。
打开完毕后,会在当前本地的IDEA
中打开配置文件。
并且在文件上方会显示当前文件与远程文件是否存在差异,如果我们修改了就是存在差异,会提示我们文件已修改,是否上传到远程主机进行修改,我们想要远程文件同步修改就必须点击上传按钮进行同步。
点击同步按钮后,就又会恢复到与远程文件相同的提示。
还需要注意一个文件,就是在
Windows
系统中和Linux
系统中,对于文件中的换行符是存在差异的。
Windows
:\r\n
。Linux
:\n
。我们想要在编写相关文件能够在远程的
Linux
主机中运行,还需要去修改使用IDEA
编写代码是,换行符采用\n
。依次点击
文件->设置
然后找到
编辑器->代码样式->行分隔符
,修改为Unix 和 macOS(\n)
Hive基本概念
Hive的产生背景
现在我们有了HDFS
来存储海量数据、MapReduce
来对海量数据进行分布式并行计算、Yarn
来实现资源管理和作业调度。但是面对海量数据和负责的业务逻辑,开发人员要编写MR
来对数据进行统计分析难度极大、效率较低,并且对开发者的Java
功底也有要求。所以Facebook
公司在处理自己的海量数据时开发了hive
这个数仓工具。Hive
可以帮助开发人员来做完成这些苦活(将SQL
语句转化为MapReduce
在yarn
上跑),如此开发人员就可以更加专注于业务需求了。
Hive简介
Hive
是由Facebook开源用于解决海量结构化日志的数据统计工具。Hive
是基于Hadoop
的一个数据仓库工具,将结构化的数据文件映射为一张表,并提供类SQL(HQL)
查询功能。
映射成为一张表,实际上并没有这个表。
Hive的本质
Hive
的本质实际上就是将复杂的MR
程序转化成为了简单的HQL
程序语句。
Hive
其实就是做的一个翻译工作,将HQL
语句翻译为MR
程序,然后在集群下执行任务。
Hive架构基本原理
整个框架的基本原理如图所示,其中涉及到的一些组件功能如下图所示。
MateStore
:指的是创建出来的元数据。前面讲过Hive
中的数据表都是映射出来的,那么实际使用的时候究竟是如何映射的,这个时候就需要使用到元数据去映射出具体的表。
Cli
和JDBC
:表示连接Hive
的两种方式,客户端连接和JDBC
连接。
Driver
:Hive
驱动用于客户端与服务器之间进行数据交互,驱动器又被分为4
个步骤,分别由不同的角色承担。如下所示:
SQL Parser
:将SQL
字符串转换成抽象语法树AST
,这一步一般都用第三方工具库完成,比如antlr
;对AST
进行语法分析,比如表是否存在、字段是否存在、SQL
语义是否有误。Physical Plan
:将AST编译生成逻辑执行计划。Query Optimizer
:对逻辑执行计划进行优化。Execution
:把逻辑执行计划转换成可以运行的物理计划。对于Hive
来说,就是MR/Spark
。
Hive
在执行HQL
的整个过程如下:
- 获取客户端发送过来的
HQL
代码。 - 首先由
SQL Parser
去检查HQL
代码是否有语法错误,如果有直接报错。如果没有语法错误,就会去生成一个抽象语法树AST
。 - 那么接下来就由
Physical Plan
将AST
进行编译,生成逻辑执行计划。也可以说是初步的MR
程序。 - 为了提高
MR
程序的运行效率,Query Optimizer
会去改进MR
程序的执行逻辑,使得其运行起来更高效。 Execution
去提交对应的MR
程序到集群中去执行。
Hive和数据库比较
Hive | mysql | |
---|---|---|
语言 | 类sql |
sql |
数据规模 | 大数据pb 及以上 |
数据量小一般百万左右到达单表极限 |
数据插入 | 能增加insert ,不能update ,delete |
能insert ,update ,delete |
数据存储 | Hdfs |
拥有自己的存储空间 |
计算引擎 | Mapreduce/spark/tez |
自己的引擎innodb |
综上所述,Hive
压根就不是数据库,Hive
除了语言类似以外,存储和计算都是使用Hadoop
来完成的。而Mysql
则是使用自己的,拥有自己的体系。
Hive的优缺点
优点 | 缺点 | |
---|---|---|
1. 提供了类SQL 语法操作接口,具备快速开发的能力(简单、易上手) |
1. Hive 的HQL 表达能力有限 |
1)Hive 自动生成MapReduce 作业,通常情况下不够智能化 |
2. 避免了去写MapReduce ,减少开发者的学习成本 |
2)数据挖掘方面不擅长(多个子查询),由于MapReduce 数据处理流程的限制,效率更高的算法却无法实现 |
|
3. Hive 优势在于处理大数据,在处理小数据时没有优势,因为Hive 的执行延迟较高。 |
2. Hive 的效率比较低 |
1)Hive 的执行延迟比较高,因为Hive 常用于数据分析,对实时性要求不高的场合 |
2)Hive 调优比较困难,粒度较粗 |
||
4. Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数 |
3. Hive 不支持实时查询和行级别更新 |
hive 分析的数据是存储在HDFS 上的,而HDFS 仅支持追加写,所以在Hive 中不能update 和delete ,只能select 和insert 。 |
Hive安装
修改hadoop相关参数
修改core-site.xml
1 | <!-- 配置该minglog(superUser)允许通过代理访问的主机节点 --> |
修改yarn-site.xml
1 | <!-- NodeManager使用内存数,默认8G,修改为4G内存 -->(16g物理内存的改为2g或者是3g) |
修改完后分发
1 | xsync /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml |
然后重启集群
1 | myhadoop stop |
Hive下载与解压安装
下载完后上传到/opt/software
,然后解压安装包到/opt/module
目录
1 | tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/ |
解压完成后,接下来给Hive
设置环境变量
1 | sudo vim /etc/profile.d/my_env.sh |
添加以下内容:
1 | #HIVE_HOME |
重新启动客户端,让环境变量生效。
Hive元数据部署
元数据之Derby
内嵌模式示意图:
Derby
数据库是Java
编写的内存数据库,在内嵌模式中与应用程序共享一个JVM
,应用程序负责启动和停止。
首先初始化Derby
数据库,执行以下命令:
1 | schematool -dbType derby -initSchema |
执行上述初始化元数据库时,会发现存在jar包冲突问题,现象如下:
SLF4J: Found binding in [jar:file:/opt/module/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.1.3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
出现这个问题的原因是:
hadoop
和hive
下都有这个jar
包.解决办法:以底层的
hadoop
为主,改了hive
的。
1
2
3
4 # 进入到Hive目录
cd $HIVE_HOME
mv lib/log4j-slf4j-impl-2.10.0.jar lib/log4j-slf4j-impl-2.10.0.back
初始化完毕后在Hive
目录下就会生成一个日志文件和一个数据库目录。
如果我们初始化失败,或者想要重新初始化
Hive
都需要将这两个文件删除再重新初始化。
接下来执行以下命令,即可启动hive
,并通过Cli
方式连接到hive
。
1 | hive |
启动
hive
时会出现以下的一行提示信息。该提示信息大致意思是我们没有启动
hbase
服务,这个暂时不管,后续我们讲完hbase
的时候就不会出现了。
这个时候我们就可以输入相关的SQL
命令去操作Hive
了。
例如:
- 查看当前数据库,并创建一个
people
数据表
然后向该表中插入两条数据。
可以看到此时其实就是执行的是一个
MR
任务。并且此时在
HDFS
中也会存储该文件。
在内嵌模式下只有一个JVM
进程。
这个时候再打开一个hadoop102
的SSH
窗口,输入jps
。
可以看到多出了一个RunJar
进程,但是无法看到具体的任务是什么。
可以输入-ml
参数,展示对于进程的全类名。
1 | jps -ml |
这个时候就可以看到,RunJar
进程就是CliDriver
进程,也就是Hive
的客户端进程。就是我们另外一个没有关闭的Hive
终端。
在该终端下输入hive
也进入到hive
客户端。
在该终端下输入show databases;
展示数据库,发现出现报错。
出现错误的原因是因为Hive
默认使用的元数据库为derby
并且部署方式是内嵌式,在开启Hive
之后就会独占元数据库,且不与其他客户端共享数据,如果想多窗口操作就会报错,操作比较局限。为此Hive
支持采用MySQL
作为元数据库,就可以支持多窗口操作。
元数据之mysql
直连式示意图:
Mysql安装部署
首先检查当前系统是否安装过Mysql
,如果存在就是用下列命令移除,如果不存在则忽略。(一定要做这一步)
1 | rpm -qa|grep mariadb # 如果有返回内容说明存在数据库 |
将MySQL
安装包和驱动包上传到/opt/software
目录下。
然后在/opt/software
下新创建mysql_jars
目录
1 | mkdir /opt/software/mysql_jars |
解压MySQL
安装包资源到/opt/software
下新创建的mysql_jars
目录
1 | tar -xf /opt/software/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /opt/software/mysql_jars |
进入到mysql_jars
就可以看到解压后的文件如下图所示。
接下来在mysql_jars
目录下执行以下代码进行安装:
1 | sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm |
在安装最后一条命令时可能出现以下报错。
出现这个错误的原因是因为我们采用的是最小化安装,有部分依赖没有安装完成。
采用以下命令安装解决后继续安装最后一个包。
1
2
3 sudo yum install -y libaio
sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
如果在mysql
的数据存储路径下有文件存在,需要将其全部删除,存储路径地址在/etc/my.cnf
文件中datadir
参数所对应的值:
1 | sudo rm -rf /var/lib/mysql/* |
接下来初始化mysql
数据库,会创建mysql内部数据库、表及初始化密码。
1 | sudo mysqld --initialize --user=mysql |
查看root
用户首次登录mysql
的初始密码
1 | sudo cat /var/log/mysqld.log |
此时我的初始密码就是uuSMD=wEf8!8
接下来开启mysql
服务
1 | sudo systemctl start mysqld |
然后进入到mysql
数据库
1 | mysql -uroot -p |
执行完成后输入上方的初始密码进入mysql
。
这个时候是不能够执行SQL
命令的。
提示我们需要修改初始密码,才可以操作数据库。
将初始密码修改为123456
1 | set password = password("123456"); |
默认情况下Mysql
的登录权限之开启了root
用户在本机登录。我们想要在其他节点下去使用Mysql
就必须设置允许用户在任意节点访问数据库。
1 | update mysql.user set host='%' where user='root'; |
修改完成后刷新数据库配置。
1 | flush privileges; |
这样数据库的安装就完成了。
配置Hive元数据库为Mysql
首先,将Mysql
的JDBC
驱动拷贝到Hive
的lib
目录下,供Hive
使用
1 | mv /opt/software/mysql-connector-java-5.1.37.jar /opt/module/hive-3.1.2/lib/ |
然后,配置Metastore
到MySql
,在Hive
家目录下的conf
目录下新建hive-site.xml
文件
1 | vim /opt/module/hive-3.1.2/conf/hive-site.xml |
并在文件中加入以下配置内容。
1 |
|
接下来Hive
初始化Mysql
元数据库
在初始化之前首先在Mysql
中创建metastore
数据库。
1 | mysql -uroot -p |
输入密码后执行以下SQL
命令
1 | create database metastore; |
然后初始化Hive
元数据库
1 | schematool -initSchema -dbType mysql -verbose |
初始化完成后,会在Mysql
中的metastore
数据库中生成一系列的数据表,这些数据表共同组成了Hive
的元数据功能。
这个时候再次开启Hive
1 | hive |
使用hive
执行相关命令
返回正常,Hive
功能可以使用。
接下来再次打开一个hadoop102
的SSH
窗口输入hive
,在该窗口的hive
中再次测试hive
是否可以使用。
测试结果同样正常,说明使用Mysql
作为元数据库,Hive
支持客户端并发访问。
元数据之MetaStore Server
元数据服务模式示意图:
在服务器端启动MetaStore
服务,客户端利用Thrift
协议通过MetaStore
服务访问元数据库。
元数据服务的访问方式更适合在生产环境中部署使用,相比内嵌式,该方式更加的灵活。(跨网络跨语言跨平台)
将Mysql
做为元数据库,部署元数据服务。
首先,将hive
的元数据库配置为Mysql
1 | vim conf/hive-site.xml |
在hive-site.xml
中添加如下配置信息。
1 | <!-- 指定存储元数据要连接的地址 --> |
注意:在配置了此参数后,启动
hive
之前必须先启动元数据服务,否则,hive
启动后无法连接到元数据服务。如果设置了这个参数,但是没有开启元数据服务,这个时候会导致
Hive
服务异常。在
Hive
的日志中也可以看到相关报错。
启动元数据服务。
1 | hive --service metastore |
开启元数据服务后,该SSH
窗口就会阻塞,需要重新开启一个SSH
窗口启动Hive
。
此时Hive
服务恢复正常。
这个时候再重新开启一个SSH
窗口执行以下命令,查看当前Java
进程详细信息。
1 | jps -ml |
可以看到有CliDriver
和HiveMetaStore
两个Java
进程在运行。
连接Hive的两种方式
命令行方式
- 在前面的操作中,我们都是通过
cli
的方式访问hive
的。 - 我们可以切身的体会到,通过
cli
的方式访问hive
的不足,如:cli
太过笨重,需要hive
的jar
支持。
HiveServer2模式
JDBC访问Hive示意图
JDBC方式访问Hive
JDBC
方式,本质上是将hive
包装为服务发布出去,开发者使用JDBC
的方式连接到服务,从而操作hive
,
减少了对hive
环境的依赖。
开启HiveServer2
在hive-site.xml
文件中添加如下配置信息。
1 | <!-- 指定hiveserver2连接的host --> |
重启MetaStore
服务
1 | hive --service metastore |
启动hiveserver2
服务
1 | hive --service hiveserver2 |
启动beeline
客户端
1 | beeline -u jdbc:hive2://hadoop102:10000 -n minglog |
Hive
简单使用
使用IDEA连接Mysql和Hive
连接Mysql
点击IDEA
右侧的数据库侧栏,依次点击+ -> 数据源 -> MySQL
然后下载驱动程序文件
等待下载完成即可。
然后设置MySQL
数据库的连接信息,如下所示,点击测试连接连接成功后点击确定即可。
此时在侧边栏就会生成对应的数据库连接对象。
连接Hive
首先和前面的操作一样,先在侧边栏中依次点击+ -> 数据源 -> Apache Hive
但后点击下载驱动文件。
下载完成后参照下图进行Hive
信息配置后,点击测试连接,显示连接成功后,点击确定即可。
此时在右侧的侧边栏也会多一个Hive
连接对象。
并且在IDEA
中可以添加控制台直接编写HQL
或者SQL
代码操作数据库和数据仓库。
点击相应的表也可以直接查看表中的内容。
Hive启停脚本编写
这部分的内容较为复杂,不要求掌握详细的Shell
编写流程,只需会用给出的脚本启动Hive
即可。
问题引出,之前每次我们在开启Hive
时,都需要先开启MetaStore
,再开启HiveSeriver2
,并且这两个服务在开启的时候都会把当前窗口变为监听窗口,监听服务。并且窗口还不可以关闭,如果关闭服务也随之停止,这个时候大家都应该想到了在Shell
编程中给大家讲到的nohub XXXX &
用法,可以保证服务在后台正常运行而不占用当前SSH
窗口。
脚本编写如下:
1 |
|
上述脚本写完后保存为hive2.sh
名称,赋予执行权限,然后放到用户命令下的bin
目录下。
脚本使用方式如下:
启动
Hive
1
hive2.sh start
查看
Hive
服务状态1
hive2.sh status
注意:
HiveServer2
服务开启后需要等一段时间过后在可以正常使用,刚开启完成后直接使用该命令查看状态可能显示成如下内容:此时只需稍等一段时候过后,再次查看状态就显示正常了。
关闭
Hive
1
hive2.sh stop
重启
Hive
1
hive2.sh restart
Hive常用交互命令
使用以下命令可以查看Hive
中支持的所有命令。
1 | hive -help |
其中用到最多的是两个参数:
-e
:直接指定要在Hive
中执行的SQL
命令。1
hive -e "select * from people;"
-f
:指定要在Hive
中运行的SQL
脚本。首先新建一个
SQL
脚本my_sql.sql
。1
2
3
4# 进入家目录
cd ~
# 新建sql脚本
vim my_sql.sql内容如下:
1
select * from people;
执行该脚本:
1
hive -f my_sql.sql
用这两个参数执行
SQL
代码有一个好处就是不需要提前进入Hive
客户端,而且执行完SQL
命令后也不会停留到Hive
客户端。
Hive中常见属性配置
修改Hive日志默认存储路径
默认的情况下Hive
的日志存储在以下目录/tmp/minglog/hive.log
(当前用户的临时目录下)。而/tmp
目录在Linux
中表示的是临时目录,临时目录意味着系统会定期清楚该目录中的文件,这样可能就会导致日志丢失,所以修改Hive
日志的默认存储路径是很有必要的。
修改步骤如下。
修改conf
目录下hive-log4j2.properties.template
文件名称为hive-log4j2.properties
。
在hive-log4j.properties
文件中修改log
存放位置。
1 | property.hive.log.dir=/opt/module/hive-3.1.2/logs |
然后重启Hive
。重启后在/opt/module/hive-3.1.2/logs
目录下就会生成hive.log
日志文件。
Hive启动JVM堆内存配置
新版Hive
启动时,默认申请的JVM
堆内存大小为256M
,内存太小,导致若后期开启本地模式,执行相对复杂的SQL
经常会报错:java.lang.OutOfMemoryError: Java heap space
。
解决办法为,扩大JVM
堆内存大小为1024M
,具体操作如下所示。
修改/opt/module/hive/conf/
下的hive-env.sh.template
文件为hive-env.sh
。
修改以下内容:
1 | export HADOOP_HEAPSIZE=1024 |
重启Hive
服务即可生效。
hive窗口打印默认库和表头
默认的情况下,使用命令在Hive
查看表中的数据时,是没有显示每一列的字段名称和当前表格所处数据库的,这对于不熟悉数据的开发者十分不友好,可以采用修改hive-site.xml
中hive.cli.print.current.db
和hive.cli.print.header
两个参数的值都为true
,分别打印出当前库头和表头。
1 | <!-- 打印字段名称--> |
配置完后重启Hive
。
- 配置前。
- 配置后。
直接输入hive
进入Hive
客户端,也可以看到当前选择的数据库名称。
配置参数的其他两种方式
命令行配置方式
启动hive
时,可以在命令行添加--hiveconf param=value
来设定参数。
例如,我们现在设置不让他显示库头
。
1 | hive --hiveconf hive.cli.print.current.db=false |
此时进入的hive
客户端中就不存在库头
了。
该方式设置的参数,只在当前
Hive
客户端会话中生效。当我们有些命令只想在某个配置参数下运行时,可以使用该方式设置配置参数。
在进入hive命令行交互窗口后,可使用set命令设置参数
首先,直接输入hive
进入Hive
客户端。
接下来使用以下命令设置参数。
1 | set hive.cli.print.current.db=false; |
可以看到执行完该命令后,库头就消失了。
该方式设置的参数,也是只在当前
Hive
客户端会话中生效。当我们有些命令只想在某个配置参数下运行时,可以使用该方式设置配置参数。
总结:现在我们一共讲了3
种设置参数的方法。
- 修改
hive-site.xml
文件内容。 - 命令行配置方式。
- 在进入hive命令行交互窗口后,可使用set命令设置参数。
这三种方式的优先级如下所示:3 > 2 > 1
。