Hadoop基础(二)

Hadoop基础

回顾

元数据 – MySQL – metastore元数据存储
​ Hive原理:本质 【SQL–>mapreduce】–元数据管理、解析SQL 【txt】
字段、类型、存储路径、权限:【映射】 创建MySQL表 【建表、新建字段、类型=>结构化语言】
分别:
a. 真实数据 -.txt文件
b. 表字段、类型等信息-元数据
关系:文字描述
(1)Hadoop:大数据开发框架
核心组件(架构):HDFS、MapReduce、YARN
(2)HDFS:分布式文件系统 -存储数据
核心思想:在Hadoop框架中,存储数据使用HDFS
(3)Hive:类SQL库【数据仓库】,必须建立在Hadoop的开发框架下
(4)MySQL:关系型数据库
核心思想:存储元数据【存储表信息、表字段等】

启动Hadoop、hive

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 启动Hadoop
1、配置环境变量
2、start-all.sh (node1,node2,node3依此启动)
3、查看进程 jps
4、单独启动History
mapred --daemon start historyserver (作为后台启动)
5、查看进程 jps
6、查看3个页面
:9870 (hdfs)
:8088
:19888

# 启动hive
1、启动MetaStore服务
nohup hive --service metastore &
2、启动hiveserver2服务
nohup hive --service hiveserver2 &
3、查看端口
losf -i:10000
4、查看进程
jps

# datagrip 连接hive
jdbc:hive2://node1:10000

分区表

  1. 分区表介绍(分而治之)

    image-20230912114552414
    1
    2
    3
    4
    1、单分区表:如单独按月分区
    2、多分区表:如按年月日进行3级分区

    # 设定分区表时,用partition by关键字修饰
  2. 分区表使用

    1. 创建分区表

      1
      2
      3
      4
      5
      6
      7
      8
      9
      create [external] table 表名(
      id int,
      name string
      )
      partitioned by (分区列 数据类型, 分区列) -- 分区列为虚拟列
      row format delimited fields terminated by ",";

      # partition表示分区,但字段后面可以有多个分区列
      # partition 的位置要放在分隔符之前
    2. 查看分区表

      1
      2
      hdfs 页面查看
      show partitions 表名;
    3. 使用分区表

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      # 从本地Linux导入数据到表中
      load data local inpath 'linux本地文件路径' into table 表名;
      # 从hdfs导入数据到表中
      load data inpath 'hdfs文件路径名' [overwrite] into table 表名;

      # 导入数据
      # 上传数据文件 Linux:/test_score hdfs: /input
      # 加载数据Linux
      load data local inpath '/root/day08_hive/test_score/score1.txt' into table db_part partition (year="2003");
      # 加载hdfs数据
      load data inpath '/input/score2.txt' into table db_part partition (year="2003");
      # 查看效果
      select * from db_part;
    4. 修改分区表

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      #  添加分区
      alter table 表名 add partition (分区字段='分区值');
      # 删除分区
      alter table 表名 drop partition(分区字段='分区值');
      # 修改分区值
      alter table 表名 partition(分区字段='旧分区值') rename to parttion(分区字段='新分区值');

      show partitions db_part;
      # 新增分区
      alter table db_part add partition (year="4444");
      alter table db_part add partition (year="5000");
      # 删除4444、默认
      alter table db_part drop partition (year="4444");
      alter table db_part drop partition (year="2023");
      # 修改5000 - 6666
      alter table db_part partition(year="5000") rename to partition (year="6666");
    5. 手动添加的分区无法显示

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      /*未同步元数据:  Hive中的表和分区的元数据通常存储在Metastore中。手动添加分区时,需要确保及时更新Metastore中的元数据。可以使用MSCK REPAIR TABLE命令来解决此问题。这将扫描表目录并添加任何缺失的分区。()修复分区表*/
      msck repair table 表名; -- 刷新分区
      --查看分区数据
      show partitions db_part;
      select * from db_part;
      -- 修复分区
      msck repair table db_part;
      -- 查看
      show partitions db_part;

      /*
      权限问题: 确保有足够的权限来查看和编辑表和分区。可以检查你的角色/用户是否具有适当的权限来访问所需的数据库、表和分区。

      文件系统配额限制: 手动添加分区时,Hive会根据元数据中定义的位置(例如HDFS路径)来检索数据。请确保文件系统具有足够的空间来存储新分区的数据。如果文件系统空间不足,可能会导致分区无法显示。

      缓存问题: 如果已经查询过该表,并且启用了某种缓存机制(例如Hive的查询结果缓存或文件系统级别的缓存),则可能需要清除缓存才能看到新添加的分区。可以尝试重启Hive服务或手动清除相关缓存来解决此问题。
      */
    6. 查询数据结果

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      -- 查询数据结果
      -- 2023全年数据,每个商品对应的销售额
      select name,(price*quantity) cost from db_shop where year="2023";
      -- 2023年总销售额,
      select sum(price*quantity) cost from db_shop where year="2023";
      -- 23年5月的所有商品的销售情况
      select * from db_shop where year="2023" and month="05";
      -- 23年5月1号所有商品信息
      select * from db_shop where year="2023" and month="05" and day="01";
      -- 23年5月1号商品总销量
      select sum(quantity) from db_shop where year="2023" and month="05" and day="01";

      -- 23年4月和5月销量前两名的商品信息
      select * from
      (select *, (row_number() over (partition by year,month order by quantity desc)) rn_rk from db_shop where year="2023" and (month="04" or month="05")) tmp_q
      where tmp_q.rn_rk in (1,2);

      select * from
      (select *, (row_number() over (partition by year,month order by quantity desc)) rn_rk from db_shop where year="2023" and (month="04" or month="05")) tmp_q
      where tmp_q.rn_rk = 1 or tmp_q.rn_rk=2;

    分桶表

    1. 分桶表介绍

      1
      2
      3
      4
      将数据分解为若干(固定数量)部分,易于管理的文件,进行存储
      根据一定的算法找到对应文件
      分桶规则:hash算法
      clustered by (字段名) into 桶数 buacket
    2. 创建分桶表

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      # 可以先分区后分桶,不能先分桶后分区;因为分区是拆分成文件夹,分桶是拆分成文件;而文件里面不能创建文件夹,故可以先分区后分桶
      -- 建表,分桶
      drop table tb_user;
      create table tb_user(
      id int,
      subject string,
      name string
      )
      -- partitioned by (year string) -- 分区
      clustered by (id) into 3 buckets -- 分桶
      row format delimited fields terminated by "\t";
      -- 查看表信息
      desc tb_user;
      -- 查看表数据
      select * from tb_user;
      -- 导入数据
      load data local inpath '/root/day08_hive/bucket/course01.txt' into table tb_user;
      -- 页面查看,分析
      select * from tb_user;
    3. hash建模

      1
      2
      3
      hash算法:
      特征:同样的值被Hash算法加密后结果是一致的
      结果值相同的分在同一个桶
    4. 分桶表的优势和作用

      1. 优势
        1. 提升过滤性能
          • 基于分桶字段的where过滤查询时,可减少全表扫描
        2. 提升join多表查询
          • join时可以提高mapreduce程序效率,减少笛卡尔积
        3. 提升分组效率
          • 以某列为分组时,可减少全表扫描
        4. 提升抽样处理
          • 当对分桶表数据据进行抽样可减少数据的抽样处理