教育项目实战

1. 教育项目的架构说明

项目的架构: 
    基于cloudera manager大数据统一管理平台, 在此平台之上构建大数据相关的软件(zookeeper,HDFS,YARN,HIVE,OOZIE,SQOOP,HUE...), 除此以外, 还使用FINEBI实现数据报表展示

各个软件相关作用:
    zookeeper: 集群管理工具, 主要服务于hadoop高可用以及其他基于zookeeper管理的大数据软件
    HDFS:  主要负责最终数据的存储
    YARN: 主要提供资源的分配
    HIVE: 用于编写SQL, 进行数据分析
    oozie:  主要是用来做自动化定时调度
    sqoop: 主要是用于数据的导入导出
    HUE: 提升操作hadoop用户体验, 可以基于HUE操作HDFS, HIVE ....
    FINEBI: 由帆软公司提供的一款进行数据报表展示工具

项目架构中:数据流转的流程
    首先业务是存储在MySQL数据库中, 通过sqoop对MySQL的数据进行数据的导入操作, 将数据导入到HIVE的ODS层中, 对数据进行清洗转换成处理工作, 处理之后对数据进行统计分析, 将统计分析的结果基于sqoop在导出到MySQL中, 最后使用finebi实现图表展示操作, 由于分析工作是需要周期性干活, 采用ooize进行自动化的调度工作, 整个项目是基于cloudera manager进行统一监控管理

面试题: 
    请介绍一下最近做了一个什么项目? 为什么要做, 以及项目的架构和数据流转流程
    
    请介绍项目的架构是什么方案? 项目的架构和数据流转的流程
    
    整个项目各个软件是如何交互的?   数据流转的流程

2. cloudera manager基本介绍

​        大数据的发行版本, 主要有三个发行版本: Apache 官方社区版本, cloudera 推出CDH商业版本, Hortworks推出的HDP商业免费版本, 目前HDP版本已经被cloudera 收购了

Apache版本Hadoop生态圈组件的优点和弊端:

优点:

  • 完全开源,更新速度很快
  • 大数据组件在部署过程中可以深刻了解其底层原理
  •  可以了解各个组件的依赖关系

缺点

  • 部署过程极其复杂,超过20个节点的时候,手动部署已经超级累 
  • 各个组件部署完成后,各个为政,没有统一化管理界面
  • 组件和组件之间的依赖关系很复杂,一环扣一环,部署过程心累
  • 各组件之间没有统一的metric可视化界面,比如说hdfs总共占用的磁盘空间、IO、运行状况等 
  • 优化等需要用户自己根据业务场景进行调整(需要手工的对每个节点添加更改配置,效率极低,我们希望的是一个配置能够自动的分发到所有的节点上)

为了解决上述apache产生问题, 出现了一些商业化大数据组件, 其中以 cloudera 公司推出 CDH版本为主要代表

CDH是Apache Hadoop和相关项目中最完整、最稳定的、经过测试和最流行的发行版。 CDH出现帮助解决了各个软件之间的兼容问题, 同时内置大量的常规企业优化方案, 为了提供用户体验, 专门推出一款用于监控管理自家产品的大数据软件: cloudera manager

Cloudera Manager是用于管理CDH群集的B/S应用程序

使用Cloudera Manager,可以轻松部署和集中操作完整的CDH堆栈和其他托管服务(Hadoop、Hive、Spark、Kudu)。其特点:应用程序的**安装过程自动化**,将部署时间从几周缩短到几分钟; 并提供运行主机和服务的集群范围的**实时监控视图**; 提供单个中央控制台,以在整个群集中实施配置更改; 并集成了全套的报告和诊断工具,可帮助**优化性能**和利用率。

3. 教育项目的环境搭建

​        参考<<项目环境构建初始化.docx>>  构建即可

浏览器访问的界面:

![image-20210922105921536](day02_教育项目课程笔记.assets/image-20210922105921536.png)

用户名和密码都是 admin

![image-20210922105955016](day02_教育项目课程笔记.assets/image-20210922105955016.png)

打开后, 可能会出现上述 yarn中存在问题, 点击yarn进行解决接口, 如果都是对勾,那么就OK了

![image-20210922110103068](day02_教育项目课程笔记.assets/image-20210922110103068.png)

点击 jobhistory server. 进去后, 点击启动即可

![image-20210922110143836](day02_教育项目课程笔记.assets/image-20210922110143836.png)

