ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Hive的介绍和部署

Hive的介绍和部署 一、Hive简介Hive 是一个框架可以通过编写sql的方式自动的编译为MR任务的一个工具。在这个世界上会写SQL的人远远大于会写java代码的人所以假如可以将MR通过sql实现这个将是一个巨大的市场FaceBook就这么干。脸书在大数据中发展趋势所有的技术全部都变为SQL。1、Hive是一个数据仓库工具2、可以将数据加载到表中编写sql进行分析3、底层依赖Hadoop所以每一次都需要启动hadoop(hdfs以及yarn)4、Hive的底层计算框架可以使用MR、也可以使用Spark、TEZ5、Hive不是数据库而是一个将MR包了一层壳儿。类似于一个中介。Hive官网地址Apache HiveGitHub地址 GitHub - apache/hive: Apache Hive · GitHub文档查看地址https://cwiki.apache.org/confluence/display/Hive/GettingStarted目前我们可以采用稳定版realease4.0.1Hive天然的就是当做数据仓库使用的。什么是数据仓库?数据仓库不是某一款存储软件是面向分析、经过统一清洗整合的数据集 整套架构存储只是它的底座Oracle 是关系型数据库可作为小型数仓的承载载体Hive 是大数据生态下构建分布式数仓的 SQL 查询引擎为了高效取用数据数仓必须做分层设计这套分层、表结构、维度事实表的设计工作就是数据建模和实体仓库分区管理逻辑相二、Hive体系结构图注意- 包含*的全表查询比如select * from table 不会生成MapRedcue任务- 包含*的limit查询比如select * from table limit 3 不会生成MapRedcue任务三、本地模式安装下载hive安装包并上传hive的下载地址(包含历史归档版本)https://archive.apache.org/dist/hive/上传压缩包 /opt/modules解压tar -zxvf apache-hive-4.0.1-bin.tar.gz -C /opt/installs/重命名mv apache-hive-4.0.1-bin hive配置hive环境变量配置环境变量vi /etc/profile.d/myenv.shexport HIVE_HOME/opt/installs/hiveexport PATH$PATH:$HIVE_HOME/bin刷新环境变量source /etc/profile配置hive-env.sh配置hive-env.sh进入这个文件夹下cd /opt/installs/hive/confcp hive-env.sh.template hive-env.sh修改hive-env.sh 中的内容vim hive-env.shexport HIVE_CONF_DIR/opt/installs/hive/confexport JAVA_HOME/opt/installs/jdkexport HADOOP_HOME/opt/installs/hadoopexport HIVE_AUX_JARS_PATH/opt/installs/hive/libexport HADOOP_HEAPSIZE2048配置hive的log日志位置修改hive的log的位置cp hive-log4j2.properties.template hive-log4j2.properties打开 hive-log4j2.properties (从hive-log4j2.properties.template 重命名得来)将property.hive.log.dir ${sys:java.io.tmpdir}/${sys:user.name}修改为: property.hive.log.dir /opt/installs/hive/logs启动集群(hadoop)如果以前没有启动hadoop集群可以一下start-all.sh在hdfs创建hive相关文件夹hdfs dfs -mkdir -p /user/hive/warehouse hdfs dfs -mkdir -p /tmp/hive/ hdfs dfs -chmod 777 /user/hive/warehouse hdfs dfs -chmod 777 /tmp/hive使用mysql存储hive核心元数据使用本地模式的最大特点是将元数据从derby数据库变为mysql数据库并且支持多窗口同时使用。第一步检查你的mysql是否正常systemctl status mysqld第二步进入到conf 文件夹下创建这个文件hive-site.xml,t添加如下内容?xml version1.0 encodingUTF-8 standaloneno? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl?!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the License); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --configuration !--配置MySql的连接字符串-- property namejavax.jdo.option.ConnectionURL/name valuejdbc:mysql://localhost:3306/hive?createDatabaseIfNotExisttrue/value descriptionJDBC connect string for a JDBC metastore/description /property !--配置MySql的连接驱动-- property namejavax.jdo.option.ConnectionDriverName/name valuecom.mysql.cj.jdbc.Driver/value descriptionDriver class name for a JDBC metastore/description /property !--配置登录MySql的用户-- property namejavax.jdo.option.ConnectionUserName/name valueroot/value descriptionusername to use against metastore database/description /property !--配置登录MySql的密码-- property namejavax.jdo.option.ConnectionPassword/name value123456/value descriptionpassword to use against metastore database/description /property !-- 以下两个不需要修改只需要了解即可 -- !-- 该参数主要指定Hive的数据存储目录 -- property namehive.metastore.warehouse.dir/name value/user/hive/warehouse/value /property !-- 该参数主要指定Hive的临时文件存储目录 -- property namehive.exec.scratchdir/name value/tmp/hive/value /property /configuration第三步将mysql的驱动包上传至 hive 的lib 文件夹下第四步初始化元数据本质就是在mysql中创建数据库并且添加元数据schematool --initSchema -dbType mysql我们打开数据库可以看到现在自动创建和初始化了hive数据库我们再使用命令验证一下是hive否安装成功在 Hive 4.0 中hive命令默认直接启动Beeline这是官方为了强制弃用旧版 CLI所做的设计变更。你设置的环境变量USE_DEPRECATED_CLItrue在 Hive 4.0 中已经失效无法再通过这种方式切换回旧版界面。如果你确实需要使用旧版 CLI 的交互体验直接使用 Beeline 的“嵌入式模式”推荐这是官方推荐的替代方案它不需要启动 HiveServer2直接在本地启动一个 Hive 进程体验与旧版 CLI 几乎一致命令如下beeline -u jdbc:hive2://进入后可以编写sql 0: jdbc:hive2:// show databases; OK default -- 进入后可以执行下面命令进行操作 0: jdbc:hive2://show databases; -- 查看数据库 0: jdbc:hive2://show tables; -- 查看表 -- 创建表 0: jdbc:hive2:// create table dog(id int,name string); 0: jdbc:hive2:// select * from dog; 0: jdbc:hive2:// insert into dog values(1,wangcai); 0: jdbc:hive2:// desc dog; -- 查看表结构 0: jdbc:hive2:// !quit -- 退出实际上当我们执行insert语句的时候hive会将它转换成MapReduce任务不过我们不用关心后台的处理稍微了解下这个过程就行。然后在hdfs的hive目录下已经能看到刚才创建的dog表注意mysql仅仅只是存储hive的元数据我们创建的表还是存在刚才配置的hdfs中四、Hive的远程模式比如你想通过Dbeaver操作hive这个时候必须开启远程模式。1、创建临时目录cd /opt/installs/hive/ mkdir iotmp chmod 777 iotmp2、前期准备工作hive-site.xml 追加!--Hive工作的本地临时存储空间-- property namehive.exec.local.scratchdir/name value/opt/installs/hive/iotmp/root/value /property !--如果启用了日志功能则存储操作日志的顶级目录-- property namehive.server2.logging.operation.log.location/name value/opt/installs/hive/iotmp/root/operation_logs/value /property !--Hive运行时结构化日志文件的位置-- property namehive.querylog.location/name value/opt/installs/hive/iotmp/root/value /property !--用于在远程文件系统中添加资源的临时本地目录-- property namehive.downloaded.resources.dir/name value/opt/installs/hive/iotmp/${hive.session.id}_resources/value /propertyhive.downloaded.resources.dir:在 hdfs 上下载的一些资源会被存放在这个目录下hive 一定要小写否则报cause: java.net.URISyntaxException: Illegal character in path at index 26: /opt/installs/hive/iotmp/${Hive.session.id}_resources/json-serde-1.3.8-jar-with-dependencies.jar修改 core-site.xml【hadoop】的property namehadoop.proxyuser.root.hosts/name value*/value /property property namehadoop.proxyuser.root.groups/name value*/value /property property namehadoop.http.staticuser.user/name valueroot/value /property !-- 不开启权限检查 -- property namedfs.permissions.enabled/name valuefalse/value /property重启hdfsstop-dfs.sh start-dfs.sh3、开始配置远程服务两个配置 hiveserver2服务修改hive-site.xmlproperty namehive.server2.thrift.bind.host/name valuebigdata001/value descriptionBind host on which to run the HiveServer2 Thrift service./description /property property namehive.server2.thrift.port/name value10000/value descriptionPort number of HiveServer2 Thrift interface when hive.server2.transport.mode is binary./description /property可以启动1. 该服务端口号默认是100002. 可以单独启动此服务进程供远程客户端连接此服务内置metastore服务。3. 启动方式方法1直接调用hiveserver2。会进入监听状态不退出。方法2hive --service hiveserver2 # 进入后台启动方法3nohup hive --service hiveserver2 /dev/null 21 #信息送入黑洞。演示第一种启动方式hiveserver2出现二个 Hive Session ID 就可以连接了。我们开启一个新窗口使用beeline进行测试hive4.0 以后hive这个命令不让使用了而是需要使用beeline这个命令连接方式方式1step1. beeline 回车step2. !connect jdbc:hive2://bigdata001:10000 回车step3. 输入用户名 回车 rootstep4. 输入密码 回车 此处没有密码方法2(直连)beeline -u jdbc:hive2://bigdata001:10000 -n 用户名解析:hive2是Hive的协议名称ip: Hiveserver2服务所在的主机IP。10000是Hiveserver2的端口号退出Ctrl C 可以退出客户端而且当我们成功开启hiveserver2的时候使用jps查询会多出一个名叫RunJar的进程然后如果能找到这个进程里面的hiveserver2信息说明就成功了。如果想结束hiveserver2直接kill -9 进程号配置 metastore 服务metastore服务意义为别人连接mysql元数据提供服务的。以上这个图是 hive3.x 的示意图现在 hive4.0 之后已经没有 hive 的客户端形式了。警告假如 hive 直接进入的操作了数据库其实底层已经帮助创建了一个metastore服务器可能叫ms01通过hiveserver2 运行的命令默认底层帮你创建了一个metastore服务器可能叫ms02假如有很多人连接我的mysql就会有很多个metastore非常的占用资源。解决方案就是配置一个专门的metastore,只有它可以代理mysql服务别人必须经过它跟mysql进行交互。这样解决内存。修改hive-site.xml修改hive-site.xml的配置 注意想要连接metastore服务的客户端必须配置如下属性和属性值 property namehive.metastore.uris/name valuethrift://bigdata001:9083/value /property 解析thrift:是协议名称 ip为metastore服务所在的主机ip地址 9083是默认端口号启动方式方法1hive --service metastore 方法2nohup hive --service metastore 21 /dev/null #信息送入黑洞。解析21 /dev/null 意思就是把错误输出2重定向到标准输出1也就是屏幕标准输出进了“黑洞”也就是标准输出进了黑洞错误输出打印到屏幕。Linux系统预留可三个文件描述符0、1和2他们的意义如下所示0——标准输入stdin-- System.in1——标准输出stdout--System.out2——标准错误stderr --System.err警告只要配置了metastore以后必须先启动metastore否则报错我们先启动metastore然后启动hiveserver2然后我们使用jps查看到两个RunJar进程分别对应hiveserver2 和 metastore后面如果想单独关闭直接杀对应进程就行了。测试没有启动metastore 服务器之前hive进入报错hive show databases;FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient启动之后直接测试发现可以使用。hive show databases;OKdefaultTime taken: 1.211 seconds, Fetched: 1 row(s)4、使用客户端工具连接Hive我们先看Hadoop启动了没因为Hive是需要在Hadoop上运行的。进入虚拟机可以看到Hadoop没有运行我们先启动Hadoop再次查看hadoop是否正确运行start-all.sh然后检查你的 metastore和hiveserver2是否启动ps -ef|grep metastoreps -ef|grep hiveserver2也可以使用jps查看到两个RunJar进程分别对应hiveserver2 和 metastore如果出现下面的情况就是已经运行了假如没有启动 nohup hive --service metastore 21 /dev/null nohup hive --service hiveserver2 21 /dev/null 由于没办法看到2个session ID,等一下。然后过一会再次验证可以看到已经成功了接下来使用dbeaver工具连接可以看连接成功然后就可以写SQL了当然Hive相较于Mysql等数据库还有其他的强大特性后面会说到五、启动hiveserver2、metastore的脚本经常启动metastore 以及hiveserver2这两个服务命令有点长为了长期使用可以编写一个命令#!/bin/bash # hive 服务控制脚本可以控制 Hive 的 metastore 和 hiveserver2 服务的启停 # 使用方式: hive-server-manager.sh [start|stop|status] [metastore|hiveserver2] # - start : 一键开启metastore和hiveserver2服务也可以指定服务开启 # - stop : 一键停止metastore和hiveserver2服务也可以指定服务停止 # - status : 一键查看metastore和hiveserver2服务也可以指定服务查看 help_info() { echo --------------------------------------------------------------------------------- echo | 本脚本可以一键控制 Hive 的 metastore 和 hiveserver2 服务 | echo | 使用方式: hive-server-manager.sh [start|stop|status] [metastore|hiveserver2] | echo --------------------------------------------------------------------------------- echo | 第一个参数用来指定操作命令可以选择 开始(start)、停止(stop)、状态查看(status) | echo | 第二个参数用来指定操作的服务可以选择 metastore、hiveserver2默认为全部 | echo --------------------------------------------------------------------------------- echo | - start : 一键开启metastore和hiveserver2服务也可以指定服务开启 | echo | - stop : 一键停止metastore和hiveserver2服务也可以指定服务停止 | echo | - status : 一键查看metastore和hiveserver2服务也可以指定服务查看 | echo --------------------------------------------------------------------------------- exit -1 } # 获取操作命令 op$1 # 获取操作的服务 server$2 # 检查参数是否正确 if [ ! $op ]; then help_info elif [ $op ! start -a $op ! stop -a $op ! status ]; then help_info fi # 检查进程状态 metastore_pidps aux | grep org.apache.hadoop.hive.metastore.HiveMetaStore | grep -v grep | awk {print $2} hiveserver2_pidps aux | grep proc_hiveserver2 | grep -v grep | awk {print $2} # 检查日志文件夹的存在情况如果不存在则创建这个文件夹 log_dir/var/log/my_hive_log if [ ! -e $log_dir ]; then mkdir -p $log_dir fi # 开启服务 start_metastore() { # 检查是否开启如果未开启则开启 metastore 服务 if [ $metastore_pid ]; then echo metastore 服务已经开启进程号: $metastore_pid已跳过 else nohup hive --service metastore $log_dir/metastore.log 21 echo metastore 服务已经开启日志输出在 $log_dir/metastore.log fi } start_hiveserver2() { # 检查是否开启如果未开启则开启 hiveserver2 服务 if [ $hiveserver2_pid ]; then echo hiveserver2 服务已经开启进程号: $hiveserver2_pid已跳过 else nohup hive --service hiveserver2 $log_dir/hiveserver2.log 21 echo hiveserver2 服务已经开启日志输出在 $log_dir/hiveserver2.log fi } # 停止服务 stop_metastore() { if [ $metastore_pid ]; then kill -9 $metastore_pid fi echo metastore 服务已停止 } stop_hiveserver2() { if [ $hiveserver2_pid ]; then kill -9 $hiveserver2_pid fi echo hiveserver2 服务已停止 } # 查询服务 status_metastore() { if [ $metastore_pid ]; then echo metastore 服务已开启进程号: $metastore_pid else echo metastore 服务未开启 fi } status_hiveserver2() { if [ $hiveserver2_pid ]; then echo hiveserver2 服务已开启进程号: $hiveserver2_pid else echo hiveserver2 服务未开启 fi } # 控制操作 if [ ! $server ]; then ${op}_metastore ${op}_hiveserver2 elif [ $server metastore ]; then ${op}_metastore elif [ $server hiveserver2 ]; then ${op}_hiveserver2 else echo 服务选择错误 help_info fi上传到环境变量的目录下选一个目录下没有脚本的 /usr/local/bincd /usr/local/binchmod 777 hive-server-manager.sh停止开启
返回列表