大数据实战【千亿级数仓】阶段二

写在前面: 博主是一名大数据的初学者,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:http://alices.ibilibili.xyz/ , 博客主页:https://alice.blog.csdn.net/
尽管当前水平可能不及各位大佬,但我还是希望自己能够做得更好,因为一天的生活就是一生的缩影。我希望在最美的年华,做最好的自己

        本篇博客,博主为大家带来的是大数据实战【千亿级数仓】阶段二的内容。
在这里插入图片描述


        通过之前的预告,先来回顾一下我们需要掌握的技能。

  • 学习、掌握kettle的使用、使用kettle将项目需求所需的数据在MySQL同步到Hive。

  • 使用sqoop,将剩余的数据在MySQL同步到Hive。


        关于Kettle的具体使用情况,体贴的博主就不在这里赘述太多了,毕竟之前关于Kettle的使用说明的博客可花了不少心思。

        关于Kettle的详情,感兴趣的朋友可以进入👉Kettle专栏

        接下来讲的是,如何使用Kettle将项目所需要的数据从MySQL同步到Hive中

        首先我们将快速在MySQL中创建好原始表的sql文件复制到DataGrip的新建文件夹下
在这里插入图片描述
        然后选中右键执行
在这里插入图片描述
        执行完毕,我们集群的MySQL下就会创建一个新的数据库itcast_shop,数据库下又会有诸多已经创建好的数据表
在这里插入图片描述
这些表正是在阶段一中提到的那八十多个表

在这里插入图片描述
然而,我们本次项目中真正用到的就只有这里面中的10个
在这里插入图片描述
        现在表全在MySQL中了,我们要做的就是使用Kettle将这10个表同步到Hive中。然后将剩下的表用Sqoop导入到Hive。

        这里肯定就有朋友要问了,为什么不全部都用Sqoop同步,还要分两种方式来同步数据,不是自找麻烦么?

        确实没错,但这里使用Kettle是为了让我们对kettle的使用更熟练,毕竟Kettle的功能有多强大,相信看过博主前面的介绍kettle博文的朋友都知道。

        因为使用Kettle导入10个表的数据到Hive,因此我们需要先在Hive中将这些数据表先创建出来。

        执行下面的建表语句

-- 创建ods层订单表
drop table if exists `itcast_ods`.`itcast_orders`;
create EXTERNAL table `itcast_ods`.`itcast_orders`(
    orderId            bigint,
    orderNo            string,
    shopId             bigint,
    userId             bigint,
    orderStatus        bigint,
    goodsMoney         double,
    deliverType        bigint,
    deliverMoney       double,
    totalMoney         double,
    realTotalMoney     double,
    payType            bigint,
    isPay              bigint,
    areaId             bigint,
    userAddressId      bigint,
    areaIdPath         string,
    userName           string,
    userAddress        string,
    userPhone          string,
    orderScore         bigint,
    isInvoice          bigint,
    invoiceClient      string,
    orderRemarks       string,
    orderSrc           bigint,
    needPay            double,
    payRand            bigint,
    orderType          bigint,
    isRefund           bigint,
    isAppraise         bigint,
    cancelReason       bigint,
    rejectReason       bigint,
    rejectOtherReason  string,
    isClosed           bigint,
    goodsSearchKeys    string,
    orderunique        string,
    receiveTime        string,
    deliveryTime       string,
    tradeNo            string,
    dataFlag           bigint,
    createTime         string,
    settlementId       bigint,
    commissionFee      double,
    scoreMoney         double,
    useScore           bigint,
    orderCode          string,
    extraJson          string,
    orderCodeTargetId  bigint,
    noticeDeliver      bigint,
    invoiceJson        string,
    lockCashMoney      double,
    payTime            string,
    isBatch            bigint,
    totalPayFee        bigint
)
partitioned by (dt string)
STORED AS PARQUET;

-- 创建ods层订单明细表
drop table if exists `itcast_ods`.`itcast_order_goods`;
create EXTERNAL table `itcast_ods`.`itcast_order_goods`(
    ogId            bigint,
    orderId         bigint,
    goodsId         bigint,
    goodsNum        bigint,
    goodsPrice      double,
    payPrice        double,
    goodsSpecId     bigint,
    goodsSpecNames  string,
    goodsName       string,
    goodsImg        string,
    extraJson       string,
    goodsType       bigint,
    commissionRate  double,
    goodsCode       string,
    promotionJson   string,
    createtime      string
)
partitioned by (dt string)
STORED AS PARQUET;