最终效果:

![image-20210922110236631](day02_教育项目课程笔记.assets/image-20210922110236631.png)

后续如何关机的问题:

```properties
    教育项目中虚拟机, 坚决不允许挂起, 以及强制关闭操作, 如果做了, 非常大的概率导致服务器出现内存以及磁盘问题, 需要重新解压
    
    关机必须在CRT上直接关机命令: shutdown -h now   (每一个节点都要执行)
    重启服务器: 执行 reboot (每一个节点都要执行)

    需要注意: 如果将虚拟机放置在机械磁盘的, 如果长时间不使用这几个虚拟机, 建议将其关闭, 固态盘一般没啥问题, 但是依然建议关闭
```

服务器内存资源调整:

```
16gb:
    hadoop01: 默认占用12GB内存, 可以调整到 10.5GB  
    hadoop02: 默认占用3.5GB, 可以调整到 3GB

不调整也没什么太大问题, 只不过刚刚启动后, 等待20分钟之后, 在操作电脑就好了

注意: CDH软件开机后, 整个所有服务恢复正常, 大约需要耗时10~20分钟左右, 所以如果一开机就访问hadoop01:7180 可能是无法访问

如果等到 10~20分钟以后, 依然有大量的都是红色感叹号, 建议重启试一下, 如果依然不行, 老找我
如果只有偶尔一两个, 建议点进去, 重启一下即可

如果是12GB内存: 
    建议调整为
        hadoop01: 默认占用12GB内存, 可以调整到 7.5GB  
        hadoop02: 默认占用3.5GB, 可以调整到 3GB
    同时关闭掉CM所有监控服务项: 看下图

弊端:    
    缺失了cm的监控服务, CM无法感知各个是否都启动了...
    只能通过手动方式检测: 进入各个软件的管理界面
```

![image-20210922113301264](day02_教育项目课程笔记.assets/image-20210922113301264.png)
 

访问咨询主题模块看板—建模操作

创建模型

建模就是建表的意思。在创建表的时候,需要考虑哪些问题呢

  1. 表需要采用什么存储格式
  2. 表需要采用什么压缩格式
  3. 表需要构建什么类型表(分区表还是分桶表等)

1.表格存储格式选择:

  • 如果数据来源于普通的文本文件数据,一般存储合适选择行存textFile存储格式
  • 如果数据不是来源于普通的文本文件数据,一般存储合适选择为列存orc存储格式

当前项目:数据存储在MySQL中,选择orc存储格式

2.表格压缩格式的选择

  • 写多,读少的情况:优先考虑压缩比  建议选择zlib2  gzip
  • 写多,读多的情况:优先考虑压缩性能  建议选择snappy
  • 如果空间比较充足,建议各个层次都选择snappy压缩方案

一般情况下:

  • hive数仓分层结构中ods层,选择zlib2压缩格式
  • hive数仓分层结构中其他层次,选择snappy压缩格式

当前项目:

  • ODS层:zlib
  • 其他层:snappy

项目最终采用的存储格式和压缩格式:

  • ODS层:orc+zlib
  • 其他层:orc+snappy

全量和增量

        在进行数据统计分析的时候,一般来说,第一次统计分析都是全量统计分析;而后续的操作,都是在结果基础上增量化统计操作

全量统计:需要面对公司所有的数据进行统计分析,数据体量一般比较大;大到maprduce计算不了或者计算时间需要几天,时间等不起

        解决方案:采用分批次执行(比如存了十年的数据,按年来分批执行)

增量统计:一般是以T+1模式统计,就是今天的数据,明天才会进行统计操作

        每一天都是统计上一天的数据

分区

        后续的hive中构建的大部分表都是分区表

分区表有什么作用?

        当查询的时候,指定分区字段,可以减少查询表数据扫描量,从而提升效率

向分区表添加数据的方法

1)静态分区:

        格式:load data [local] inpath '文件路径' into table 表名 partition(分区字段=值...);

                   inset into table 表名 partition(分区字段=值...) select 语句;

2)动态分区:

        格式:insert into table 表名 partition(分区字段1,分区字段2....) select语句;

        注意事项:1.必须开启hive对动态分区的支持

                          2.必须开启hive的非严格模式

                          3.保证select语句的最后字段必须是分区字段数据(保证顺序)

                                如:insert into table order partition(year,month)

                                          select 字段1,...,year,month from xxx;

