Hive

Hive学习笔记总结,未完待续


前言

关于hive日常学习总结的笔记


提示:以下是本篇文章正文内容,下面案例可供参考

一、学习回顾

1.MapReduce中补充

  • 分片的规则:决定了Map个数,取决于输入的类ileInputFormat会将输入的文件分歌城split。split的个数决定了map的个数。(文件的大小dfs.block.size:默认128M)
    • 默认输入类:TextInputFormat
      • 输入的文件是否大于128M的1.1倍
      • 如果大于,128M一个块对应一个分片
      • 如果小于,整个作为一个分片
    • 分片的方法:getSplits
  • MapReduce Join
    • Reduce Join
      • 特点:通过让两份数据经过shuffle,将相同的关联字段进行分组,在reduce中实现join
      • 场景:大数据 join 大数据
    • Map Join
      • 特点:join发生在Map端,不用经过shuffle,将 小数据放入分布式缓存中,与大数据的每个部分进行join
      • 场景:小数据 join 大数据

2,YARN

  • 架构以及Mapreduce程序在YARN上运行的流程
  • YARN的调度机制(3中)
    • FIFO
      • 单队列,内部还是FIFO
      • 问题:不能实现多个程序并行,导致资源浪费
        • Mapreduce v1中默认的通过4个Slot管理资源
    • Capacity:容量调度
      • Apache版本的Hadoop默认的调度机制
      • 多队列,队列内部还是FIFO
      • 允许动态资源抢占
    • Fair:公平调度
      • CDH版本的默认调度机制
      • 多队列,每个队列内部公平共享资源
      • 允许动态资源抢占,提供了权重机制

3.hive

  • 功能

    • 功能一:将HDFS文件映射成Hive中的数据

    • 功能二:将HQL语句转换为计算的程序

      • 默认转换为Mapreduce程序:hive.default.engine=mr

      • spark,tez

    • 重点思考:这两个功能底层是如何设计实现的?

      • == 功能是如何实现的? ==
        • 构建HDFS文件 与Hive表的映射索引
        • 例如: select * from tbname
          • 通过记录表与文件的关系
          • 当对表操作时,就根据映射关系,处理对应的文件
          • 在hive中创建表
create table tbname(
	根据文件的内容来定义字段
)
row format delimited fields terminated by ',';
--指定以‘,’作为分隔符 
  • 将文件与表进行关联
load data inpath 'filepath' into table tbname;
  • 元数据中记录了文件与表的映射关系
  • 测试
use db_test;
create table tb_lianjia(
	xiaoqu string,
	huxing string,
	area double,
	region string,
	floor string,
	chaoxiang string,
	tprice int,
	sprice int,
	builddate string
)row format delimited fields terminated by
',';

load data inpath '/secondhouse.csv' into 
table tb_lianjia;

  • 观察元数据: MySQL中hivemetadata数据库中
    • DBS:记录了Hive中所有数据库的信息
      在这里插入图片描述
  • TBLS:记录了Hive中所有表的信息
    -在这里插入图片描述
  • SDS:记录了Hive中的表与HDFS的映射关系

在这里插入图片描述

  • 当用户提交SQL语句,对表进行操作时,通过映射关系,将表对应的HDFS中的目录下的所有文件进行处理

  • 观察HDFS

    • 数据仓库的目录
      在这里插入图片描述
  • 数据库目录
    在这里插入图片描述

  • 表的目录
    在这里插入图片描述

  • 数据文件

在这里插入图片描述

  • == 功能二:将HQL语句转换为MAPReduce程序?==
    -SQL

    select 1 from 2 where 3 group by 4 having 5 order by 6 limit 7
    
  • 1-结果的格式,决定了列

    • 列的过滤
  • 2-需要读取的数据源

    • emp
      • empno,ename,salary,deptno
    • dept
      • deptno ,dname
          • 表/子查询【临时表】:结果中用到的列都来自于某一张表
      • 查询所有员工编号大于100的员工编号和名称
    • join:如果结果中的列来自于不同的表
      • 查询所有员工编号大于100的员工名称和部门名称
  • 3-决定了过滤条件,保留哪些行

    • where empno > 100
  • 4-按照哪个字段分组

    • 关键字:每、各个‘不同、每个
  • 5-决定了过滤条件,保留哪些行

    • 与where的区别
    • 过滤的条件是在分组前就有还是分组后才产生的
    • 统计每个部门的平均薪资,返回平均薪资大于5000并且部门名称不为销售部的部门信息
      • where dname != 销售部
      • having avg_sal > 5000 and dname != 销售部
  • 6-决定了按照哪列排序

    • 关键字:最高、最低、升序,降序,前几,后几
  • 7-限制输出

    • limit M ,N
      • M :起始位置,默认为0,第一条
  • Mapreduce

    Input:输入2
    Map:基本一对一的处理,列,和行过滤1,3
    Shuffle:分组,排序4,6
    MapreduceSQL
    Reduce:聚合函数,5、7
    Output打印
  • 需求:id,name,age

  • HDFS文件

    1		laoda		20
    2		laoer		22
    3		laosan		24
    
  • hive