-- 创建ods层店铺表
drop table if exists `itcast_ods`.`itcast_shops`;
create EXTERNAL table `itcast_ods`.`itcast_shops`(
    shopId             bigint,
    shopSn             string,
    userId             bigint,
    areaIdPath         string,
    areaId             bigint,
    isSelf             bigint,
    shopName           string,
    shopkeeper         string,
    telephone          string,
    shopCompany        string,
    shopImg            string,
    shopTel            string,
    shopQQ             string,
    shopWangWang       string,
    shopAddress        string,
    bankId             bigint,
    bankNo             string,
    bankUserName       string,
    isInvoice          bigint,
    invoiceRemarks     string,
    serviceStartTime   bigint,
    serviceEndTime     bigint,
    freight            bigint,
    shopAtive          bigint,
    shopStatus         bigint,
    statusDesc         string,
    dataFlag           bigint,
    createTime         string,
    shopMoney          double,
    lockMoney          double,
    noSettledOrderNum  bigint,
    noSettledOrderFee  double,
    paymentMoney       double,
    bankAreaId         bigint,
    bankAreaIdPath     string,
    applyStatus        bigint,
    applyDesc          string,
    applyTime          string,
    applyStep          bigint,
    shopNotice         string,
    rechargeMoney      double,
    longitude          double,
    latitude           double,
    mapLevel           bigint,
    BDcode             string,
    modifyTime         string
)
partitioned by (dt string)
STORED AS PARQUET;

-- 创建ods层商品表
drop table if exists `itcast_ods`.`itcast_goods`;
create EXTERNAL table `itcast_ods`.`itcast_goods`(
    goodsId              bigint,
    goodsSn              string,
    productNo            string,
    goodsName            string,
    goodsImg             string,
    shopId               bigint,
    goodsType            bigint,
    marketPrice          double,
    shopPrice            double,
    warnStock            bigint,
    goodsStock           bigint,
    goodsUnit            string,
    goodsTips            string,
    isSale               bigint,
    isBest               bigint,
    isHot                bigint,
    isNew                bigint,
    isRecom              bigint,
    goodsCatIdPath       string,
    goodsCatId           bigint,
    shopCatId1           bigint,
    shopCatId2           bigint,
    brandId              bigint,
    goodsDesc            string,
    goodsStatus          bigint,
    saleNum              bigint,
    saleTime             string,
    visitNum             bigint,
    appraiseNum          bigint,
    isSpec               bigint,
    gallery              string,
    goodsSeoKeywords     string,
    illegalRemarks       string,
    dataFlag             bigint,
    createTime           string,
    isFreeShipping       bigint,
    goodsSerachKeywords  string,
    modifyTime           string
)
partitioned by (dt string)
STORED AS PARQUET;

-- 创建ods层组织机构表
drop table `itcast_ods`.`itcast_org`;
create EXTERNAL table `itcast_ods`.`itcast_org`(
    orgId        bigint,
    parentId     bigint,
    orgName      string,
    orgLevel     bigint,
    managerCode  string,
    isdelete     bigint,
    createTime   string,
    updateTime   string,
    isShow       bigint,
    orgType      bigint
)
partitioned by (dt string)
STORED AS PARQUET;

-- 创建ods层商品分类表
drop table if exists `itcast_ods`.`itcast_goods_cats`;
create EXTERNAL table `itcast_ods`.`itcast_goods_cats`(
    catId               bigint,
    parentId            bigint,
    catName             string,
    isShow              bigint,
    isFloor             bigint,
    catSort             bigint,
    dataFlag            bigint,
    createTime          string,
    commissionRate      double,
    catImg              string,
    subTitle            string,
    simpleName          string,
    seoTitle            string,
    seoKeywords         string,
    seoDes              string,
    catListTheme        string,
    detailTheme         string,
    mobileCatListTheme  string,
    mobileDetailTheme   string,
    wechatCatListTheme  string,
    wechatDetailTheme   string,
    cat_level           bigint
)
partitioned by (dt string)
STORED AS PARQUET;