3)动静混合:

      格式:insert into table 表 partition(分区字段1=值,分区字段2,分区字段3...) select语句;

      注意事项:1.必须开启hive对动态分区的支持

                        2.必须开启hive的非严格模式

                        3.保证select语句的最后字段必须是分区字段数据(保证顺序)

                                如:insert into table order partition(year='2023',month,day)

                                          select 字段1,...,month,day from xxx;

动态分区的优化点:有序动态分区

        有时候表格中动态分区比较多,hive为了提升写入效率,会启动多个reduce程序进行并行写入操作,这时对内存的消耗比较大,有可能会出现内存溢出问题

解决方法:开启有序动态分区开关

        开启后,reduce不会再并行运行了,只会运行一个,大大降低了内存消耗,从而能正常的运行完成,但是效率会变慢

注意:目前不改,后续出现分区的问题,在尝试更改

怎么打开:

  

重启以后修改的配置就生效了

建模操作

  • ODS层的建模

ODS层的表我们后续不会对它进行修改,所以用外部表;存储格式为ORC;压缩格式为ZLIB

--创建ODS层
create database if not exists itcast_ods;

--开启压缩生效开关,因为我们要指定表格的压缩格式
set hive.exec.orc.compression.strategy=COMPRESSION;

--创建访问咨询表
create external table if not exists itcast_ods.web_chat_ems(
  id int comment '主键',
  create_date_time string comment '数据创建时间',
  session_id string comment '七陌sessionID',
  sid string comment '访客id',
  create_time string comment '会话创建时间',
  seo_source string comment '搜索来源',
  seo_keywords string comment '关键字',
  ip string comment 'IP地址',
  area string comment '地域',
  country string comment '所在国家',
  province string comment '省',
  city string comment '城市',
  origin_channel string comment '投放渠道',
  user_match string comment '所属席位',
  manual_time string comment '人工开始时间',
  begin_time string comment '坐席领取时间',
  end_time string comment '会话结束时间',
  last_customer_msg_time_stamp string comment '客户最后一条消息时间',
  last_agent_msg_time_stamp string comment '坐席最后一下回复时间',
  reply_msg_count int comment '客服回复消息数',
  msg_count int comment '客户发送消息数',
  browser_name string comment '浏览器名称',
  os_info string comment '系统名称'
)comment '访问会话信息表'
partitioned by(starts_date string)
row format delimited fields terminated by '\t'
stored as orc
tblproperties('orc.compress'='ZLIB');

--访问咨询附属表
create external table if not exists itcast_ods.web_chat_text_ems(
  id int comment '主键来自MySQL',
  referrer string comment '上级来源页面',
  from_url string comment '会话来源页面',
  landing_page_url string comment '访客着陆页面',
  url_title string comment '咨询页面title',
  platform_description string comment '客户平台信息',
  other_params string comment '扩展字段中的数据',
  history string comment '历史访问记录'
)comment 'EMS-PV测试表'
partitioned by(start_time string)
row format delimited fields terminated by '\t'
stored as orc
tblproperties('orc.compress'='ZLIB');

  • DWD

导出、

create database if not exists itcast_dwd;

create table if not exists itcast_dwd.visit_consult_dwd(
  session_id string comment '七陌sessionID',
  sid string comment '访客id',
  create_time bigint comment '会话创建时间',
  seo_source string comment '搜索来源',
  ip string comment 'IP地址',
  area string comment '地域',
  msg_count int comment '客户发送消息数',
  origin_channel string comment '来源渠道',
  referrer string comment '上级来源页面',
  from_url string comment '会话来源页面',
  landing_page_url string comment '访客着陆页面',
  url_title string comment '咨询页面title',
  platform_description string comment '客户平台信息',
  other_params string comment '扩展字段中的数据',
  history string comment '历史访问记录',
  hourinfo string comment '小时'
)comment '访问咨询DWD表'
partitioned by(yearinfo string, quarterinfo string, monthinfo string, dayinfo string)
row format delimited fields terminated by '\t'
stored as orc
tblproperties('orc.compress'='SNAPPY');

  • DWS层
CREATE DATABASE IF NOT EXISTS itcast_dws;

