精华内容
下载资源
问答
  • 商品仓库管理系统测试报告引言1.背景本测试计划从属于商品存储管理系统。用户为中、小规模超市、商场。执行本测试前,应完成软件计划,需求分析,设计及编码工作。2.参考文档需求分析文档,概要设计文档,详细设计...

    商品仓库管理系统测试报告

    引言

    1.背景

    本测试计划从属于商品存储管理系统。用户为中、小规模超市、商场。执行本测试前,应完成软件计划,需求分析,设计及编码工作。

    2.参考文档

    需求分析文档,概要设计文档,详细设计文档,测试计划文档,程序清单。

    一、软件说明

    1.本软件的主要功能为:

    对商品入库和出库详细情况进行登记 对库存信息进行高级查询 对用户需求申请进行登记

    对库存情况进行自动监督和报警 定期自动生成采购清单 定期对信息排序和生成报表 对操作日志进行登记

    2.条件与限制:

    考虑到本软件面向的用户群比较广泛,在设计时应注意使软件具有较强的可移植性; 因本软件管理的某些信息属商业机密,必须注意信息的安全防范,同时应以标准的数据格式来实现,以方便数据共享;

    二、测试步骤

    本次测试采用黑盒法。主要依据需求分析文档和测试计划文档,以需求分析文档中的功能模块为单位,对编码人员提交的成型系统进行测试。综合使用等价类划分法和其它方法。 详细测试步骤如下: ● 身份验证。功能为:

    ①对登录系统的用户进行身份合法性检查,要求输入帐号和密码。禁止身份信息不正确的用户登录;

    ②当输入密码错误次数超过一定限制时(初定为3次)将自动关闭系统,以防止非法穷举入侵;

    ③将成功的登录操作记入操作日志文件

    1.有效等价类:输入为用户信息表中保存的用户名和对应的密码。测试用例为:

    1-147-jpg_6_0_______-403-0-0-403.jpg

    展开全文
  • 数据仓库总结

    2021-02-09 11:48:54
    它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。 1.2 数据仓库的四个特点 面向主题:数据仓库是按照一定的主题来组织,仅...

    1.数据仓库

    1.1 什么是数据仓库

    数据仓库,英文名为Data Warehouse,简写为DW或DWH。数据仓库,是一个面向主题的、集成的、随时间变化的、但信息本身相对稳定的数据集合,用于对管理决策过程的支持。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。

    1.2 数据仓库的四个特点

    面向主题:数据仓库是按照一定的主题来组织,仅存储与主题相关的数据。主题是指用户在构建数仓时考虑决策时所关注的重点方面,方便以后的数据分析。

    集成:数仓的数据来源是任意的,可以是操作型数据库,也可以是网络爬虫,这些数据经过加工与集成,统一成新的数据源。

    随时间变化:数仓每天都会从不同数据渠道获取大量数据,关键数据会隐式或显式的基于时间变化。

    数据相对稳定:数据进入后一般只进行查询操作,不会进行删改。

    1.3 数仓分层

    1.ODS层:原始数据层,存放原始数据,直接加载原始日志、数据,数据保持原貌不做处理(同时起到备份的作用)

    2.DWD层:明细数据层,每个地方叫法可能不同,结构和粒度与原始表保持一致,DWD层对ODS层数据进行清洗(去除空值、脏数据、超过极限范围的数据(比如金额出现负值))。

    可能会用到的ETL:Hive SQL(hql)、MR、Spark sql、Python、kettle(专门做etl,拖拽+sql,比较注重业务逻辑,但外包比较多

    3.DWS层:服务数据层,以DWD为基础,按天进行轻度汇总。比如用户行为宽表,记录了用户一天下单数、评论数等。

    4.DWT层:数据主题层,以DWS为基础,按主题进行汇总。比如上面的用户行为宽表是记录了每天的下单数、评论数等,那这里就可以记录用户在今年内下单的总数之类的购买主题,属于某个整体范围。

    5.ADS层:数据应用层,为各种统计报表提供数据。可以从其他层去运算。

    1.4 数仓为什么要分层

    从数据源采集时,经过ETL的过程,然后在数仓中要经过分层,可以比喻成TCPip协议,分成多层,每一层处理一件事。为公司决策,提供数据支持的。

    (1)把复杂问题简单化:将复杂的任务分解成多层来完成,每一层只处理简单的任务,方便定位问题。

    (2)减少重复开发:规范数据分层,通过中间层数据能够减少极大的重复计算,增加计算结果的复用性。

    (3)隔离原始数据:不论是数据的异常还是数据的敏感性,使真实数据与统计数据解耦开。比如前面说的ODS层数据更像是备份数据,那么后面的数据层就可以根据需要随意统计数据,其他层发生异常,只要ODS层的数据还在就能取到原始数据,使真实数据与统计数据隔离开

     

    1.4.1数仓命令规范

    表命名:

    -ODS层命名为ods_表名

    -DWD层命名为dwd_dim/fact_表名(维度表和事实表)

    -DWS层命名为dws_表名

    -DWT层命名为dwt_表名

    -ADS层命名为ads_表名

    -临时表命名为xxx_tmp

    -用户行为表,以log为后缀

    脚本命名:

    数据源 _to _目标 _db/log.sh

    1.5 数据仓库与数据库的区别

    功能

    数据仓库

    数据库

    数据范围

    存储历史的、完整的、反应历史变化的数据

    当前状态数据

    数据变化

    可添加、无删除、无变更、反应历史变化

    支持频繁的增删改查

    应用场景

    面向分析、支持战略决策

    面向业务流程

    设计理论

    伪范式、适当冗余

    遵照范式(一、二、三范式),避免冗余

    处理量

    非频繁、大批量、高吞吐、有延迟

    频繁、小批次、高并发、低延迟

    2.关系建模与维度建模

    2.1 关系建模

    关系模型如图所示,严格遵循第三范式(3NF),从图中可以看出,较为松散、零碎,物理表数量多,而数据冗余程度低。由于数据分布于众多的表中,这些数据可以更为灵活地被应用,功能性较强。关系模型主要应用与OLTP系统中,为了保证数据的一致性以及避免冗余,所以大部分业务系统的表都是遵循第三范式的。

    2.2 维度建模

    维度模型如图所示,主要应用于OLAP系统中,通常以某一个事实表为中心进行表的组织,主要面向业务,特征是可能存在数据的冗余,但是能方便的得到数据。

    **关系模型虽然冗余少,但是在大规模数据,跨表分析统计查询过程中,会造成多表关联,这会大大降低执行效率。

    **所以通常我们采用维度模型建模,把相关各种表整理成两种:事实表和维度表两种。

    在维度建模的基础上还可以分为三种模型:星型模型、雪花模型、星座模型。

    2.2.1星型模型

    标准的星型模型周围只有一层,即一个事实表周围只有一层维度表与之对应

    2.2.2雪花模型

    雪花模型的维度层级比星型模型多,雪花模型比较靠近3NF,但无法完全遵守,因为遵守3NF的性能成本太高。

    2.2.3 星座模型

    星座模型与前两个模型的区别在于事实表的数量,星座模型中的事实表要多。而且事实表之间也有可能会共享维度表。

    2.2.4 模型的选择

    首先星座与否与数据和需求有关系,与设计无关,不用抉择。

    星型还是雪花,取决于性能优先,还是灵活优先。

    实际开发中,不会只选择一种,根据情况灵活组合,甚至并存。但是整体来看,更倾向于维度更少的星型模型。尤其是Hadoop体系,减少join就是减少shuffle,性能差别很大。

    3.数仓建模

    3.1 数仓建模的目的

    为什么要进行数据仓库建模?大数据的数仓建模是通过建模的方法更好的组织、存储数据,以便在 性能、成本、效率和数据质量之间找到最佳平衡点。一般主要从下面四点考虑

    访问性能:能够快速查询所需的数据,减少数据I/O

    数据成本:减少不必要的数据冗余,实现计算结果数据复用,降低大数 据系统中的存储成本和计算成本

    使用效率:改善用户应用体验,提高使用数据的效率

    数据质量:改善数据统计口径的不一致性,减少数据计算错误 的可能性,提供高质量的、一致的数据访问平台3

    3.2 ODS层

    保持数据原貌不做任何修改,起到备份数据的作用;

    数据采用压缩存储,减少磁盘空间;

    创建分区表,防止全盘扫描

    3.3 DWD层

    DWD层需构建维度模型,一般采用星型模型,呈现的状态一般为星座模型。

    维度建模一般按照以下四个步骤:

    3.4 DWS层

    统计各个主题对象的当天行为,服务于DWT层的主题宽表,以及一些业务明细数据,应对特殊需求(例如,购买行为,统计商品复购率)。

    3.5 DWT层

    以分析的主题对象为建模驱动,基于上层的应用和产品的指标需求,构建主题对象的全量宽表。

    3.6 ADS层

    电商系统各大主题指标分别进行分析


    1.什么是范式(Normal Form)?

    1.1 定义

    按照教材定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。这样的定义太过晦涩,简单点来说,就是一张数据表的表结构所符合的某种设计标准的级别和要求。

    1.2 优点

    设计关系型数据库,必须遵照一定的准则,目的在于降低数据的冗余。

    为什么要降低数据冗余?

    为了减少磁盘存储,十几年前,磁盘是十分昂贵的

    以前没有分布式系统,多存储数据就得加磁盘

    一次修改,需要修改多个表,很难保证数据一致性

    1.3 缺点

    获取数据时,需要通过多表连接才能得出最后数据。

    1.4 分类

    目前业界范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。一般说来,数据库只需满足第三范式(3NF)就行了。

    2. 函数依赖

    2.1 完全函数依赖

     

    设X,Y时关系R的两个属性集合,X’是X的真子集,存在 X → Y,每一个X’都有X’!→ Y,则称Y完全依赖于X。记作:

     

    比如通过(学号,课程)退出分数,但是单独用学号无法推出分数,那么可以说:分数完全依赖于(学号,课程)。

    2.2 部分函数依赖

     

    设Y依赖于X,但不完全依赖X,则Y部分依赖于X,记作:

     

    比如通过(学号,课程)推出姓名,但也可以直接通过学号推出姓名,所以姓名部分依赖于(学号,课程)。

    2.3传递函数依赖

    设X,Y,Z是关系R中互不相同的属性集合,存在X→ Y(Y!→ X),Y→ Z,则称Z传递依赖于X。记作

    比如:学号推出系名,系名推出系主任,但是系主任推不出学号,系主任主要依赖于系名。这种情况可以说:系主任传递依赖于学号。

    3.三范式

    3.1 第一范式(1NF)

    第一范式的核心要求:属性不能分割。

     

    很明显,上图所示的表的设计师不符合第一范式的,商品列中的数据不是原子数据项,是可以进行分割的,因此对表进行修改,让表符合第一范式,结果如下:

     

     

    在任何一个关系数据库中,第一范式[1NF]是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。例如在MySQL,Oracle,SQL Server中建表的时候,如果表的设计不符合这个要求,那么操作一定是不能成功的。也就是说,只要在RDBMS中已经存在的表,一定是符合第一范式的。

     

    3.2 第二范式(2NF)

    满足第二范式必须先满足第一范式。第二范式的核心要求:不能存在部分依赖,即确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

     

    以上表就明显存在部分依赖,比如,这张表的主键是(学号,课程),分数确实完全依赖于主键,但是姓名并不完全依赖于主键。所以,我们应当去掉部分依赖。

     

    3.3 第三范式

    满足第三范式必须先满足第二范式。第三范式的核心要求:不能存在传递函数依赖。即确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

     

    在下边这张表中,存在传递函数依赖:学号—>系名—>主任,但是系主任推不出学号。

     

    因此这张表可以再次拆分:


    数据仓库——数据同步策略

     

    一.表的种类及其概念

    1.实体表

    2.维度表

    3.事实表

     

    二.数据同步策略

    1.全量同步策略

    2.增量同步策略

    3.新增及变化策略

    4.特殊策略

    一.表的种类及其概念

    1.实体表

    一般是指一个现实中存在的业务对象,实体表它放的数据一定是一条条客观存在的事物数据,比如用户,商家,商品等(某东上的某某人参丸就是一个实体)

    2.维度表

    一般是指业务中的一些状态,代码的解释表(也称为码表)。维度表可以看成是用户用来分析一个事实的窗口,它里面的数据应该是对事实的各个方面描述。

    维度表还可以分为一般维度表和固定维度表。

    一般维度表:数据是可以增加以及变化的。比如:商品分类,时间等

    固定维度表:数据是固定不变的。比如:性别,订单状态等。

    3.事实表

    事实表其实质就是通过各种维度和一些指标值得组合来确定一个事实的,比如通过时间维度,地域组织维度,指标值可以去确定在某时某地的一些指标值怎么样的事实。事实表的每一条数据都是几条维度表的数据和指标值交汇而得到的。

    事实表还可以分为周期型事实表、事务型事实表和累计快照事实表。

    事务型事实表

    事务事实表记录的事务层面的事实,保存的是最原子的数据,也称“原子事实表”。事务事实表中的数据在事务事件发生后产生,数据的粒度通常是每个事务记录一条记录。一旦事务被提交,事实表数据被插入,数据就不再进行更改,其更新方式为增量更新。由于事实表具有稀疏性质 ,因此只有当天数据才会进入 当天的事实表中,相当于每个分区里面都是每天的数据,不包含之前的数据1。比如:交易流水、操作日志、出入库记录等。

    事实表一般围绕着度量来建立,当度量产生的时候,事实记录就生成了。度量可以是销售数量、交易流水值、月末节余等数值。如果同时生成多个度量值的话,我们可以在一个事实表中建立多个事实。当我们的事实表中的事实比较多时,有可能多个事实不同时发生,如果同时生成的几率很小,我们称之为稀疏事实表(Sparse Facts)2

    周期型快照事实表

    周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,时间间隔如每天、每月、每年等等。比如订单表,其中有一个字段,订单状态,这个会周期性变化。 再比如,请假、贷款申请,随着批复状态在周期性变化;销售日快照表、库存日快照表等。

    周期快照表没有粒度的概念,取而代之的是周期+状态度量的组合,如历史至今的订单总数,其中历史至今是 一个周期,订单总数是度量。

    累计型快照事实表

    周期快照事实表记录的确定的周期的数据,而累积快照事实表记录的不确定的周期的数据。累积快照事实表代表的是完全覆盖一个事务或产品的生命周期的时间跨度,它通常具有多个日期字段,用来记录整个生命周期中的关键时间点。例如订单累计快照事实表会有付款日期,发货日期,收货日期等时间点。再比如用户的修改记录信息。

    **累计快照事实表用于跟踪业务事实的变化。**例如,数据仓库中可能需要累积或者存储订单从下订单开始,到订单商品被打包、运输、和签收的各个业务阶段的时间点数据来跟踪订单声明周期的进展情况。当这个业务过程进行时,事实表的记录也要不断更新。

     

    事务型事实

    周期快照事实

    累积快照事实

    时间/时期

    离散事务时间点

    规律性时间间隔

    时间跨度较短的多个时点

    粒度

    每行代表一个交易事件

    每行代表一个时间周期的一个实体

    每行代表一个实体的生命周期

    事实表加载

    新增

    新增

    新增和修改

    事实表更新

    不更新

    不更新

    新事件产生时更新

    时间维度

    业务日期

    时期末

    多个业务过程的完成日期

    事实

    事务事实

    累积事实

    业务过程事实

    二.数据同步策略

    1.全量同步策略

    每日全量,每天存储一份完整数据,作为一个分区。适用于表数据不大,且每天既有新数据插入,也会有旧数据修改的场景。

    例如:编码字典表,品牌表,商品分类表,优惠表,活动表,商品表,加购表,SPU表等。

    2.增量同步策略

    每天存储一份增量数据,作为一个分区。适用于表数据量大,且每天只有新数据插入的场景。例如:退单表,订单状态表,支付流水表,订单详情表,商品评论表等。

    3.新增及变化策略

    每日新增及变化,就是存储创建时间和操作时间都是今天的数据。适用场景为表的数据量大,既会有新增,又会有变化。例如用户表、订单表、优惠券领用表等。

    4.特殊策略

    客观世界维度

    没变化的客观世界的维度(比如性别,地区,民族,政治成分,鞋子尺码)可以只存一份固定值。

    日期维度

    日期维度可以一次性导入一年或若干年的数据。

    地区维度

    省份表、地区表。


     

    数仓分层:

     

    数仓业务流程:

     

    公共数据:启动日志数据(启动时的数据)

    业务数据:事件日志数据( 用户点击等行为)

    埋点:js,获得所有点击动作

    前两个flume节点:

    1. 从日志服务器采集数据

    2. 作为kafka生产者,向kafka传输数据

    第3个flume节点:

           1.作为kafka消费者,从kafka获取数据

           2.将获得的数据存入hdfs

     

    Flume:核心概念agent

    Agent内部分为3个模块:source、channel、sink

    1.source:数据源,一个flume源头。输入 RPC、文件、exec、syslog

    2.channel:存储池:消息缓存

    3.sink:把数据(event事件)放置到外部的数据介质上。 输出 hdfs、hbase、kafka、Flume、DB

     

     

    拦截器作用:区分上述两个数据

    1.ETL拦截器(轻度清洗): etl(抽取、转换、加载),过滤json格式不对、数据不全

    2.类型拦截器:分类

    flume conf文件编写步骤:

    1.先定义三个名字

    2.依次写source、channel、sink

    3.channel通过名字连接souce、sink

    断点重传:TAILDIR,多目录

     

    展开全文
  • 数据仓库相关知识

    2020-07-11 22:37:22
    它出于分析性报告和决策支持目的而创建。 数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用,这也是为什么叫“仓库”,而不叫“工厂”的原因。 2.数据...

    1.数据仓库的基本概念

    英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持目的而创建。

    数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用,这也是为什么叫“仓库”,而不叫“工厂”的原因。
    在这里插入图片描述

    2.数据仓库的主要特征

    数据仓库是
    面向主题的(Subject-Oriented)、
    集成的(Integrated)、
    非易失的(Non-Volatile)和
    时变的(Time-Variant )数据集合,用以支持管理决策。

    3. 数据仓库与数据库区别

    在这里插入图片描述
    数据库与数据仓库的区别实际讲的是 OLTP 与 OLAP 的区别。

    操作型处理,叫联机事务处理 OLTP(On-Line Transaction Processing),也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理。

    分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing),一般针对某些主题的历史数据进行分析,支持管理决策。

    首先要明白,数据仓库的出现,并不是要取代数据库。

    • 数据库是面向事务的设计,数据仓库是面向主题设计的。
    • 数据库一般存储业务数据,数据仓库存储的一般是历史数据。
    • 数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
    • 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。

    以银行业务为例。
    数据库是事务系统的数据平台,客户在银行做的每笔交易都会写入数据库,被记录下来,这里,可以简单地理解为用数据库记账。
    数据仓库是分析系统的数据平台,它从事务系统获取数据,并做汇总、加工,为决策者提供决策的依据。比如,某银行某分行一个月发生多少交易,该分行当前存款余额是多少。如果存款又多,消费交易又多,那么该地区就有必要设立ATM了。

    显然,银行的交易量是巨大的,通常以百万甚至千万次来计算。事务系统是实时的,这就要求时效性,客户存一笔钱需要几十秒是无法忍受的,这就要求数据库只能存储很短一段时间的数据。而分析系统是事后的,它要提供关注时间段内所有的有效数据。这些数据是海量的,汇总计算起来也要慢一些,但是,只要能够提供有效的分析数据就达到目的了。

    数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”。

    4.数据仓库分层架构

    在这里插入图片描述
    按照数据流入流出的过程,数据仓库架构可分为三层——源数据数据仓库数据应用。

    数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。

    1. 源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
    2. 数据仓库层(DW):也称为细节层,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
    3. 数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。

    数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。

    为什么要对数据仓库分层?

    用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。

    通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。

    5. 表的分类

    5.1 实体表

    一般是指一个现实存在的业务对象,比如用户,商品,商家,销售员等等。

    用户表:
    用户id 姓名 生日 性别 邮箱 用户等级 创建时间
    1 张三 2011-11-11 男 zs@163.com 2 2018-11-11
    2 李四 2011-11-11 女 ls@163.com 3 2018-11-11
    3 王五 2011-11-11 中性 ww@163.com 1 2018-11-11

    5.2 维度表

    一般是指对应一些业务状态,编号的解释表。也可以称之为码表。
    比如地区表,订单状态,支付方式,审批状态,商品分类等等。

    订单状态表:
    订单状态编号 订单状态名称
    1 未支付
    2 支付
    3 发货中
    4 已发货
    5 已完成

    5.3 事务型事实表

    事务型事实表,一般指随着业务发生不断产生的数据。特点是一旦发生不会再变化。
    一般比如,交易流水,操作日志,出库入库记录等等。

    交易流水表: ]
    编号 对外业务编号 订单编号 用户编号 支付宝交易流水编号 支付金额 交易内容 支付类型 支付时间
    1 7577697945 1 111 QEyF-63000323 223.00 海狗人参丸1 alipay 2019-02-1000:50:02
    2 0170099522 2 222 qdwV-25111279 589.00 海狗人参丸2 wechatpay 2019-02-10

    5.4 周期型事实表

    周期型事实表,一般指随着业务发生不断产生的数据。
    与事务型不同的是,数据会随着业务周期性的推进而变化。
    比如订单,其中订单状态会周期性变化。再比如,请假、贷款申请,随着批复状态在周期性变化。

    订单表:
    订单编号 订单金额 订单状态 用户id 支付方式 支付流水号 创建时间 操作时间
    1 223.00 2 111 alipay QEyF-63000323 2019-02-10 00:01:29 2019-02-10 00:01:29
    2 589.00 2 222 wechatpay qdwV-25111279 2019-02-10
    00:05:02 2019-02-10 00:05:02
    3 485.00 1 666 unionpay hSUS-65716585 2019-02-10 00:50:02 2019-02-10
    00:50:02

    6. 数据同步策略

    数据同步策略的类型包括:全量表、增量表、新增及变化表、拉链表

    • 全量表:存储完整的数据。
    • 增量表:存储新增加的数据。
    • 新增及变化表:存储新增加的数据和变化的数据。
    • 拉链表:对新增及变化表做定期合并。
    6.1 实体表同步策略

    实体表:比如用户,商品,商家,销售员等
    实体表数据量比较小:通常可以做每日全量,就是每天存一份完整数据。即每日全量。

    6.2 维度表同步策略

    维度表:比如订单状态,审批状态,商品分类
    维度表数据量比较小:通常可以做每日全量,就是每天存一份完整数据。即每日全量。

    说明:
    1)针对可能会有变化的状态数据可以存储每日全量。
    2)没变化的客观世界的维度(比如性别,地区,民族,政治成分,鞋子尺码)可以只存一份固定值。

    6.3 事务型事实表同步策略

    事务型事实表:比如,交易流水,操作日志,出库入库记录等。
    因为数据不会变化,而且数据量巨大,所以每天只同步新增数据即可,所以可以做成每日增量表,即每日创建一个分区存储。

    6.4 周期型事实表同步策略

    周期型事实表:比如,订单、请假、贷款申请等
    这类表从数据量的角度,存每日全量的话,数据量太大,冗余也太大。如果用每日增量的话无法反应数据变化。

    每日新增及变化量,包括了当日的新增和修改。一般来说这个表,足够计算大部分当日数据的。但是这种依然无法解决能够得到某一个历史时间点(时间切片)的切片数据。

    所以要用利用每日新增和变化表,制作一张拉链表,以方便的取到某个时间切片的快照数据。所以我们需要得到每日新增及变化量。

    7. 范式理论

    7.1 范式概念

    关系型数据库设计时,遵照一定的规范要求,目的在于降低数据的冗余性,目前业界范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。

    范式可以理解为设计一张数据表的表结构,符合的标准级别
    使用范式的根本目的是:

    • 1)减少数据冗余,尽量让每个数据只出现一次。
    • 2)保证数据一致性

    缺点是获取数据时,需要通过Join拼接出最后的数据。

    7.2 函数依赖

    在这里插入图片描述

    7.3 三范式区分

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    8 关系建模与维度建模

    8.1 关系模型

    在这里插入图片描述
    关系模型主要应用与OLTP系统中,为了保证数据的一致性以及避免冗余,所以大部分业务系统的表都是遵循第三范式的。

    8.2 维度模型

    在这里插入图片描述
    维度模型主要应用于OLAP系统中,因为关系模型虽然冗余少,但是在大规模数据,跨表分析统计查询过程中,会造成多表关联,这会大大降低执行效率。

    所以把相关各种表整理成两种:事实表和维度表两种。所有维度表围绕着事实表进行解释。

    8.3 雪花模型、星型模型和星座模型

    在维度建模的基础上又分为三种模型:星型模型、雪花模型、星座模型。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • hive数据仓库

    千次阅读 2019-01-11 23:20:07
    hive数据仓库的搭建 hive是数据仓库,将sql语句转变成MapReducer任务进行运行的,具体任务由MapReducer执行,所以hive不是分布式的. HQL DDL语句 操作库 创建数据库create database [库名]; 查看库show databases;...

    目录

    hive简单介绍

    • hive不是分布式的.
    • hive基于hadoop的数据仓库, 将结构化的数据文件映射成为一张hive数据库表,并且提供简单的sql查询功能 , 可以将sql语句转换成MapReduce任务执行 , hive2.x版本后支持转换成spark任务,更快.
    • 为什么要学hive? hive产生的目的是为了让非java编程者使用SQL对HDFS的数据进行mapreduce操作,使用sql来快速实现简单的MR统计任务 , 不必开发专门的MR应用,降低了学习的成本 , 非常适合数据仓库的统计分析 .
    • 数据仓库,为企业所有级别的决策制定过程 ,提供所有类型数据支持的战略集合 . 出于分析性报告和决策支持目的而创建. 总之, 数据仓库是用来做查询分析的数据库 , 基本不用来做插入,修改.删除操作
    • 数据库一般用作实时的交互和持久化 , 数据仓库一般用于数据分析 .
    • 数据处理大致分两大类 : 联机事务处理OLTP和联机分析处理OLAP .
    • OLTP是传统关系型数据库的主要应用 , 基本的日常的事务处理 , 像银行交易 . OLTP强调数据库内存效率 , 强调内存各种指标的命令率 , 绑定变量和并发操作 .
    • OLAP是数据仓库的主要运用 , 支持复杂的分析操作 , 侧重决策支持 , 并且提供直观易懂的查询结果. 强调数据分析 , 强调SQL执行时常 , 强调磁盘I/O , 强调分区等 .
      在这里插入图片描述

    hive架构

    在这里插入图片描述

    • hive的与用户接口有三个:CLI , client 和WUI .
    • 最常用的是CLI命令行 , CLI启动的时候, 同时启动一个hive副本,
    • client是hive的客户端, 用户连接到HiveServer . 启动Client模式的时候, 需要指出HiveServer所在节点 , 在该接电启动HiveServer .
    • wui是通过浏览器访问Hive
    • Hive将元数据储存在Mysql等数据库中 , Hive中的元数据包括表名, 表的列和分区以及属性 , 是否为外表 , 表的数据所在路径等 .
    • 解释器 , 编译器,优化器完成HQL查询语句从词法分析, 语法分析,编译优化以及查询计划的生成 . 生成的查询计划存储在HDFS中 , 随后有MR调用执行 .
    • 编译器将hive sql转换成操作符, 曹组舒服是hive的最小处理单元 . 每个操作符代表HDFS的一个操作或者一道mapreduce作业 . 操作符有select操作符用于查询 ,TableScan操作符用于扫描数据表 , limit操作符用于限制输出, FileOutput操作符用于文件输出 .
    • Hive数据存储在HDFS中 , 使用者写sql语句后任务被解析成MR任务来执行 . 但不是所有的sql语句都要被解析成MR任务来执行的 , 例如select * 这种查询所有数据的语句 , 我们只需要直接将hdfs上的数据文件读出来就可以了 .
    • HIve的执行流程: 使用者提交一个sql , 客户端访问服务端 , 服务端和关系型数据库交互, 通过元数据信息判断数据库表是否存在, 如果存在就把sql进行Compiler编译成一个jar包或者java程序 , 提交给hadoop的mapreduce执行任务 , 之后返回数据给服务端 , 服务端返回数据到客户端 .

    DDL语句

    1. 操作库
    • 创建数据库create database [库名];
    • 查看库show databases;
    • 删除数据库drop database [库名]如果要删除非空的数据库drop database [库名] cascade;
    • 使用数据库use [库名]
    1. 操作表

    数据类型:

    • data_type
    • primitive_type 原始数据类型
    • array_type 数组
    • map_type map
    • struct_type
    • union_type – (Note: Available in Hive 0.7.0 and later)
    • primitive_type (基本类型)
      : TINYINT
      | SMALLINT
      INT
      BIGINT
      | BOOLEAN
      | FLOAT
      DOUBLE
      | DOUBLE PRECISION
      STRING 基本可以搞定一切
      | BINARY
      | TIMESTAMP
      | DECIMAL
      | DECIMAL(precision, scale)
    • DATE
      | VARCHAR
      | CHAR
    • array_type
      : ARRAY < data_type >
    • map_type
      : MAP < primitive_type, data_type >
    • struct_type
      : STRUCT < col_name : data_type [COMMENT col_comment], …>
    • union_type
      : UNIONTYPE < data_type, data_type, … >


      (要插入的数据)在这里插入图片描述
    • 查看表结构
      desc [表名];
    • 查看详细的表结构
      desc formatted [表名];
    • 创建表
      在这里插入图片描述
    create table abc(
     id int,
     name string,
     age int,
     likes array<string>,
     address map<string,string>
     )
     row format delimited fields terminated by ','
     COLLECTION ITEMS TERMINATED by '-'
     map keys terminated by ':'
     lines terminated by '\n';
    Select address[‘city’] from person where name=‘zs’;
    
    • 创建外部表,表删除只删除元数据,不删除数据,再次创建数据自动恢复
    create external table people(
     id int,
     name string,
     age int,
     likes array<string>,
     address map<string,string>
     )
     row format delimited fields terminated by ','
     COLLECTION ITEMS TERMINATED by '-'
     map keys terminated by ':'
     lines terminated by '\n';
    
    
    • 删除表,更新表

    drop table [表名]

    • 修改表
    • 更新数据
    • 删除数据

    DML语句

    • 插入/导入数据
    • HDFS:LOAD DATA INPATH 'hdfs://[集群名称]/[文件]' OVERWRITE INTO TABLE [表名];
    • 本地磁盘:LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE [表名]
    • 创建2表,然后表1中导入数据:INSERT OVERWRITE TABLE [表2] SELECT id,name,age From [表名];
    • FROM [表1] t1 INSERT OVERWRITE TABLE [表1] SELECT t1.id , t1.name, t1.age;

    hive分区

    为了方便管理和查询海量数据,我们可以建立分区(可按日期 部门等具体业务分区)。分门别类的管理。
    必须在表定义时创建partition !
    分区分为:单分区和多分区
    分区分为:静态分区和动态分区

    • 查看分区
      show partitions [表名];
    • 创建分区
    1. 创建单分区表
    create table day_table(
    	id int, 
    	content string
    	)
    	partitioned by (dt string) 
    	row format delimited fields terminated by ',';
    
    • 向分区的表导入数据

    本地:load data local inpath '[本地文件路径]' into table [表名] partition([分区字段名]='值');
    例子:load data local inpath ‘/root/havedate’ into table day_table partition(dt=‘2019-01-12’);
    hdfs:
    查询数据select * from [表名] where [分区字段名]='值';

    1. 创建多分区表
    create table day_table2(
    	id int, 
    	content string
    	)
    	partitioned by (dt string,hour string) 
    	row format delimited fields terminated by ',';
    

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

    • 修改分区
      alter table [表名] add partition([分区字段名]='值')',例子: alter table day_table add partition(dt=‘2028-08-08’); 不能增减子目录结构,patition的类型在表创建的时候已经定义.相当于又添加了一个新的分区,大部分时候是为了方便insert插入数据.
    • 删除分区
      alter table [表名] drop partition([字段名]='值')
    • 重命名分区
      alter table [表名] partition([字段名]='值') rename to partition([字段名]='新的值');

    查询后的数据保存

    • 保存到本地
      insert overwrite local directory '[本地储存路径]' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select * from [查询数据的表] ;
    • 保存到HDFS
      insert overwrite directory 'hdfs://Credi/user/o_o/' select * from [查询数据的表]
    • shell数据重定向

    备份数据和还原数据

    • 备份数据
      export table [备份的表] to '[备份数据的路径]' ;
    • 表删除后如何还原
      import from '[数据备份所在路径]'

    动态分区

    静态分区一次操作只能讲数据分到同一个分区中 , 动态分区可以实现一次操作数据分配不同分区 .
    (注意是外部分区,查询表的字段名和外部分区表的字段名不可一致 , 分区字段对应的查询表字段值放在查询的最后)
    1.创建外部分区表(删除表不删除数据)

    create external table t2(
    name string
    )
    partitioned by(country string,state string);
    

    2 开启动态分区,默认是关闭的
    set hive.exec.dynamic,partition=true;
    3. 模式,严格模式strict,至少指定一个分区为静态分区. 非严格模式honstrict,允许所有分区字段都可以收银动态,一般设置为nonstrict模式
    set hive.exec.dynamic.partition.mode=nonstrict;
    4. 在每个执行MaperReducer节点上,创建动态分区的最大上限,默认100个,例如元数据包含一年的数据,day字段有365个值,那么该参数应该设置成大于365,如果默认值是100,会报错
    set hive.exec.max.dynamic.partitions.pernode=1000
    5. 在所有执行MaperReducer的节点上,最大一共可以创建多少个动态分区.默认值是1000
    set hive.exec.max.dynamic.partitions
    6. 整个MR Job中,最大可以创建多少个HDFS文件。
    一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。
    hive.exec.max.created.files
    7. 当有空分区生成时,是否抛出异常,默认false。
    hive.error.on.empty.partition
    8.插入数据
    insert into table [表] partition([字段],[字段]) select [字段名],[分区名] from [查询表表名];
    例子:把t1表查到的数据动态导入t2表,根据值自动分区:insert into table t2 partition(country,state) select name,cty,st from t1;

    • 注意表的分区字段和表的字段不能相同,动态导入无法识别

    函数自定义

    自定义函数包括三种 UDF、UDAF、UDTF
    UDF:一进一出
    UDAF:聚集函数,多进一出,例如:Count/max/min
    UDTF:一进多出,例如:lateralview explore()
    使用方式 :在HIVE会话中add自定义函数的jar 文件,然后创建 function 继而使用函数

    • UDF:一进一出
      UDF 函数可以直接应用于 select 语句,对查询结构做格式化处理后,再输出内容。
      编写 UDF 函数的时候需要注意一下几点:
      a)自定义 UDF 需要继承 org.apache.hadoop.hive.ql.UDF
      b)需要实现 evaluate 函数,evaluate 函数支持重载。
    1. 新建java项目脱敏
    package com.tuomin;
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.Text;
    
    public class ToMin extends UDF{
    	
    	private Text res = new Text();
    	public Text evaluate(String str){
    		if(str == null){
    			return null;
    		}
    		String first = str.substring(0,1);
    		String last = str.substring(str.length()-1,str.length());
    		res.set(first+"***"+last);	
    		return res;
    	}
    }
    
    
    1. 上传服务器
    2. hive客户端加载jar包:add jar /root/tuomin.jar;
    3. hive创建临时函数:create temporary function [自定义函数名称] as '[项目包名]';create temporary function tm as ‘com.tuomin.TuoMin’;
    4. 使用函数: select tm(name) from qidu;
    5. 删除函数:drop temporary function tm;
    6. hive删除jar包:delete jar /root/tuoming.jar
    • UDAF:聚集函数,多进一出,例如:Count/max/min
      多行进一行出,如 sum()、min(),用在 group by 时
      1.必须继承org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)
      org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类 Eval uator 实现 UDAFEvaluator 接口)
      2.Evaluator 需要实现 init、iterate、terminatePartial、merge、terminate 这几个函数
      init():类似于构造函数,用于 UDAF 的初始化
      iterate():接收传入的参数,并进行内部的轮转,返回 boolean
      terminatePartial():无参数,其为 iterate 函数轮转结束后,返回轮转数据,类似于 hadoop 的 Combinermerge():接收 terminatePartial 的返回结果,进行数据 merge 操作,其返回类型为 boolean
      terminate():返回最终的聚集函数结果
      开发一个功能同:
      Oracle 的 wm_concat()函数
      Mysql 的 group_concat()
      Hive UDF 的数据类型:
      在这里插入图片描述
    • UDTF:一进多出,例如:lateralview explore()
      用的少

    分桶

    分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
    对于hive中每一个表、分区都可以进一步进行分桶。
    由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。值%桶数+1

    适用场景:
    数据抽样( sampling )、map-join

    • 开启支持分桶:set hive.enforce.bucketing=true;
      默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用)
      注意:一次作业产生的桶(文件数量)和reduce task个数一致。

    • 创建普通表

    CREATE TABLE mm( id INT, name STRING, age INT)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
    
    • 将数据加载到普通表mm , 数据格式如下
    1,tom,11
    2,cat,22
    3,dog,33
    4,hive,44
    5,hbase,55
    6,mr,66
    7,alice,77
    8,scala,88
    
    • 创建分桶表
    create table fentong(
    id int,
    name string,
    age int
    )
    clustered by(age) into 4 buckets
    row format delimited fields terminated by ',';
    

    (根据age的值分四个桶)

    • 分桶表加载数据
      insert into table fentong select id, name, age from mm;
    • 对分桶的数据进行抽样查询
      select id, name, age from fentong tablesample(bucket 2 out of 4 on age);
      (分桶表4个桶的第2个桶的数据根据age的字段进行查询)

    Hive Lateral View

    count:统计, distinct:去重, myTable1,2:虚拟表, myCol1,2,3:别名
    把qidu表的likes和address字段去重然后统计.

    select count(distinct(myCol1)), count(distinct(myCol2)) from qidu
         lateral view explode(likes) myTable1 as myCol1
         lateral view explode(address) myTable2 as myCol2,myCol3;
    
    select myCol1,myCol2,myCol3 from qidu
         lateral view explode(likes) myTable1 as myCol1
         lateral view explode(address) myTable2 as myCol2,myCol3;
    

    hive运行方式

    • Hive在Cli客户端模式中
    • 与hdfs交互,执行dfs命令dfs -ls /user/hive_local/warehouse/xx.db;
    • 与Linux交互, !pwd
    • Hive脚本运行方式:
    • 在Linux环境下查询表hive -e "select * from xx.qidu"
    • 在Linux环境下运行脚本:hive -f [脚本文件]
    • 只显示查询结果,不显示查询过程:hive -S -e [sql]
    • hive模式下,执行linux脚本source /root/file

    权限管理

    • Default Hive Authorization (Legacy Mode) hive默认授权
    • SQL Standards Based Authorization in HiveServer2基于SQL标准的Hive授权
      • 完全兼容SQL的授权模型,推荐使用该模式。
      • 除支持对于用户的授权认证,还支持角色role的授权认证
        • role可理解为是一组权限的集合,通过role为用户授权
        • 一个用户可以具有一个或多个角色
        • 默认包含俩种角色:public、admin
    • Storage Based Authorization in the Metastore Server基于存储的授权
      • 可以对Metastore中的元数据进行保护,但是没有提供更加细粒度的访问控制(例如:列级别、行级别)。
    • hive服务端 , hive-site.xml添加如下配置
    <property>
      <name>hive.security.authorization.enabled</name>
      <!--是否开启用户权限认证-->
      <value>true</value>
    </property>
    <property>
    	<!--默认语法规则,不重要-->
      <name>hive.server2.enable.doAs</name>
      <value>false</value>
    </property>
    <property>
      <name>hive.users.in.admin.role</name>
      <!--超级管理员用户名-->
      <value>root</value>
    </property>
    <property>
      <!--Java实现类manager相关类,实现了认证规则-->
      <name>hive.security.authorization.manager</name>
      <!--基于sql规范级别--><value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
    </property>
    <property>
      <!--Java实现类manager相关类,实现了认证规则-->
      <name>hive.security.authenticator.manager</name>
      <!--基于会话级别-->
      <value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>
    </property>
    
    • 服务端启动hiveserver2
    • 客户端通过beeline进行连接

    角色的添加、删除、查看、设置:
    CREATE ROLE role_name; – 创建角色
    DROP ROLE role_name; – 删除角色
    SET ROLE (role_name|ALL|NONE); – 设置角色:set role admin;
    SHOW CURRENT ROLES; – 查看当前具有的角色
    SHOW ROLES; – 查看所有存在的角色
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    hive的GUI接口

    • 下载apache-hive-1.2.1-src.tar.gz
    • 解压后,到hwi目录下web目录中,在window窗口地址栏用jar -cvf hive-hwi.war *将hwi/web/*里面所有的文件打成war包
    • 将war包上传到hive客户端节点的服务器
    • 将jdk/lib包下的tools.jar文件拷贝到hive/lib目录下cp /usr/java/jdk1.7.0_67/lib/tools.jar /home/apache-hive-1.2.1-bin/lib/
    • hive-site.xml文件中添加如下配置
     <property>
        <name>hive.hwi.listen.host</name>
    	<!--0.0.0.0代表本地-->
        <value>0.0.0.0</value>
      </property>
      <property>
        <name>hive.hwi.listen.port</name>
    	<!--监听端口9999-->
        <value>9999</value>
      </property>
      <property>
        <name>hive.hwi.war.file</name>
    	<!--GUIwar包的目录-->
        <value>lib/hive-hwi.war</value>
     </property>
    
    • hive --service hwi命令启动, 浏览器[服务器节点]:9999/hwi/访问

    hive的常用函数

    • select
    • count
    • sum
    • where
    • round
    • rand
    • < > =

    HIve优化

    • 核心思想 : 把Hive SQL 当做Mapreduce程序去优化
    • 以下SQL不会转为Mapreduce来执行
      • select仅查询本表字段
      • where仅对本表字段做条件过滤
    • Explain 显示执行计划
      EXPLAIN [EXTENDED] query : explain select count(*) from people;



    • 小表操作特别多的时候, 数据量小的时候, 设置成本地模式
      开启本地模式 : set hive.exec.mode.local.auto=true;
      • 只有加载文件的最大值如果大于默认值128M , 则自动以集群模式运行.
      • set hive.exec.mode.local.auto.inputbytes.max=128

    • 开启并行计算
      开启并行计算的前提是集群的资源够用的时候使用 , 否则会增高集群负载 .
      • set hive.exec.parallel=true;
      • 设置一次sql计算中允许并行执行的最大job个数
        hive.exec.parallel.thread.number

    • 严格模式
      放置用户误操作
      set hive.mapred.mode=strict; (默认非严格模式)
      • 功能:
        • 1.分区表必须添加where对分区字段进行条件过滤.
        • 2.order by语句必须包含limit输出限制
        • 3.限制执行笛卡尔积的查询

    • hive排序
      • Order By : 对于查询结果做全排序 , 只允许一个reduce处理(当数据量较大时慎用 , 严格模式下 ,必须要结合limit来限制输出,时间太长了,效率太低了)
      • Sort BY : 对单个reduce的数据进行排序 , 数据量大用sortby, 数据量小用orderby
      • Distribute By : 分区排序 , 多与Sort By结合使用,结合后效果等于全排.
      • Cluster By : 相当于Sort By + Distribute By , 但是区别在于Cluster By 不能通过asc,desc的方式指定排序规则 , 所以不能倒叙 .

    • Hive Join
      • 将小表放在join的左边
      • Map Join : 在Map端完成Join , 核心思想:能不经过shuffle就不经过shuffle,也就没有reduce
        • 1 . sql方式 , 在SQL语句添加MapJoin标记(mapjoin hint)
          SELECT /*+mapjoin(smallTable)*/ smllTalble.key , bigTable.value FROM smallTable JOIN bigTable ON smallTable.key = bigTable.key; 将小表的数据储存到内存中 , 当匹配到大表的数据再一起输出, 这样就在Map端完成了join操作 , 不再shuffle和reduce
        • 2 . 开启自动的MapJoin , 自动识别小表和大表
          set hive.auto.convert.join=true 开启自动识别后 , hive自动对左边的表进行统计 , 如果是小表就加入内存 , 所以前提是将小表放在join的左边
          hive.mapjoin.smalltable.filesize; 判断大表小表的阈值, 如果左边表小于该值就会被加载到内存中运行 .
          hive.ignore.mapjoin.hint=true : 开启后忽略自己在1.sql方式中手动添加的MapJoin标记
          (不太重要)hive.auto.convert.join.noconditionaltask=true;:将普通的join转化为普通的mapjoin是 , 将多个mapjoin合并为一个mapjoin;
          (不太重要)hive.auto.convert.join.noconditionaltask.size=true:多个mapjoin合并为一个mapjoin时,表的最大值 .
    • Map-Side聚合
      • set hive.map.aggr=true; :通过配置开启在Map端的聚合
        • hive.groupby.mapaggr.checkinterval=100000 : map端在group by执行聚合时处理的多少行数据(默认100000行)
        • hive.map.aggr.hash.min.reduction : 类似于combine , 进行聚合的最小比例(预先对100000条数据做聚合,聚合之后的数量/100000的值大于该配置值的0.5,则不会聚合) , 就是程序在map端先读10万行数据做一次测试 , 进行聚合,聚合后数据少了一半的话继续聚合,可以减少输出量 . 当然结果也有可能是不准确的.
        • hive.map.aggr.hash.percentmemory : map端聚合的时候能够使用的内存最大值 . - hive.map.aggr.hash.force.flush.memory.threshold : map端聚合操作时hash表的最大可用内容 , 大于该值就会触发flush;
        • hive.groupby.skewindata=true(重要) : 对groupby产生的数据倾斜做优化 , 默认是false , 数据倾斜的原因是分区的规则不合理, 开启该配置后 , 会指定一个map将数据随机分发到不同的partiton分区 ,当数据趋于平衡之后, 其他map再按分区规则进行数据分发. 所以其实在开发中吧分区规则定义好是最省事儿的, 但是定义合理的分区规则就需要我们对数据足够的了解 .

    • 控制hive中Map以及Reduce的数量
      • Map数量的控制 , map的个数取决于split切片
        • mapred.max.spilit.size : 一个spilit的最大值, 就是每个map处理文件的最大值 , 如果设置64M , 文件有67M , 就会被切成64和3两个切片 ,
        • mapred.min.spilit.size.per.node : 一个节点上spilit的最小值,就是每个map处理文件的最小值
        • mapred.min.spilit.size.per.rack : 一个机架上spilit的最小值
      • Reduce数量的控制 ,reduce个数控制的时候要注意在分桶的时候 , reduce的个数必须和桶的个数要一致
        • mapred.reduce.tasks : 强制指定reduce任务的数量
        • hive.exec.reducers.bytes.per.reducer : 每个reduce任务处理的数据量
        • hive.exec.reducer.max : 每个任务最大的reduce个数

    • Hive - JVM虚拟机的重用
      • 适用的场景 : 小文件的个数过多 , task的个数过多
      • set mapred.job.reuse.jvm.num.tasks : 设置task插槽(slot)个数 , 优点是我们在执行sql任务的时候,会需要资源的时候申请一个插槽 , 需要资源的时候 , 又申请一个插槽, 如果我们一开始就申请好足够的插槽的个数 , 就避免了一直申请的过程. 但是缺点是task插槽无论是否使用都会一直占用资源 , 只有到所有任务全部执行完成后 , 才会释放掉所有的task插槽资源 . 所以 , 要申请多少个task插槽很关键 , task插槽的个数取决于业务,数据量,job来判断和测试 .

    Hive搭建

    • 基于hadoop2.x集群和MapReducer环境和mysql关系型数据库的部署
    1. 关闭防火墙:service iptables stop
    2. 上传安装包到服务器并解压
      在这里插入图片描述
    3. 配置环境变量
    • 根目录下vim ~/.bash_profile
    • 请根据自身的文件解压路径进行配置在这里插入图片描述
    • source命令生效 source ~/.bash_profile
    1. 替换和添加相关jar包
    • 删除所有hadoop集群服务器节点hadoop文件夹/hadoop-2.6.5/share/hadoop/yarn/lib/目录下的jline-*.jar文件
    • 将hive解压文件夹下的/apache-hive-1.2.1-bin/lib/目录的jline-*jar文件拷贝到所有hadoop集群服务器节点hadoop文件夹/hadoop-2.6.5/share/hadoop/yarn/lib/目录下
      在这里插入图片描述
    1. 将hive连接mysql的jar包拷贝到hive解压目录的bin目录下/apache-hive-1.2.1-bin/lib
    2. 启动mysql数据库
    3. 启动hadoop2.x服务器集群
    4. 修改配置文件 (选择以下三种模式中的一种)
    • 本地用户模式(hive和mysql安装于同一服务器节点,多用于本地开发测试)
    • /apache-hive-1.2.1-bin/conf目录下修改hive-site.xml文件,如果没有就创建一个.
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    	<property>
    		<name>hive.metastore.warehouse.dir</name>
    		<!--设置真实的数据文件储存在HDFS的路径-->
    		<value>/user/hive_local/warehouse</value>
    	</property>
    	<property>
    		<name>hive.metastore.local</name>
    		<!--是否本地模式,true/false-->
    		<value>true</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionURL</name> 
    		<!--连接的数据库ip地址别名,我的mysql部署在node01上|hive_remote:数据库的名称|上述文件存放路径不存在则自动创建-->
    		<value>jdbc:mysql://node01/hive_remotelocal?createDatabaseIfNotExist=true</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionDriverName</name>
    		<!--jdbc驱动类-->
    		<value>com.mysql.jdbc.Driver</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionUserName</name>
    		<!--数据库用户名-->
    		<value>root</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionPassword</name>
    		<!--数据库用户密码-->
    		<value>123456</value>
    	</property>
    </configuration>
    
    
    • 关闭防火墙,启动mysql,启动hadoop集群,使用命令hive启动Hive
    • 远程模式(hive和mysql安装于不同不服务器节点)

    1. remote一体(mysql服务端和客户端安装于不同的服务器节点)

    • 此时mysql数据库部署在node01,我们将配置好的hive文件夹移动到node02或者node03都是远程模式中的一体模式
    • 环境变量配置文件~/.bash_profile文件也相应发送到node02或node03,然后source命令生效
    • /apache-hive-1.2.1-bin/conf目录下修改hive-site.xml文件,如果没有就创建一个.
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    	<property>
    		<name>hive.metastore.warehouse.dir</name>
    		<!--设置真实的数据文件储存在HDFS的路径-->
    		<value>/user/hive_local/warehouse</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionURL</name> 
    		<!--连接的数据库ip地址别名,我的mysql部署在node01上|hive_remote:数据库的名称|上述文件存放路径不存在则自动创建-->
    		<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionDriverName</name>
    		<!--jdbc驱动类-->
    		<value>com.mysql.jdbc.Driver</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionUserName</name>
    		<!--数据库用户名-->
    		<value>root</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionPassword</name>
    		<!--数据库用户密码-->
    		<value>123456</value>
    	</property>
    		<property>
    		<name>hive.metastore.local</name>
    		<!--是否本地模式,true/false-->
    		<value>false</value>
    	</property>
    </configuration>
    
    • 如果是hadooop2.5版本,还需加入如下配置(2.6加了反而出错):
    <property>
      <name>hive.metastore.uris</name>
      <!--指定数据去哪里获取,服务器端-->
      <value>thrift://node01:9083</value>
    </property>
    

    2. remote分开模式(公司企业常用,hive和mysql服务端以及客户端均安装于不同服务器节点)

    • node01:mysql
    • node02:hive 服务端
    • node03:客户端

    - node02

    • 将hive配置文件夹,环境变量发送给node02,source命令生效
    • (服务端配置)/apache-hive-1.2.1-bin/conf目录下修改hive-site.xml文件,如果没有就创建一个.
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    	<property>
    		<name>hive.metastore.warehouse.dir</name>
    		<!--设置真实的数据文件储存在HDFS的路径-->
    		<value>/user/hive_local/warehouse2</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionURL</name> 
    		<!--连接的数据库ip地址别名,我的mysql部署在node01上|hive_remote:数据库的名称|上述文件存放路径不存在则自动创建-->
    		<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionDriverName</name>
    		<!--jdbc驱动类-->
    		<value>com.mysql.jdbc.Driver</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionUserName</name>
    		<!--数据库用户名-->
    		<value>root</value>
    	</property>
    	<property>
    		<name>javax.jdo.option.ConnectionPassword</name>
    		<!--数据库用户密码-->
    		<value>123456</value>
    	</property>
    </configuration>
    

    - node03

    • 将hive配置文件夹,环境变量发送给node03,source命令生效
    • (客户端配置)/apache-hive-1.2.1-bin/conf目录下修改hive-site.xml文件,如果没有就创建一个.
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
       <configuration>
       	<property>
       		<name>hive.metastore.warehouse.dir</name>
       		<!--设置真实的数据文件储存在HDFS的路径,客户端需要和服务器端保持一致-->
       		<value>/user/hive/warehouse2</value>
       	</property>
       	<property>
       		<name>hive.metastore.local</name>
       		<!--是否本地模式,true/false-->
       		<value>false</value>
       	</property>
       	<property>
       		<name>hive.metastore.uris</name>
       		<!--指定服务器端-->
       		<value>thrift://node02:9083</value>
       	</property>
    </configuration>
    
    • 启动即可

    3. 内嵌Derby单用户模式

    这种安装模式的元数据是内嵌在Derby数据库中的,只能允许一个会话连接,数据会存放到HDFS上。
    这种方式是最简单的存储方式,只需要hive-site.xml
    做如下配置便可(注:使用 derby 存储方式时,运行 hive 会在当前目录生成一个 derby 文件和一个 metastore_db)

    <?xml version="1.0"?>
    
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    
    <configuration>
    <property> 
    
    <name>javax.jdo.option.ConnectionURL</name>
    
    <value>jdbc:derby:;databaseName=metastore_db;create=true</value> </property>
    <property>
    
    <name>javax.jdo.option.ConnectionDriverName</name>
    
    <value>org.apache.derby.jdbc.EmbeddedDriver</value>
    
    </property>
    <property>
    
    <name>hive.metastore.local</name>
    
    <value>true</value>
    
    </property>
    <property>
    
    <name>hive.metastore.warehouse.dir</name>
    
    <value>/user/hive/warehouse</value>
    
    </property>
    </configuration>
    

    在这里插入图片描述

    hadoop2.x搭建hive后的集群启动

    启动集群

    • 关闭所有防火墙service iptables stop
    • 启动所有的zookeeper服务器(ZK)zkServer.sh start,
    • 全面启动start-all.sh
    • 规划作为RM服务器的节点启动ResourceManeger:yarn-daemon.sh start resourcemanager
    • 启动mysqlservice mysqld start
    • 启动hive数据仓库:
    • 本地模式:hive
    • 分开模式:服务端启动hive --service metastore,客户端启动hive

    关闭集群

    • 退出hive
    • 关闭hadoopstop-all.sh
    • 关闭所有的zookeeper服务器(ZK)zkServer.sh stop,
    • 规划作为RM服务器的节点关闭ResourceManeger:yarn-daemon.sh stop resourcemanager
    • 关闭数据库
    展开全文
  • 数据仓库研发规范

    2021-01-28 14:01:35
    数据仓库研发规范数据仓库研发规范概述阶段规划角色职责数据仓库研发规范整体流程需求阶段首次需求流程迭代需求流程设计阶段开发阶段测试阶段发布阶段运维阶段背景信息操作步骤 数据仓库研发规范概述 将为您介绍数据...
  • 数据仓库与数据挖掘综述概念体系结构趋势应用报告人朱建秋 2001年6月7日提纲数据仓库概念数据仓库体系结构及组件数据仓库设计数据仓库技术与数据库技术的区别数据仓库性能数据仓库应用数据挖掘应用概述数据挖掘技术...
  • 数据仓库建设

    2021-03-31 11:43:25
    比如在很多数据报告中都会对同一个功能进行数据提取、分析,但是都是各自处理一遍,没有对结果进行共享。 2.数据分散在多个数据源,如MySQL、MongoDB、Elasticsearch,很难对多个源的数据进行联合使用、有效组织。 ...
  • 仓库管理

    2009-11-10 14:16:00
    <!--google_ad_client = "pub-0246923946865164";/* 728x90, created 10/10/09 */google_ad_slot = "1248078023";google_ad_width = 728;google_ad_height = 90;// --> 仓库管理
  • 创业公司做数据分析(六)数据仓库的建设

    万次阅读 多人点赞 2017-02-02 19:36:58
    本文重点探讨了数据处理层中数据仓库的建设,旨在构建一个适于分析的数据存储系统。文章探讨了数据仓库建设中的两个重要环节:数据建模与ETL过程,根据实践谈了谈维度建模的方法,以及ETL中的增量更新机制与基于...
  • 浅谈数据仓库质量管理规范

    千次阅读 2020-11-25 07:00:00
    大家好,我是一哥,今天和大家聊一下如何管理数据仓库质量如何管理。一、 背景现在数据仓库层面的工作越来越多,开发人员也越来越多,如何保障数据准确性是一项非常重要的工作,,数据仓库的很多应...
  • 4、确立阶段(1991) 企业级数据仓库(EDW,1991)1991年,BillInmon出版了其有关数据仓库的第一本书,这本书不仅仅说明为什么要建数据仓库、数据仓库能给你带来什么,更重要的是,Inmon第一次提供了如何建设数据...
  • 数据库 课程设计报告 题目仓库管理系统 组长王 宁 P0 组员胡乐乐 P0 徐 建 P0 葛 东 P0 张 超 P0 指导教师 曹永春 计算机科学与信息工程学院 仓库管理系统 一设计目标 企业的仓库物资管理往往复杂 繁琐本系统主要...
  • 仓库物资如有损失、贬值、报废、盘盈、盘亏等,保管员应及时报告科长,分析原因,查明责任,按规定办理报批手续。 第十一条 保管物资要根据其自然属性,考虑储存的场所和保管常识处理,加强保管措施,达到“十不”...
  • 仓库知识大全

    千次阅读 2012-12-10 14:25:03
    仓库管理(Inventory Management) 1、物料的基本知识: 1.1、物料的分类: 1.1.1、依物理化学性质来分:如五金、塑胶、线材、电子元件等。 1.1.2、依形态来分:原料、部品、半成品、成品。 1.1.3、依重要性来分...
  • 一、 背景现在数据仓库层面的工作越来越多,开发人员也越来越多,如何保障数据准确性是一项非常重要的工作,,数据仓库的很多应用数据直接呈现给用户或者支撑企业分析决策的,容不得数据出现错误。随...
  • 作者:惠明,美团外卖数据智能组技术专家,2014年加入美团外卖,从0到1建设美团外卖数据仓库,现负责美团外卖数据仓库和数据应用工作。导读:美团外卖数据仓库主要是收集各种用户终端业务、行为...
  • 数据仓库痛点 痛点一:临时获取数据需求占用数据仓库大部分时间(自助获取数据工具 + OLAP系统); 痛点二:数仓规范和流程不一致,跨部门合作困难(建模规范和开发规范); 痛点三:指标...
  • 评估:针对实时报告以及整合服务机制,对每一个方法提供最合适的技术并进行分析 判定:按需求分类,通过选择技术途径以及方法论上指导ETL工作组 对于快速执行的垂直系统,数据仓库要完成决策任务,要给操作系统...
  • 仓库管理概况

    千次阅读 2010-04-12 14:23:00
    仓库总体运作流程一、仓库总体运作流程图二、物料收货控制程序(受控)1、目的对本公司进料的数量进行控制,确保进料的数量符合物控要求,及时满足生产需要。2、适用范围适用于本公司对外采购的物料、发外加工的半...
  • 仓库盘点的四大方法和盘点流程

    万次阅读 2016-07-12 11:44:13
    仓库盘点的四大方法提要:一般仓库都要定期盘点,好一点的仓库,每一周盘一次,也有每个月盘点的,也有每个季度或年末盘点的,每一年至少盘一次。文 章来源于 www.fdcew.COM  盘点的四大方法  (一)永续盘点法...
  • 关于保税仓库与出口监管仓库的基础知识 一、什么是保税? 所谓“保税”,即在保税区内不涉及关税及进口环节的增值税和消费税问题。与国内其它经济开发区、高新技术开发区相比,保税区除“保税”外,同时具有其它...
  • 基于Web的仓库管理系统的设计与实现

    万次阅读 多人点赞 2019-07-02 20:27:48
    仓库物品的管理是与我们的日常生活息息相关的一个重大问题。随着我国经济飞速的发展,改革开放的不断深入,企业要想在激烈的市场竞争中立于不败之地,要想继续的发展与生存,没有现代化的管理方式与方法是万万不行的...
  • 从数据仓库到数据视图

    千次阅读 2016-04-15 13:34:49
    如何根据业务需求交付数据产品?一系列步骤可以帮助你理解亿贝的实践:1. 选择合适的数据仓库 2.建立数据模型 3. 利用第三方数据 4.使用数据库小工具 5.数据集市的使用和管理 6.制作数据视图。
  • 仓库系统事件响应表

    千次阅读 2018-05-12 21:15:25
    库存信息管理系统事件表 事件 触发器 事件源 用例 响应 目的地 采购部门上传采购订单信息 上传采购订单信息 采购部门 储存采购订单信息 运输机构发送入库运输物料信息 获取入库运输物料信息 运输机构 预分配仓库存储...
  • 尬聊数据仓库规范

    2019-05-20 20:23:42
    在学习数据仓库的基本理论知识和所需的工具后,通过案例将整个数据仓库的开发流程串联起来,掌握数据仓库从模型设计、物理实现、加载数据、自动同步以及分析指标和的过程,了解报表展示。 业务系统 业务场景 ​ 业务...
  • 智能物流刻不容缓 动态数据仓库举足轻重 发表于23小时前| 323次阅读| 来源CSDN| 32 条评论| 作者郭雪梅 动态数据库物流Teradata 摘要:对于现代物流业而言,快启动信息化系统整合,释放多年积累的...
  • 此项目为仓库管理系统,是我大二下的实训课作业,虽然是从学期初开始写的,但是实际写项目的日子也就十多天(前面都没怎么动,果然只有临近ddl效率才高)。 到我写这篇博文的时候,实际上项目还有小部分功能未完成,...
  • 文章目录数据仓库与数据挖掘课后思考题整理1 数据仓库概述思考题2 数据仓库及其设计思考题实践题3 OLAP技术思考题课后书面作业4 数据挖掘概述思考题5 关联分析思考题实践题7 分类方法思考题实践题8 回归和时序分析...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,591
精华内容 2,636
关键字:

仓库申请报告