hive:基于Hadoop的数据仓库工具
·可将结构化的数据文件映射为一张表,并提供类SQL(HQL)的语法
·本质:将HQL转换成Mapreduce程序
·Hive处理的数据存储在HDFS上
·Hive分析数据底层的实现是Mapreduce
·执行过程运行在Yarn上
Hive的优缺点
·优点
·操作接口采用类SQL语法,简单、容易上手
·避免去写MapReduce,减少开发人员的学习成本
·Hive优势在于处理大数据,支持海量数据的分析与计算
·Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
·缺点
·Hive的HQL表达能力有限
·Hive自动生成的MapReduce作业,通常不够智能
·数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法无法实现
·Hive的效率比较低
·Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合
·Hive调优比较困难
·Hive不支持实时性查询和行级别更新
·Hive分析的数据存储在hdfs上,hsfs不支持随机写,只支持追加写,所以Hive不建议update和delete,能select和insert
Hive的架构原理
·hive提供两种客户端,一种自带的客户端通过hive命令进入;另一种通过JDBC,外部方式访问< 需要hive启动一个服务,专门作为JDBC的服务方式>
·Driver包含四个器
·SQL Parser解析器
检查语法是否错误,以及查询的库、表、列是否存在
·Physical Plan编译期
生成逻辑执行计划
·Query Optimizer优化器
对执行计划进行优化
·Execution 执行器
封装成MR运行
Hive与数据库的区别
·查询语言
·数据更新
hive不建议对数据进行读写
·执行延迟
hive执行延迟高
·数据规模
hive支持很大规模的数据
Hive的安装与配置
·配置Hadoop的core-site.xml,因为hive并非是hadoop自身的东西,需要对hive开放权限
< property>
< name> hadoop.proxyuser.atguigu.hosts</ name>
< value> *</ value>
</ property>
< property>
< name> hadoop.proxyuser.atguigu.groups</ name>
< value> *</ value>
</ property>
< property>
< name> hadoop.proxyuser.atguigu.users</ name>
< value> *</ value>
</ property>
·配置yarn-site.xml
< property>
< description> Amount of physical memory, in MB, that can be allocated
for containers. If set to -1 and
yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
automatically calculated(in case of Windows and Linux).
In other cases, the default is 8192MB.
</ description>
< name> yarn.nodemanager.resource.memory-mb</ name>
< value> 4096</ value>
</ property>
< property>
< description> The minimum allocation for every container request at the RM in MBs. Memory requests lower than this will be set to the value of this property. Additionally, a node manager that is configured to have less memory than this value will be shut down by the resource manager.
</ description>
< name> yarn.scheduler.minimum-allocation-mb</ name>
< value> 512</ value>
</ property>
< property>
< description> The maximum allocation for every container request at the RM in MBs. Memory requests higher than this will throw an InvalidResourceRequestException.
</ description>
< name> yarn.scheduler.maximum-allocation-mb</ name>
< value> 4096</ value>
</ property>
< property>
< description> Whether virtual memory limits will be enforced for
containers.</ description>
< name> yarn.nodemanager.vmem-check-enabled</ name>
< value> false</ value>
</ property>
·解压Hive的jar包
·添加环境变量
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
·解决日志jar包冲突
·hive下lib的log4j-slf4j-impl会与hadoop中的日志jar冲突,修改其中一个
·hive的日志默认在/tmp下
·初始化元数据库
bin/schematool -dbType derby -initSchema
会在/opt/module/hive下生成一个元数据库目录 metastore_db
derby的问题
·存在悲观锁,不支持多线程
mysql的安装
·检查当前系统是否存在mariadb,mariadb是一个微型mysql,与mysql冲突
·查看
rpm -qa | grep mariadb
·卸载
sudo rpm -e --nodeps mariadb-libs //nodeps无需考虑依赖,强制卸载
·解压Mysql安装包
tar包解压---> tar -xf --->rpm包内有很多文件
·在安装目录下执行rpm安装,下载的话使用yum -remove 基础包,删除/var/lib/mysql
·sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm 基础包
·sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
·sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
·sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
·sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
按照顺序依次执行,如果Linux是最小化安装,在安装mysql-community-server-5.7.28-1.el7.x86_64.rpm,需要执行sudo yum install -y libaio
·查看/etc/my.cof中datadir指向目录,如果不为空删除目录下内容
·初始化数据库
·sudo mysqld --initialize --user=mysql
·查看临时生成的root用户密码
·sudo cat /var/log/mysqld.log
·启动Mysql
·sudo systemctl start mysqld
·sudo systemctl status mysqld 查看mysql服务的状态
·登录MySQL数据库
·mysql -uroot -p //临时生成的密码
·修改root用户的密码
·set password = password("123456")
·修改mysql库下user表中的root用户允许任意ip连接
·update mysql.user set host='%' where user='root'
·flush privileges
Hive元数据配置到mysql
·将jdbc驱动拷贝到/hive/lib目录下
·指定jdbc四要素,驱动、url、账号、密码
·在/hive/conf下创建hive-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
< configuration
<!-- jdbc连接的URL -- >
< property>
< name> javax.jdo.option.ConnectionURL</ name>
< value> jdbc:mysql://hadoop102:3306/metastore?useSSL=false</ value>
</ property>
< property>
< name> javax.jdo.option.ConnectionDriverName</ name>
< 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.warehouse.dir</ name>
< value> /user/hive/warehouse</ value>
</ property>
</ configuration>
·初始化hive元数据库
·schematool -initSchema -dbType mysql -verbose
·会生成74个存储元数据的表;TAB_COL_STATS存储表的元数据
使用元数据服务的方式访问hive
·算是一种hive连接mysql的一种优化;多个hive同时操作mysql,会使mysql的压力变大;通过元数据服务的方式,元数据作为mysql和hive之间的中间项,元数据对hive的操作进行管理和排序,使mysql的压力减少;
·在hive-site.xml配置元服务
< property>
< name> hive.metastore.uris</ name>
< value> thrift://hadoop102:9083</ value>
</ property>
·启动metastore服务
·hive --service metastore
启动过,启动窗口不能再进行任何操作,需要重新打开一个shell窗口
·启动hive
使用JDBC方式访问hive
·在hive-site.xml中添加配置
< property>
< name> hive.server2.thrift.bind.host</ name>
< value> hadoop102</ value>
</ property>
< property>
< name> hive.server2.thrift.port</ name>
< value> 10000</ value>
</ property>
< property>
< name> hive.server2.active.passive.ha.enable</ name>
< value> true</ value>
</ property>
·启动hiveserver2
·bin/hive --service hiveserver2
·在一个新的shell窗口启动beeline客户端
·bin/beeline -u jdbc:hive2://hadoop102:10000 -n gq
开启元服务与jdbc的脚本
·后台命令
·nohup:放在命令开头,表示不挂起,同时将正确信息放入固定文件
·/dev/null :一个文件,所有写入改文件的内容都会被自动丢弃
·Linux只有3种流
·标准输入流 0 键盘录入
·标准输出流 1 打印正确结果,默认控制台
·错误输出流 2 打印错误结果,默认控制台
2>&1:表示将错误重定向到标准输出流上
&:放在命令结尾,表示后台运行
·一般会组合使用:nohup [xxx 命令操作]>file 2>&1 &
表示将xxx命令运行的结果输出到file中,并保持命令启动的进行在后台运行
·nohup hive --service metastore 2>&1 &
·nohup hive --service hiveserver2 2>*1 &
·metestore和jdbc服务开启脚本
#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
mkdir -p $HIVE_LOG_DIR
fi
#检查进程是否运行正常,参数1为进程名,参数2为进程端口
function check_process()
{
pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
echo $pid
[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}
function hive_start()
{
metapid=$(check_process HiveMetastore 9083)
cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
[ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
server2pid=$(check_process HiveServer2 10000)
cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
}
function hive_stop()
{
metapid=$(check_process HiveMetastore 9083)
[ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
server2pid=$(check_process HiveServer2 10000)
[ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
}
case $1 in
"start")
hive_start
;;
"stop")
hive_stop
;;
"restart")
hive_stop
sleep 2
hive_start
;;
"status")
check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
;;
*)
echo Invalid Args!
echo 'Usage: '$(basename $0)' start|stop|restart|status'
;;
esac