Hive(一)---- 简介和安装部署


1、什么是Hive

1)hive 简介
Hive:由 Facebook 开源用于解决海量结构化日志的数据统计工具。
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。

2) Hive 本质:将 HQL 转化成 MapReduce 程序

在这里插入图片描述

  • Hive 处理的数据存储在 HDFS
  • Hive 分析数据底层的实现是 MapReduce
  • 执行程序运行在 Yarn 上

2、Hive的优缺点

2.1 优点

  • 操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)。

  • 避免了去写 MapReduce,减少开发人员的学习成本。

  • Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。

  • Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较 高。

  • Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

2.2 缺点

1)Hive 的 HQL 表达能力有限

  • 迭代式算法无法表达
  • 数据挖掘方面不擅长,由于 MapReduce 数据处理流程的限制,效率更高的算法却无法实现。

2)Hive 的效率比较低

  • Hive 自动生成的 MapReduce 作业,通常情况下不够智能化
  • Hive 调优比较困难,粒度较粗

3、Hive架构原理

在这里插入图片描述

  1. 用户接口:Client
    CLI(command-line interface)、JDBC/ODBC(jdbc 访问 hive)、WEBUI(浏览器访问 hive)

  2. 元数据:Metastore
    元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、 表的类型(是否是外部表)、表的数据所在目录等;实际上就是将Hive中的表和HDFS的路径做一个映射关系;默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore。

  3. Hadoop
    使用 HDFS 进行存储,使用 MapReduce 进行计算。

  4. 驱动器:Driver
    (1)解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第 三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。
    (2)编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
    (3)优化器(Query Optimizer):对逻辑执行计划进行优化。
    (4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说,就是 MR/Spark。
    在这里插入图片描述


4、Hive和数据库比较

由于 Hive 采用了类似 SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在 Online 的应用中,但是 Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。

  • 查询语言
    由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发,二者比较相似。

  • 数据更新
    由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的

  • 执行延迟
    Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。 当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。

  • 数据规模
    由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据;数据库可以支持的数据规模较小。


5、Hive的三种部署模式

Hive 的安装模式分为 3 种,分别是嵌入模式、本地模式和远程模式。下面这对这 3 种模式进行介绍。

(1)嵌入模式:使用内嵌的 Derby 数据库存储元数据,这种方式是 Hive 的默认安装方式,配置简单,但是同一个目录下一次只能连接一个客户端,适合用来测试,不适合生产环境。

(2)本地模式:采用外部数据库(一般是 MySQL) 存储元数据,该模式是一个多用户的模式,运行多个客户端连接到一个数据库中。该模式一般作为公司内部同时使用 Hive。该模式不需要单独开启 Metastore 服务,因为 Hive 服务和 Metastore 服务运行在同一个进程中,MySQL 是单独的进程,可以与 Hive 在同一台机器上,也可以在远程机器上。

(3)远程模式:此模式应用于 Hive 客户端较多的情况。与本地模式一样,远程模式也是采用外部数据库(一般是 MySQL)存储元数据。不同的是,远程模式需要单独开启 Metastore 服务,然后每个客户端都在配置文件中配置连接该 Metastore 服务。远程模式中,Metastore 服务和 Hive 运行在不同的进程中

【本地模式没有单独开启服务和端口,其他第三方框架等无法访问;而远程模式有单独服务和端口,可以访问。】


6、Hive的部署

Hive没有集群的概念,实际上就是一个对HDFS数据进行处理的一个客户端。

准备hive、Linux版的mysql、mysql-connector,这里所使用的版本如下:

apache-hive-3.1.2-bin.tar.gz
mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
mysql-connector-java-5.1.37-bin.jar

链接:https://pan.baidu.com/s/1Q7tjHrX4uP2dVckd52pjUA
提取码:5tmi

注意:使用mysql储存Metastore,所以Hive将要访问mysql,Hive需要有mysql-connector驱动,此时Hive也可以看作是一个访问mysql的客户端。

6.1 Hive嵌入模式部署

  1. 解压hive

    tar -zxvf /opt/software/apache-hive-3.1.2- bin.tar.gz -C /opt/module/
    
  2. 修改名字

    mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive-3.1.2
    
  3. 添加环境变量

    sudo vim /etc/profile
    

    在c中添加hive的所在路径
    在这里插入图片描述

  4. 更新/etc/profile文件

    source /etc/profile
    
  5. 解决日志 Jar 包冲突
    实际上是将一个文件进行改名

    mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.6.2.bak
    
  6. 初始化元数据库
    默认的就是derby

    bin/schematool -dbType derby -initSchema
    

    在这里插入图片描述
    自此初始化完成,现在可以进行使用Hive。

  7. 启动并使用 Hive

    先简单介绍下hive中的bin目录
    在这里插入图片描述
    :hive是依赖于HDFS的,所以启动hive前,请先启动HDFS集群和yearn集群

    bin/hive
    

    启动成功
    在这里插入图片描述
    顺便再说下:hive默认的存放log日志的目录是 /tem/userNamer,userName表示你登入hive所用的用户名。当启动hive失败时可以通过查看log寻找错误。

    使用hive
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

6.2 Hive本地模式部署

虽然hive已经可以正常使用,但derby仅支持单用户使用。下面进行mysql的安装和用mysql存放metastone。

  1. hive文件配置
    将之前的mysql-connector复制到hive的lib目录下;在conf目录下创建一个hive-site.xml文件一边配置。
    在这里插入图片描述
    将下列信息写入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>
    
            <!-- jdbc 连接的 Driver-->
            <property>
                    <name>javax.jdo.option.ConnectionDriverName</name>
                    <value>com.mysql.jdbc.Driver</value>
            </property>
    
            <!-- jdbc 连接的 username-->
            <property>
                    <name>javax.jdo.option.ConnectionUserName</name>
                    <value>root</value>
            </property>
    
            <!-- jdbc 连接的 password -->
            <property>
                    <name>javax.jdo.option.ConnectionPassword</name>
                    <value>000000</value>
            </property>
    
            <!-- Hive 默认在 HDFS 的工作目录 -->
            <property>
                    <name>hive.metastore.warehouse.dir</name>
            <value>/user/hive/warehouse</value>
            </property>
    
    		<!-- 当前库 和表信息 -->
        	<property>
                <name>hive.cli.print.header</name>
                <value>true</value>
       		 </property>
    
       		 <property>
                <name>hive.cli.print.current.db</name>
                <value>true</value>
       		 </property>
    
    	    <!-- Hive 元数据存储版本的验证 默认对derby数据库进行验证-->
            <property>
                <name>hive.metastore.schema.verification</name>
                <value>false</value>
            </property>
            
    
            <!--元数据存储授权-->
            <property>
                <name>hive.metastore.event.db.notification.api.auth</name>
                <value>false</value>
            </property>
    
    </configuration>
    
    

    hive.metastore.schema.verification:强制metastore的schema一致性,开启的话会校验在metastore中存储的信息的版本和hive的jar包中的版本一致性,并且关闭自动schema迁移,用户必须手动的升级hive并且迁移schema,关闭的话只会在版本不一致时给出警告,默认是false不开启;

  2. mysql解压

    tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
    

    在这里插入图片描述

  3. 查看当前是否安装过mysql

    rpm -qa|grep mariadb
    

    在这里插入图片描述
    若有,删除

    sudo rpm -e --nodeps mariadb-libs
    
    

    在这里插入图片描述

  4. 安装服务
    将刚刚解压得到的部分压缩包进行安装

    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
    
    

    mysql-community-common (服务器和客户端库的公共文件);
    mysql-community-libs(MySQL 数据库客户端应用程序的共享库);
    mysql-community-libs-compat(MySQL 之前版本的共享兼容库);
    mysql-community-client(MySQL 客户端应用程序和工具);
    mysql-community-server(数据库服务器和相关工具)。
    在这里插入图片描述

  5. 删除/etc/my.cnf 文件(mysql的配置信息)中 datadir 指向的目录下的所有内容
    datadir指向的目录实际上是mysql存放数据的地方
    在这里插入图片描述
    由于是新装的mysql,所以里面没有内容
    在这里插入图片描述

  6. 初始化mysql和查看mysql临时产生的密码

    sudo mysqld --initialize --user=mysql 
    sudo cat /var/log/mysqld.log 
    

    在这里插入图片描述

  7. 登入mysql和修改密码
    在这里插入图片描述注:mysql是开机自启的,所以第一次开启之后,以后不需要再次手动启动。

  8. 修改 mysql 库下的 user 表中的 root 用户允许任意 ip 连接
    在这里插入图片描述
    当前只能本机的root用户可以连接mysql,这明显是不行,其他的主机也要能够连接mysql。对root用户的Host进行修改。

    update mysql.user set host='%' where user='root';
    flush privileges;
    
  9. mysql下建立metastore数据库和初始化hive
    在这里插入图片描述
    注:创建的元数据库名字要和前面hive配置的数据库名字要一致。

  10. 修改hive的log日志地址
    hive的log日志默认地址是 /tmp/userName/hive.log,当磁盘空间不足时/tmp中的数据会被优先删除,安全性不高。

    在conf目录中

    • 将hive-log4j2.properties.template文件改名为hive-log4j2.properties
    mv hive-log4j2.properties.template hive-log4j2.properties
    
    • 在hive-log4j2.properties 文件中修改 log 存放位置
    hive.log.dir=/opt/module/hive/logs 
    

到此,部署完成。


6.3 Hive远程模式部署

将hive中的相关进程比如hiveserver2或者metastore这样的进程单独开启,使用客户端工具或者命令行进行远程连接这样的服务,即远程模式。客户端可以在任何机器上,只要连接到这个server,就可以进行操作。客户端可以不需要密码。

  1. metastore(元数据)服务

    在hive-site.xml 文件中添加如下配置信息

    <!-- 指定存储元数据要连接的地址 -->
    <property>
    	<name>hive.metastore.uris</name>
    	<value>thrift://hadoop102:9083</value>
    </property>
    

    thrift:协议名称
    hadoop102:metastore服务所在的主机ip地址
    9083:默认端口号

    启动服务

    1. 此服务才是真正连接元数据库的服务进程
    2. 也可以让远程客户端连接
    3. 启动方式:
    	方法1:
    		- hive --service metastore &
    	方法2:
        	- hive --service metastore 2>&1 >/dev/null &; #信息送入黑洞。
    
    

    客户端访问
    【为了方便,只进行了命令行连接】

    bin/hive
    
  2. hiveserver2服务
    Hiveserver2服务 依赖于 metastore服务 ,所以前面的 metastore服务必须先启动
    在hive-site.xml 文件中添加如下配置信息

    
    <!-- 指定 hiveserver2 连接的 host -->
    <property>
         <name>hive.server2.thrift.bind.host</name>
    	 <value>hadoop102</value>
    </property>
    
    <!-- 指定 hiveserver2 连接的端口号 -->
    <property>
        <name>hive.server2.thrift.port</name>
    	<value>10000</value>
    </property>
    
    
    

    启动服务

    1. 该服务端口号默认是10000
    2. 可以单独启动此服务进程,供远程客户端连接;此服务内置metastore服务。
    3. 启动方式:
    
        方法1:
            直接调用hiveserver2。会进入监听状态不退出。
        方法2:
            hive --service hiveserver2 & 进入后台启动
        方法3:
            hive --service hiveserver2 2>&1 >/dev/null &; #信息送入黑洞。
    
    

    客户端访问

    【为了方便,只进行了命令行连接】

    方式1:
       	step1. beeline 回车
       	step2. !connect jdbc:hive2://ip:10000 回车
       	step3. 输入用户名 回车
       	step4. 输入密码 回车
    方法2(直连):
    	1. beeline -u jdbc:hive2://ip:10000 -n 用户名
    
    解析: 
    	hive2,是hive的协议名称
    	ip:  hiveserver2服务所在的主机IP。
    	10000,是hiveserver2的端口号
    
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以按照以下步骤将 Hive 的配置文件 `hive-site.xml` 导入 SparkSQL 中: 1. 将 `hive-site.xml` 文件复制到 Spark 的配置目录下。默认情况下,Spark 的配置目录是 `$SPARK_HOME/conf`,其中 `$SPARK_HOME` 是 Spark 的安装路径。 2. 在 SparkSQL 中创建一个 `SparkSession` 对象,并在创建之前设置一些相关的配置项。可以参考下面的示例代码: ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession .builder() .appName("SparkSQL with Hive integration") .config("spark.sql.warehouse.dir", "/user/hive/warehouse") // 设置 Hive 仓库目录 .config("hive.metastore.uris", "thrift://localhost:9083") // 设置 Hive Metastore 的连接地址 .enableHiveSupport() // 启用 Hive 支持 .getOrCreate() ``` 在上面的示例中,您需要根据您的实际环境修改 `spark.sql.warehouse.dir` 和 `hive.metastore.uris` 的值。`spark.sql.warehouse.dir` 是 Hive 仓库目录的路径,`hive.metastore.uris` 是 Hive Metastore 的连接地址。 3. 使用 `spark.sql` 对象执行 Hive 相关的操作。例如,您可以执行 SQL 查询、创建表等。下面是一个简单的示例: ```scala spark.sql("SELECT * FROM my_table").show() ``` 上述代码将执行一条查询语句,从名为 `my_table` 的 Hive 表中检索数据,并将结果显示在控制台上。 请注意,您还需要确保 Spark 和 Hive 的版本兼容,并且 Hive Metastore 服务正在运行。另外,如果您的 Spark 集群和 Hive Metastore 服务部署在不同的机器上,您需要相应地修改 `hive.metastore.uris` 的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值