create table person(
	id int,
	name string,
	age int
) row format delimited fields terminated by '\t';
  • 关联
load data inpath 'filePath' into table persion;
  • SQL:select id,name from person where age > 20;

  • Input:根据表名访问元数据,找到这张表对应的HDFS文件

  • 将这个表的目录下的所有文件作为Mapreduce的输入

    • Map

    • map

      String[] splits = value.toString.split("\t")
      id = splits[0]
      name = split[1]
      age = split[2]
      if(age > 20){
      	context.write(id,name)
      }else{
      	return;
      }
      
  • 应用场景

  • ==构建数据仓库:目前Hive在工作中的主要使用场景 ==

    • 通过功能一来实现的
    • 管理模式:以表的形式来进行管理,通过SQL对数据进行处理
  • 利用Hive实现数据的处理转换分析:目前很多的公司都选用背的工具来实现

    • 通过功能二来实现
    • 工作中能够使用的替代品
      • SparkSQL
        • Spark是一个全场景的分布式计算平台
          • SparkCore:MapReduce
            • 离线代码开发计算
          • SparkSQL:Hive
            • 离线交互式计算
          • SparkStreaming:Storm / Flink
            • 准实时计算,性能要求高的场景下,需要选用Storm、Flink
      • Impala
      • Presto
      • ……
      • 基于分布式内存的SQL计算引擎
  • Hive中的架构

    • CS:客户端服务端模式

      • Client:客户端
        • 提供与用户交互的接口
        • 将请求提交给服务端
        • 将结果返回给用户
      • Server:服务端
        • 处理客户端的请求
    • Hive客户端:与用户交互,提供SQL接口

    • Hive服务端:解析SQL,将解析好的任务提交给Hadoop

      • 连接器:负责管理所有的客户端连接

        • JDBC

          • url:指定服务端地址
          • username
          • password
        • 解析器:解析SQL,验证语法,解析为语法树

          • 逻辑计划:明确了用户想要实现的结果
        • 优化器:根据用户的结果,自动选择一种最优的方式来实现

          • 物理计划:真正要执行的计划
          • 执行器:提交物理计划执行
    • 元数据:负责存储整个Hive中所有关键性的信息

    • Hadoop:负责实现Hive服务端提交的任务

      • 存储任务:HDFS
      • 计算任务: MapReduce + YARN在这里插入图片描述

三、Hive的元数据服务

1、元数据存储

  • 内容
    • Hive中运行时需要用到的所有信息
      • 数据库
      • 函数
      • ……
    • Hive中记录表与HDFS的映射关系:SDS
  • 位置
    • 默认:derby文本型数据库
      • 缺点:元数据只有由一个进程进行管理访问,不能共享
        • 存储的文本数据库不安全
    • 自定义:将元数据存储在RDBMS中,MySQL

2、元数据共享

  • 为什么要实现元数据共享?
    • 目前在工作中已经很少使用Hive来做分析计算,由SparkSQL,Impala来实现分析计算
    • 问题:SparkSQL和Impala如何知道Hive中哪些表,以及这些表对应HDFS文件?
    • 解决:将Hive的元数据共享给SparkSQL或者Impala即可
  • 问题:SparkSQL以及Impala不会解析元数据,只知道元数据存储的位置,不会解析元数据的内容?
  • 解决:在Hive中专门构建一个服务用于提供元数据的读写请求,负责帮所有需要操作元数据的客户端进行解析

3、元数据服务

  • 元数据服务:metastore

    • 只要开启了元数据服务,所有需要访问元数据的进程都需要访问metastore服务
    • 注意事项:服务进程启动的顺序,只要配置了metastore服务
      • 先启动metastore服务
      • 然后启动hive服务端
      • 再启动hive客户端
  • 配置并开启元数据服务

    • 配置:修改hive-site.xml

      <property>
          <name>hive.metastore.uris</name>
          <value>thrift://node3:9083</value>
      </property>
      
    • 启动

      bin/hive --service metastore
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gDrcG1Ux-1604558397905)(Day10_Hive的基本操作.assets/image-20201105113252417.png)]

    • 检查端口

      netstat -atunlp | grep 9083
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k3cHQd5t-1604558397907)(Day10_Hive的基本操作.assets/image-20201105113140129.png)]

4、测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YV3dz0uR-1604558397909)(Day10_Hive的基本操作.assets/image-20201105113209078.png)]

四、Hive客户端

1、Hive shell

  • 命令:hive
  • 特点:客户端与服务端一体的命令
  • 应用:不适合于作为实现与用户的交互客户端
    • 主要用于实现自动化Hive任务的开发
    • 需求:每天的0点一多,所有的程序按照先后顺序自动化运行