-- 访问量统计结果表
CREATE TABLE IF NOT EXISTS itcast_dws.visit_dws(
  sid_total INT COMMENT '根据sid去重求count',
  sessionid_total INT COMMENT '根据sessionid去重求count',
  ip_total INT COMMENT '根据IP去重求count',
  area STRING COMMENT '区域信息',
  seo_source STRING COMMENT '搜索来源',
  origin_channel STRING COMMENT '来源渠道',
  hourinfo STRING COMMENT '创建时间,统计至小时',
  time_str STRING COMMENT '时间明细',
  from_url STRING COMMENT '会话来源页面',
  groupType STRING COMMENT '产品属性类型:1.地区;2.搜索来源;3.来源渠道;4.会话来源页面;5.总访问量',
  time_type STRING COMMENT '时间聚合类型:1.按小时聚合;2.按天聚合;3.按月;4.按季度;5.按年'
)comment 'EMS访客日志记录表'
PARTITIONED BY(yearinfo STRING,quarterinfo string,monthinfo STRING,dayinfo STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS ORC
TBLPROPERTIES('orc.compress'='ANAPPY');

--咨询量统计结果表
CREATE TABLE IF NOT EXISTS itcast_dws.consult_dws(
  sid_total INT COMMENT '根据sid去重求count',
  sessionid_total INT COMMENT '根据sessionid去重求count',
  ip_total INT COMMENT '根据IP去重求count',
  area STRING COMMENT '区域信息',
  origin_channel STRING COMMENT '来源渠道',CREATE DATABASE IF NOT EXISTS itcast_dws;

-- 访问量统计结果表
CREATE TABLE IF NOT EXISTS itcast_dws.visit_dws(
  sid_total INT COMMENT '根据sid去重求count',
  sessionid_total INT COMMENT '根据sessionid去重求count',
  ip_total INT COMMENT '根据IP去重求count',
  area STRING COMMENT '区域信息',
  seo_source STRING COMMENT '搜索来源',
  origin_channel STRING COMMENT '来源渠道',
  hourinfo STRING COMMENT '创建时间,统计至小时',
  time_str STRING COMMENT '时间明细',
  from_url STRING COMMENT '会话来源页面',
  groupType STRING COMMENT '产品属性类型:1.地区;2.搜索来源;3.来源渠道;4.会话来源页面;5.总访问量',
  time_type STRING COMMENT '时间聚合类型:1.按小时聚合;2.按天聚合;3.按月;4.按季度;5.按年'
)comment 'EMS访客日志记录表'
PARTITIONED BY(yearinfo STRING,quarterinfo string,monthinfo STRING,dayinfo STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS ORC
TBLPROPERTIES('orc.compress'='ANAPPY');

--咨询量统计结果表
CREATE TABLE IF NOT EXISTS itcast_dws.consult_dws(
  sid_total INT COMMENT '根据sid去重求count',
  sessionid_total INT COMMENT '根据sessionid去重求count',
  ip_total INT COMMENT '根据IP去重求count',
  area STRING COMMENT '区域信息',
  origin_channel STRING COMMENT '来源渠道',
  time_str STRING COMMENT '时间明细',
  from_url STRING COMMENT '会话来源页面',
  groupType STRING COMMENT '产品属性类型:1.地区;2.搜索来源;3.来源渠道;4.会话来源页面;5.总访问量',
  time_type STRING COMMENT '时间聚合类型:1.按小时聚合;2.按天聚合;3.按月;4.按季度;5.按年'
)COMMENT '咨询量DWS宽表'
PARTITIONED BY(yearinfo STRING,quarterinfo string,monthinfo STRING,dayinfo STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS ORC
TBLPROPERTIES('orc.compress'='ANAPPY');

hive的基础优化

hdfs的副本数量
  • 默认情况HDFS的副本数量为3个;如果数据不是特别重要,也可以设置为2个
  • 在Hadoop3.x以上的版本,支持设置副本数量为1.5;
    • 其中0.5不是指的存储一半数据,而是采用了纠删码来存储这一份数据的信息,而纠删码是占用数据的一半

在Cloudera Manager上配置HDFS的副本数量        

可以看到我们HDFS集群的副本数量为2,这里不能改为3,因为我们的HDFS集群只有两个datanode

yarn的基础配置

      yarn用于资源的调度分配。yarn能调度的资源有1.内存、2.CPU;磁盘是用来存储数据的,由HDFS来管理磁盘的资源

查看集群的内存和CPU(在yarn的监控界面)

        可以看到yarn只能管理内存和CPU的资源

查看集群的磁盘资源(在HDHS的监控界面中)

HDFS管理磁盘,YARN管理内存和CPU,正是因为这样,所以才导致了NodeManager和DataNode可以部署同一个节点上,两者结合正好可以管理整个节点的资源

  • 对CPU的配置

每一个nodemanager会向resourcemanager报告自己当前节点有多少核CPU。默认情况下nodemanager会向resourcemanage报告自己节点有8核CPU,yarn也不会自动校验每个节点有多少CPU;所有我们要修改调整配置,让当前节点有多少核,就要向resourcemanage汇报多少核。

查看当前节点的CPU核心数:

    方式1.通过ClouderaManager的主机目录来查看每一节有多少核

          进入yarn的监控界面

        这里集群CPU总共为6核

        点击主机,选择所有主机,就可以看到集群的每台节点的CPU核心数,加起来正好是6

   方式2:在Linux通过命令的方式来查看

        grep 'processor' /proc/cpuinfo | sort -u | wc -l

        在hadoop01主机执行上面的命令,可以看到hadoo01的核心为4;在hadoop02主机执行可以看到hadoop02的核心数为2

配置yarn各节点的核心数:

        直接在CM的yarn配置目录下搜索:yarn.nodemanager.resource.cpu-vcores

  • 对内存的配置

每一个nodemanager会向resourcemanager报告自己当前节点有多少内存。默认情况下nodemanager会向resourcemanage报告自己节点有8GB内存,yarn也不会自动校验每个节点有多少内存;所有我们要修改调整配置,让当前节点有多少剩余内存,就要报告剩余内存*80%给resourcemanage。剩下20%内存给别的节点用

查看当前节点的剩余内存:

        1)通过CM的主机目录来查看每个节点还剩多少内存

      

        2)通过命令的方式查看:free -h

   

配置yarn各节点的内存:

        直接在CM的yarn的配置目录下搜索:

                yarn.nodemanager.resource.memory-mb

                yarn.scheduler.maximum-allocation-mb:与第一个保持一致

                yarn.app.mapreduce.am.command-opts:略小于第一个(0.9G)

        注意,要同时设置yarn.scheduler.maximum-allocation-mb为一样的值,yarn.app.mapreduce.am.command-opts(JAVA内存)的值要同步修改为略小的值。

  • yarn本地目录的配置

配置项:yarn.nodemanager.local-dirs

推荐配置:当前服务器挂载了几块磁盘,就需要配置几个目录(我们集群的每个节点都只挂载了一个磁盘)

目的:yarn在运行的过程中,会产生一些临时文件,这些临时文件应该存储在哪些位置由这个本地目录配置决定

如果hadoop01挂载了两块磁盘,就需要增加一个本地目录

怎么查看当前节点挂载了几块磁盘:

查看当前磁盘挂载点:df -h

        可以看到50G的磁盘被挂载到根目录,所有的文件、文件夹都存储在根目录下,也就是存储在50G的磁盘中

MapReduce基础配置

mapreduce.map.memory.mb:在运行MR的时候,一个mapTask需要占用多大内存

            

mapreduce.map.java.opts:在运行MR的时候,一个mapTask对应的jvm需要占用多大内存

mapreduce.reduce.memory.mb:在运行MR的时候,一个reduceTask需要占用多大内存

mapreduce.reduce.java.opts:运行MR时,一个reduceTask对应的jvm需要占用多大内存

注意:

        jvm的内存配置要略小于对应的Task的内存

        所有内存配置的大小不能超过nodemanager的内存

此处推荐:

        一般不做任何修改,默认即可(一个MapReduce任务默认占用的内存大小并没有固定的数值;默认情况下,Map任务可能会被分配1024MB的内存,Reduce任务可能会被分配1024MB的内存)

hive的基础配置
  • hiveserver2的内存大小配置

配置项:HiveServer2 的 Java 堆栈大小(字节)

     

如果这个配置比较少,在执行SQL的时候,就会出现以下问题:

  

此错误,说明hiveserver2已经宕机了,此时需要调整hiveserver2的大小,调整后,重启。

我们通过hiveserver2来执行SQL的时候,SQL要进行编译然后翻译成MapReduce,报告SQL还要生成执行计划等都要消耗内存资源;如果hiveserver2的内存资源较小,hiveserver2就容易宕机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

30+11

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

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

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

打赏作者

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

抵扣说明:

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

余额充值