-- 创建ods层用户表
drop table if exists `itcast_ods`.`itcast_users`;
create EXTERNAL table `itcast_ods`.`itcast_users`(
    userId          bigint,
    loginName       string,
    loginSecret     bigint,
    loginPwd        string,
    userType        bigint,
    userSex         bigint,
    userName        string,
    trueName        string,
    brithday        string,
    userPhoto       string,
    userQQ          string,
    userPhone       string,
    userEmail       string,
    userScore       bigint,
    userTotalScore  bigint,
    lastIP          string,
    lastTime        string,
    userFrom        bigint,
    userMoney       double,
    lockMoney       double,
    userStatus      bigint,
    dataFlag        bigint,
    createTime      string,
    payPwd          string,
    rechargeMoney   double,
    isInform        bigint
)
partitioned by (dt string)
STORED AS PARQUET;

-- 创建ods层退货表
drop table if exists `itcast_ods`.`itcast_order_refunds`;
create EXTERNAL table `itcast_ods`.`itcast_order_refunds`(
    id                bigint,
    orderId           bigint,
    goodsId           bigint,
    refundTo          bigint,
    refundReson       bigint,
    refundOtherReson  string,
    backMoney         double,
    refundTradeNo     string,
    refundRemark      string,
    refundTime        string,
    shopRejectReason  string,
    refundStatus      bigint,
    createTime        string
)
partitioned by (dt string)
STORED AS PARQUET;

-- 创建ods层地址表
drop table if exists `itcast_ods`.`itcast_user_address`;
create EXTERNAL table `itcast_ods`.`itcast_user_address`(
    addressId    bigint,
    userId       bigint,
    userName     string,
    otherName    string,
    userPhone    string,
    areaIdPath   string,
    areaId       bigint,
    userAddress  string,
    isDefault    bigint,
    dataFlag     bigint,
    createTime   string
)
partitioned by (dt string)
STORED AS PARQUET;

-- 创建ods层支付方式表
drop table if exists `itcast_ods`.`itcast_payments`;
create EXTERNAL table `itcast_ods`.`itcast_payments`(
    id         bigint,
    payCode    string,
    payName    string,
    payDesc    string,
    payOrder   bigint,
    payConfig  string,
    enabled    bigint,
    isOnline   bigint,
    payFor     string
)
partitioned by (dt string)
STORED AS PARQUET;

执行完毕,此时数据库中就创建好了10个空的表
在这里插入图片描述
接下来我们就需要通过Kettle读取MySQL中的数据,输出到各个hive表存储在HDFS的路径下的parquent文件中即可。

相信看到这里的朋友,对于Kettle已经相当熟练了,所以我这里就不再像第一次教学Kettle那样细讲了。

我们根据需求,需要使用到表输入组件,字段选择(根据业务添加),parquent输出组件。

在这里插入图片描述

我们将所需要的组件连接起来,因为需要同时同步10个表的数据,所以我们也构造了10个"线路"
在这里插入图片描述
组件连接好了之后,让我们来看看如何单独设置每个的内容

首先双击空白处,我们需要设置一个kettle中的参数,方便我们调用,用来做数据分区使用

在这里插入图片描述
然后就可以进行设置表的输入了,需要注意的地方有如下四个
在这里插入图片描述
如果不放心,还可以选择预览数据
在这里插入图片描述

字段选择中,如果没有其他的特殊情况,我们这里默认就获取字段
在这里插入图片描述
然后我们就可以设置parquent文件的输出了
在这里插入图片描述
需要注意位置要设置成HDFS,然后在预览中选择需要导入Hive表在HDFS上的元数据的路径。
另外建议勾选上,覆盖已存在文件,这样我们就反复运行程序而无需担心每次都要换个输出路径了~
默认也都是获取所有的字段,然后我们就可以设置压缩格式Snappy,就可以点击确定了。
在这里插入图片描述
上面演示的是一个表从MySQL读取到输出Parquent的过程,因为这里我们涉及到了十个表,所以需要操作十次…

待到10个表的流程都完成,直接运行然后在命令行上修复分区数据也是一样的

但是都操作到这里了,我们还是换一种优雅的方式
在这里插入图片描述

首先我们新建一个作业
在这里插入图片描述
作业界面,我们获取到这些组件,并连接起来
在这里插入图片描述
Start 我们无需操作,后面挂的小锁代表着无需任何条件即可执行
关于转换组件的设置,是一个重点
这里的路径需要设置成我们前面已经创建的转换文件在本地的路径
在这里插入图片描述
接着就在SQL组件中,连接上hive,并编写需要执行的SQL脚本
在这里插入图片描述
待到设置完毕,我们就可以运行这个Job了