2、Beeline

  • 命令:beeline

  • 特点:纯客户端,通用性的JDBC客户端

  • 应用:交互性相对比较友好,一般用于测试开发的交互

  • 使用

    • 启动

      • 先启动元数据服务:开放9083端口

      • 然后启动Hive的服务端:hiveserver2:10000

        bin/hiveserver2
        
        • 检查端口

          netstat -atunlp | grep 10000
          
      • 最后启动Hive的客户端:beeline

  • 启动方式

    • 方式一

      • 先进入beeline命令行

        beeline
        
      • 构建连接

        !connect jdbc:hive2://node3:10000
        
      • 输入用户名和密码

        root
        123456
        
      • 进入命令行

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kL9XONl3-1604558397910)(Day10_Hive的基本操作.assets/image-20201105121254390.png)]

    • 方式二

      beeline -u jdbc:hive2://node3:10000 -n root -p 123456
      
    • 退出

      !quit
      
  • 问题

    • 问题一:报找不到jar包

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izfps3sI-1604558397911)(Day10_Hive的基本操作.assets/image-20201105120311827.png)]

      • 原因:lib目录下没有这个jar包,beeline不需要这个jar包

        • 这个jar包以前的确会在lib目录下,但是后来在2.x版本中将这个jar包放入了jdbc目录
      • 解决:将这个jar包从jdbc目录复制到lib目录

        cd /export/servers/hive-2.1.0-bin
        cp jdbc/hive-jdbc-2.1.0-standalone.jar lib/
        
    • 问题二:root用户无法访问Hive

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-agwlyngT-1604558397913)(Day10_Hive的基本操作.assets/image-20201105120436525.png)]

      • 原因:Hive默认的权限检查不允许root用户访问Hive以及Hadoop

      • 解决:将root用户配置成Hadoop的代理用户

        • step1:先关闭hdfs和yarn

        • step2:修改配置文件core-site.xml,配置Hadoop代理用户访问

          cd /export/servers/hadoop-2.7.5/etc/hadoop/
          vim core-site.xml 
          
          <property> 
                <name>hadoop.proxyuser.root.hosts</name>
              <value>*</value> 
            </property> 
            <property> 
                <name>hadoop.proxyuser.root.groups</name> 
                <value>*</value> 
          </property>
          
        • step3:分发

          scp core-site.xml node2:$PWD
        scp core-site.xml node3:$PWD
        
      • step4:重启HDFS和yarn

        start-dfs.sh
        start-yarn.sh
        

3、JDBC

  • 类似于MySQL的JDBC
    • 区别:驱动类,url不一样
  • 示例:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
 
public class HiveJdbcClient {
  private static String driverName = "org.apache.hive.jdbc.HiveDriver";
 
  /**
   * @param args
   * @throws SQLException
   */
  public static void main(String[] args) throws SQLException {
      try {
      Class.forName(driverName);
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      System.exit(1);
    }
    //replace "hive" here with the name of the user the queries should run as
    Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", "");
    Statement stmt = con.createStatement();
    String tableName = "testHiveDriverTable";
    stmt.execute("drop table if exists " + tableName);
    stmt.execute("create table " + tableName + " (key int, value string)");
    // show tables
    String sql = "show tables '" + tableName + "'";
    System.out.println("Running: " + sql);
    ResultSet res = stmt.executeQuery(sql);
    if (res.next()) {
      System.out.println(res.getString(1));
    }
       // describe table
    sql = "describe " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(res.getString(1) + "\t" + res.getString(2));
    }
 
    // load data into table
    // NOTE: filepath has to be local to the hive server
    // NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line
    String filepath = "/tmp/a.txt";
    sql = "load data local inpath '" + filepath + "' into table " + tableName;
    System.out.println("Running: " + sql);
    stmt.execute(sql);
 
    // select * query
    sql = "select * from " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
    }
 
    // regular hive query
    sql = "select count(1) from " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(res.getString(1));
    }
  }
}

五、Hive常用操作配置

1、启动脚本

  • 创建日志存储目录

    mkdir /export/servers/hive-2.1.0-bin/logs
    
  • 构建metastore脚本

    #!/bin/bash
    #HIVE_HOME
    HIVE_HOME=/export/servers/hive-2.1.0-bin
    #run metastore
    $HIVE_HOME/bin/hive --service metastore >> $HIVE_HOME/logs/metastore.log 2>&1 &
    
  • 构建HIveserver2脚本

    #!/bin/bash
    #HIVE_HOME
    HIVE_HOME=/export/servers/hive-2.1.0-bin
    #run hiveserver2
    $HIVE_HOME/bin/hiveserver2  >> $HIVE_HOME/logs/hiveserver2.log 2>&1 &
    
  • 构建beeline脚本

    #!/bin/bash
    #HIVE_HOME
    HIVE_HOME=/export/servers/hive-2.1.0-bin
    #run beeline
    $HIVE_HOME/bin/beeline -u jdbc:hive2://node3:10000 -n root -p 123456
    

2、SQL脚本

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥TuNan&Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值