正常情况下,我们可以在执行完毕之后,查询之前创建的Hive数据表,可以发现10张表都已经有了数据
在这里插入图片描述

        Kettle如何实现MySQL同步到Hive已经说完了。下面我们来整点“刺激”的!


        关于全量导入mysql表数据到Hive,有以下两种方法:

        首先,进入到Sqoop的安装目录下,cd /export/servers/sqoop-1.4.6.bin__hadoop-2.0.4-alpha

方式一:先复制表结构到hive中再导入数据

        将关系型数据的表结构复制到hive中

bin/sqoop create-hive-table \
--connect jdbc:mysql://节点IP:3306/mysql数据库 \
--table mysql数据表名 \
--username mysql账户 \
--password mysql密码 \
--hive-table 数据库.需要输出的表名

        从关系数据库导入文件到hive中

bin/sqoop import \
--connect jdbc:mysql://节点IP:3306/mysql数据库\
--username mysql账户 \
--password mysql密码 \
--table mysql数据表 \
--hive-table 数据库.需要输出的表名 \
--hive-import \
--m 1

方式二:直接复制表结构数据到hive中

bin/sqoop import \
--connect jdbc:mysql://节点IP:3306/mysql数据库\
--username mysql账户 \
--password mysql密码 \
--table mysql数据表 \
--hive-import \
--m 1 \
--hive-database hive数据库;

如果用方式二想把数据导出到分区表,可以用下面这种方式

sqoop import \
--connect jdbc:mysql://IP节点:3306/mysql数据库 \
--username mysql账户 \
--password mysql密码 \
--where "查询条件" \
--target-dir /user/hive/warehouse/xxx输出路径/ \
--table mysql数据表--m 1

注意:

        用这两种方法都可以实现从MySQL同步数据到Hive,区别就在于方式二输出的hive表名与mysql输入的表名是一样的,方式一可以自己定义hive输出表的名字


小结

        大数据实战【千亿级数仓】阶段二需要大家熟练Kettle的基本使用,项目所需数据的从MySQL到Hive同步以及使用Sqoop同步其他数据。

        如果以上过程中出现了任何的纰漏错误,烦请大佬们指正😅

        受益的朋友或对大数据技术感兴趣的伙伴记得点赞关注支持一波🙏

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论
1、ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所以掌握一个ETL工具的使用,必不可少。Kettle作为ETL工具是非常强大和方便的。Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。Kettle中文名称叫水壶,该项目的主程序员MATT希望把各种数据放到一个壶里,然后以一种指定的格式流出。Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。2、Clickhouse 是俄罗斯的“百度”Yandex公司在2016年开源的,一款针对大数据实时分析的高性能分布式数据库,与之对应的有hadoop生态hive,Vertica和百度出品的palo。这是战斗民族继nginx后,又开源的一款“核武器”。Hadoop 生态体系解决了大数据界的大部分问题,当然其也存在缺点。Hadoop 体系的最大短板在于数据处理时效性。基于 Hadoop 生态的数据处理场景大部分对时效要求不高,按照传统的做法一般是 T + 1 的数据时效。即 Trade + 1,数据产出在交易日 + 1 天。ClickHouse 的产生就是为了解决大数据量处理的时效性。独立于Hadoop生态圈。3、Superset 是一款由 Airbnb 开源的“现代化的企业 BI(商业智能) Web 应用程序”,其通过创建和分享 dashboard,为数据分析提供了轻量的数据查询和可视化方案。 Superset 的前端主要用到了 React 和 NVD3/D3,而后端则基于 Python 的 Flask 框架和 Pandas、SQLAlchemy 等依赖库,主要提供了这几方面的功能:01、集成数据查询功能,支持多种数据库,包括 MySQL、PostgresSQL、Oracle、SQL Server、SQLite、SparkSQL 等,并深度支持 Druid。02、通过 NVD3/D3 预定义了多种可视化图表,满足大部分的数据展示功能。如果还有其他需求,也可以自开发更多的图表类型,或者嵌入其他的 JavaScript 图表库(如 HighCharts、ECharts)。03、提供细粒度安全模型,可以在功能层面和数据层面进行访问控制。支持多种鉴权方式(如数据库、OpenID、LDAP、OAuth、REMOTE_USER 等)。 基于Kettle+Clickhouse+Superset构建亿大数据实时分析平台课程将联合这三大开源工具,实现一个强大的实时分析平台。该系统以热门的互联网电商实际业务应用场景为案例讲解,对电商数据的常见实战指标处理使用kettle等工具进行了详尽讲解,具体指标包括:流量分析、新增用户分析、活跃用户分析订单分析、团购分析。能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。项目代码也是具有很高的商业价值的,大家可以根据自己的业务进行修改,便可以使用。本课程包含的技术:开发工具为:IDEAKettleClickhouseSupersetBinlogCanalKafkaHbaseHadoopZookeeperFlinkSpringBootSpringCouldPythonAnconaMySQL等 课程亮点:1.与企业对接、真实工业界产品2.强大的ETL工具Kettle全流程讲解实现3.ClickHouse高性能列式存储数据库4.Superset现代化的企业BI可视化5.数据库实时同步解决方案6.集成Flink实时数据转换解决方案7.主流微服务SpringBoot后端系统8.互联网大数据企业热门技术栈9.支持海量数据的实时分析10.支持全端实时数据分析11.全程代码实操,提供全部代码和资料12.提供答疑和提供企业技术方案咨询 
引用网络文章开启本课程的开篇: 在大数据分析领域中,传统的大数据分析需要不同框架和技术组合才能达到最终的效果,在人力成本,技术能力和硬件成本上以及维护成本让大数据分析变得成为昂贵的事情。让很多中小型企业非常苦恼,不得不被迫租赁第三方大型公司的数据分析服务。  ClickHouse开源的出现让许多想做大数据并且想做大数据分析的很多公司和企业耳目一新。ClickHouse 正是以不依赖Hadoop 生态、安装和维护简单、查询速度快、可以支持SQL等特点在大数据分析领域越走越远。  本课程采用全新的大数据技术栈:Flink+ClickHouse,让你体验到全新技术栈的强大,感受时代变化的气息,通过学习完本课程可以节省你摸索的时间,节省企业成本,提高企业开发效率。本课程不仅告诉你如何做项目,还会告诉你如何验证系统如何支撑亿并发,如何部署项目等等。希望本课程对一些企业开发人员和对新技术栈有兴趣的伙伴有所帮助,如对我录制的教程内容有建议请及时交流。 课程概述:在这个数据爆发的时代,像大型电商的数据量达到百亿别,我们往往无法对海量的明细数据做进一步层次的预聚合,大量的业务数据都是好几亿数据关联,并且我们需要聚合结果能在秒返回。  那么我们该如何实现这一需求呢?基于Flink+ClickHouse构建电商亿实时数据分析平台课程,将带领大家一步一步从无到有实现一个高性能的实时数据分析平台,该系统以热门的互联网电商实际业务应用场景为案例讲解,对电商数据的常见实战指标以及难点实战指标进行了详尽讲解,具体指标包括:概况统计、全站流量分析、渠道分析、广告分析、订单分析、运营分析(团购、秒杀、指定活动)等,该系统指标分为分钟和小时多时间方位分析,能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。 本课程凝聚讲师多年一线大数据企业实际项目经验,大数据企业在职架构师亲自授课,全程实操代码,带你体验真实的大数据开发过程,代码现场调试。通过本课程的学习再加上老师的答疑,你完全可以将本案例直接应用于企业。 本套课程可以满足世面上绝大多数大数据企业的海量数据实时分析需求,全部代码在老师的指导下可以直接部署企业,支撑千亿并发数据分析。项目代码也是具有极高的商业价值的,大家可以根据自己的业务进行修改,便可以使用。  本课程包含的技术: 开发工具为:IDEA、WebStorm Flink1.9.0 ClickHouseHadoop2.6.0 Hbase1.0.0 Kafka2.1.0 Hive1.0.0 Jmeter(验证如何支撑亿并发)Docker (虚拟化部署)HDFS、MapReduce Zookeeper SpringBoot2.0.2.RELEASE SpringCloud Finchley.RELEASE Binlog、Canal MySQL Vue.js、Nodejs Highcharts Linux Shell编程  课程亮点: 1.与企业对接、真实工业界产品 2.ClickHouse高性能列式存储数据库 3.大数据热门技术Flink新版本 4.Flink join 实战 5.Flink 自定义输出路径实战 6.全链路性能压力测试 7.虚拟化部署 8.集成指标明细查询 9.主流微服务后端系统 10.分钟别与小时别多时间方位分析 11.数据库实时同步解决方案 12.涵盖主流前端技术VUE+jQuery+Ajax+NodeJS 13.集成SpringCloud实现统一整合方案 14.互联网大数据企业热门技术栈 15.支持海量数据的实时分析 16.支持全端实时数据分析 17.全程代码实操,提供全部代码和资料 18.提供答疑和提供企业技术方案咨询 企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大数据梦想家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值