Projeto Shang de Big Data do Vale do Silício "Armazém de dados off-line para educação on-line" Notas 007

Endereço de vídeo: Shang Silicon Valley Big Data Project "Offline Data Warehouse for Online Education"_bilibili_bilibili

Índice

Capítulo 12 Exportação de dados de relatório

P112

01. Crie uma tabela de dados

02. Modifique o pacote jar do datax

03. arquivo ads_traffic_stats_by_source.json

P113

P114

P115

P116

P117

P118

P119

P120

P121

P122【122_Revisão do desenvolvimento de data warehouse educacional on-line 04:23】


Capítulo 12 Exportação de dados de relatório

P112

01. Crie uma tabela de dados

# 第12章 报表数据导出
CREATE DATABASE IF NOT EXISTS edu_report DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

# 12.1.2 创建表


# 01)各来源流量统计
DROP TABLE IF EXISTS ads_traffic_stats_by_source;
CREATE TABLE ads_traffic_stats_by_source
(
    `dt`               DATETIME COMMENT '统计日期',
    `recent_days`      BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `source_id`        VARCHAR(255) COMMENT '引流来源id',
    `source_site`      VARCHAR(255) COMMENT '引流来源名称',
    `uv_count`         BIGINT COMMENT '访客人数',
    `avg_duration_sec` BIGINT COMMENT '会话平均停留时长,单位为秒',
    `avg_page_count`   BIGINT COMMENT '会话平均浏览页面数',
    `sv_count`         BIGINT COMMENT '会话数',
    `bounce_rate`      DECIMAL(16, 2) COMMENT '跳出率',
    PRIMARY KEY (`dt`, `recent_days`, `source_id`)
) COMMENT '各引流来源流量统计';


# 02)页面浏览路径分析
DROP TABLE IF EXISTS ads_traffic_page_path;
CREATE TABLE ads_traffic_page_path
(
    `dt`          DATETIME COMMENT '统计日期',
    `recent_days` BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `source`      VARCHAR(255) COMMENT '跳转起始页面id',
    `target`      VARCHAR(255) COMMENT '跳转终到页面id',
    `path_count`  BIGINT COMMENT '跳转次数',
    PRIMARY KEY (`dt`, `recent_days`, `source`, `target`)
) COMMENT '页面浏览路径分析';


# 03)各引流来源销售状况统计
DROP TABLE IF EXISTS ads_traffic_sale_stats_by_source;
CREATE TABLE ads_traffic_sale_stats_by_source
(
    `dt`                 DATETIME COMMENT '统计日期',
    `recent_days`        BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `source_id`          VARCHAR(255) COMMENT '引流来源id',
    `source_site`        VARCHAR(255) COMMENT '引流来源名称',
    `order_total_amount` DECIMAL(16, 2) COMMENT '销售额',
    `order_user_count`   BIGINT COMMENT '下单用户数',
    `pv_visitor_count`   BIGINT COMMENT '引流访客数',
    `convert_rate`       DECIMAL(16, 2) COMMENT '转化率',
    PRIMARY KEY (`dt`, `recent_days`, `source_id`)
) COMMENT '各引流来源销售状况统计';


# 04)用户变动统计
DROP TABLE IF EXISTS ads_user_user_change;
CREATE TABLE ads_user_user_change
(
    `dt`               DATETIME COMMENT '统计日期',
    `user_churn_count` BIGINT COMMENT '流失用户数',
    `user_back_count`  BIGINT COMMENT '回流用户数',
    PRIMARY KEY (`dt`)
) COMMENT '用户变动统计';


# 05)用户留存率
DROP TABLE IF EXISTS ads_user_user_retention;
CREATE TABLE ads_user_user_retention
(
    `dt`              DATETIME COMMENT '统计日期',
    `create_date`     VARCHAR(255) COMMENT '用户新增日期',
    `retention_day`   INT COMMENT '截至当前日期留存天数',
    `retention_count` BIGINT COMMENT '留存用户数量',
    `new_user_count`  BIGINT COMMENT '新增用户数量',
    `retention_rate`  DECIMAL(16, 2) COMMENT '留存率',
    PRIMARY KEY (`dt`, `create_date`, `retention_day`)
) COMMENT '用户留存率';


# 06)用户新增活跃统计
DROP TABLE IF EXISTS ads_user_user_stats;
CREATE TABLE ads_user_user_stats
(
    `dt`                DATETIME COMMENT '统计日期',
    `recent_days`       BIGINT COMMENT '最近n日,1:最近1日,7:最近7日,30:最近30日',
    `new_user_count`    BIGINT COMMENT '新增用户数',
    `active_user_count` BIGINT COMMENT '活跃用户数',
    PRIMARY KEY (`dt`, `recent_days`)
) COMMENT '用户新增活跃统计';


# 07)用户行为漏斗分析
DROP TABLE IF EXISTS ads_user_user_action;
CREATE TABLE ads_user_user_action
(
    `dt`                DATETIME COMMENT '统计日期',
    `recent_days`       BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `home_count`        BIGINT COMMENT '浏览首页人数',
    `good_detail_count` BIGINT COMMENT '浏览商品详情页人数',
    `cart_count`        BIGINT COMMENT '加入购物车人数',
    `order_count`       BIGINT COMMENT '下单人数',
    `payment_count`     BIGINT COMMENT '支付人数',
    PRIMARY KEY (`dt`, `recent_days`)
) COMMENT '用户行为漏斗分析';


# 08)新增交易用户统计
DROP TABLE IF EXISTS ads_user_new_buyer_stats;
CREATE TABLE ads_user_new_buyer_stats
(
    `dt`                     DATETIME COMMENT '统计日期',
    `recent_days`            BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `new_order_user_count`   BIGINT COMMENT '新增下单人数',
    `new_payment_user_count` BIGINT COMMENT '新增支付人数',
    PRIMARY KEY (`dt`, `recent_days`)
) COMMENT '新增交易用户统计';


# 09)各年龄段下单用户数
DROP TABLE IF EXISTS ads_user_order_user_count_by_age_group;
CREATE TABLE ads_user_order_user_count_by_age_group
(
    `dt`               DATETIME COMMENT '统计日期',
    `recent_days`      BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `age_group`        VARCHAR(255) COMMENT '年龄段,18岁及以下、19-24岁、25-29岁、30-34岁、35-39岁、40-49岁、50岁及以上',
    `order_user_count` BIGINT COMMENT '下单人数',
    PRIMARY KEY (`dt`, `recent_days`, `age_group`)
) COMMENT '各年龄段下单用户数统计';


# 10)各类别课程交易统计
DROP TABLE IF EXISTS ads_course_trade_stats_by_category;
CREATE TABLE ads_course_trade_stats_by_category
(
    `dt`               DATETIME COMMENT '统计日期',
    `recent_days`      BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `category_id`      VARCHAR(255) COMMENT '类别id',
    `category_name`    VARCHAR(255) COMMENT '类别名称',
    `order_count`      BIGINT COMMENT '订单数',
    `order_user_count` BIGINT COMMENT '订单人数' ,
    `order_amount`     DECIMAL(16, 2) COMMENT '下单金额',
    PRIMARY KEY (`dt`, `recent_days`, `category_id`)
) COMMENT '各类别课程交易统计';


# 11)各学科课程交易统计
DROP TABLE IF EXISTS ads_course_trade_stats_by_subject;
CREATE TABLE ads_course_trade_stats_by_subject
(
    `dt`               DATETIME COMMENT '统计日期',
    `recent_days`      BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `subject_id`       VARCHAR(255) COMMENT '学科id',
    `subject_name`     VARCHAR(255) COMMENT '学科名称',
    `order_count`      BIGINT COMMENT '订单数',
    `order_user_count` BIGINT COMMENT '订单人数' ,
    `order_amount`     DECIMAL(16, 2) COMMENT '下单金额',
    PRIMARY KEY (`dt`, `recent_days`, `subject_id`)
) COMMENT '各学科课程交易统计';


# 12)各课程交易统计
DROP TABLE IF EXISTS ads_course_trade_stats_by_course;
CREATE TABLE ads_course_trade_stats_by_course
(
    `dt`               DATETIME COMMENT '统计日期',
    `recent_days`      BIGINT COMMENT '最近天数,1:最近 1 天,7:最近 7天,30:最近 30 天',
    `course_id`        VARCHAR(255) COMMENT '课程id',
    `course_name`      VARCHAR(255) COMMENT '课程名称',
    `order_count`      BIGINT COMMENT '下单数',
    `order_user_count` BIGINT COMMENT '下单人数',
    `order_amount`     DECIMAL(16, 2) COMMENT '下单金额',
    PRIMARY KEY (`dt`, `recent_days`, `course_id`)
) COMMENT '各课程交易统计';


# 13)各课程评价统计
DROP TABLE IF EXISTS ads_course_review_stats_by_course;
CREATE TABLE ads_course_review_stats_by_course
(
    `dt`                DATETIME COMMENT '统计日期',
    `recent_days`       BIGINT COMMENT '最近天数,1:最近 1 天,7:最近 7 天,30:最近 30 天',
    `course_id`         VARCHAR(255) COMMENT '课程id',
    `course_name`       VARCHAR(255) COMMENT '课程名称',
    `avg_stars`         BIGINT COMMENT '用户平均评分',
    `review_user_count` BIGINT COMMENT '评价用户数',
    `praise_rate`       DECIMAL(16, 2) COMMENT '好评率',
    PRIMARY KEY (`dt`, `recent_days`, `course_id`)
) COMMENT '各课程评价统计';


# 14)各分类课程试听留存统计
DROP TABLE IF EXISTS ads_sample_retention_stats_by_category;
CREATE TABLE ads_sample_retention_stats_by_category
(
    `dt`                DATETIME COMMENT '统计日期',
    `retention_days`    BIGINT COMMENT '留存天数,1-7 天',
    `category_id`       VARCHAR(255) COMMENT '分类id',
    `category_name`     VARCHAR(255) COMMENT '分类名称',
    `sample_user_count` BIGINT COMMENT '试听人数',
    `retention_rate`    DECIMAL(16, 2) COMMENT '试听留存率',
    PRIMARY KEY (`dt`, `retention_days`, `category_id`)
) COMMENT '各分类课程试听留存统计';


# 15)各学科试听留存统计
DROP TABLE IF EXISTS ads_sample_retention_stats_by_subject;
CREATE TABLE ads_sample_retention_stats_by_subject
(
    `dt`                DATETIME COMMENT '统计日期',
    `retention_days`    BIGINT COMMENT '留存天数,1-7 天',
    `subject_id`        VARCHAR(255) COMMENT '学科id',
    `subject_name`      VARCHAR(255) COMMENT '学科名称',
    `sample_user_count` BIGINT COMMENT '试听人数',
    `retention_rate`    DECIMAL(16, 2) COMMENT '试听留存率',
    PRIMARY KEY (`dt`, `retention_days`, `subject_id`)
) COMMENT '各学科试听留存统计';


# 16)各课程试听留存统计
DROP TABLE IF EXISTS ads_sample_retention_stats_by_course;
CREATE TABLE ads_sample_retention_stats_by_course
(
    `dt`                DATETIME COMMENT '统计日期',
    `retention_days`    BIGINT COMMENT '留存天数,1-7 天',
    `course_id`         VARCHAR(255) COMMENT '课程id',
    `course_name`       VARCHAR(255) COMMENT '课程名称',
    `sample_user_count` BIGINT COMMENT '试听人数',
    `retention_rate`    DECIMAL(16, 2) COMMENT '试听留存率',
    PRIMARY KEY (`dt`, `retention_days`, `course_id`)
) COMMENT '各课程试听留存统计';


# 17)交易综合指标
DROP TABLE IF EXISTS ads_trade_stats;
CREATE TABLE ads_trade_stats
(
    `dt`                 DATETIME COMMENT '统计日期',
    `recent_days`        BIGINT COMMENT '最近天数,1:最近1日,7:最近7天,30:最近30天',
    `order_total_amount` DECIMAL(16, 2) COMMENT '订单总额,GMV',
    `order_count`        BIGINT COMMENT '订单数',
    `order_user_count`   BIGINT COMMENT '下单人数',
    PRIMARY KEY (`dt`, `recent_days`)
) COMMENT '交易综合指标';


# 18)各省份交易统计
DROP TABLE IF EXISTS ads_trade_order_by_province;
CREATE TABLE ads_trade_order_by_province
(
    `dt`                 DATETIME COMMENT '统计日期',
    `recent_days`        BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `province_id`        VARCHAR(10) COMMENT '省份id',
    `province_name`      VARCHAR(30) COMMENT '省份名称',
    `region_id`          VARCHAR(30) COMMENT '大区id',
    `area_code`          VARCHAR(255) COMMENT '地区编码',
    `iso_code`           VARCHAR(255) COMMENT '国际标准地区编码',
    `iso_code_3166_2`    VARCHAR(255) COMMENT '国际标准地区编码',
    `order_count`        BIGINT COMMENT '订单数' ,
    `order_user_count`   BIGINT COMMENT '下单人数',
    `order_total_amount` DECIMAL(16, 2) COMMENT '订单金额',
    PRIMARY KEY (`dt`, `recent_days`, `province_id`, `region_id`, `area_code`, `iso_code`, `iso_code_3166_2`)
) COMMENT '各省份交易统计';


# 19)各试卷平均统计
DROP TABLE IF EXISTS ads_examination_paper_avg_stats;
CREATE TABLE ads_examination_paper_avg_stats
(
    `dt`             DATETIME COMMENT '统计日期',
    `recent_days`    BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `paper_id`       VARCHAR(255) COMMENT '试卷 id',
    `paper_title`    VARCHAR(255) COMMENT '试卷名称',
    `avg_score`      DECIMAL(16, 2) COMMENT '试卷平均分',
    `avg_during_sec` BIGINT COMMENT '试卷平均时长',
    `user_count`     BIGINT COMMENT '试卷用户数',
    PRIMARY KEY (`dt`, `recent_days`, `paper_id`)
) COMMENT '各试卷平均统计';


# 20)最近 1/7/30 日各试卷成绩分布
DROP TABLE IF EXISTS ads_examination_course_avg_stats;
CREATE TABLE ads_examination_course_avg_stats
(
    `dt`             DATETIME COMMENT '统计日期',
    `recent_days`    BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `course_id`      VARCHAR(255) COMMENT '课程id',
    `course_name`    VARCHAR(255) COMMENT '课程名称',
    `avg_score`      DECIMAL(16, 2) COMMENT '平均分',
    `avg_during_sec` BIGINT COMMENT '平均时长',
    `user_count`     BIGINT COMMENT '用户数',
    PRIMARY KEY (`dt`, `recent_days`, `course_id`)
) COMMENT '各课程考试相关指标';


# 21)最近 1/7/30 日各试卷分数分布统计
DROP TABLE IF EXISTS ads_examination_user_count_by_score_duration;
CREATE TABLE ads_examination_user_count_by_score_duration
(
    `dt`             DATETIME COMMENT '统计日期',
    `recent_days`    BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `paper_id`       VARCHAR(255) COMMENT '试卷 id',
    `score_duration` VARCHAR(255) COMMENT '分数区间',
    `user_count`     BIGINT COMMENT '各试卷各分数区间用户数',
    PRIMARY KEY (`dt`, `recent_days`, `paper_id`, `score_duration`)
) COMMENT '各试卷分数分布统计';


# 22)最近 1/7/30 日各题目正确率
DROP TABLE IF EXISTS ads_examination_question_accuracy;
CREATE TABLE ads_examination_question_accuracy
(
    `dt`          DATETIME COMMENT '统计日期',
    `recent_days` BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `question_id` VARCHAR(255) COMMENT '题目 id',
    `accuracy`    DECIMAL(16, 2) COMMENT '题目正确率',
    PRIMARY KEY (`dt`, `recent_days`, `question_id`)
) COMMENT '各题目正确率';


# 23)单章视频播放情况统计
DROP TABLE IF EXISTS ads_learn_play_stats_by_chapter;
CREATE TABLE ads_learn_play_stats_by_chapter
(
    `dt`           DATETIME COMMENT '统计日期',
    `recent_days`  BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `chapter_id`   VARCHAR(30) COMMENT '章节 id',
    `chapter_name` VARCHAR(200) COMMENT '章节名称',
    `video_id`     VARCHAR(255) COMMENT '视频 id',
    `video_name`   VARCHAR(255) COMMENT '视频名称',
    `play_count`   BIGINT COMMENT '各章节视频播放次数',
    `avg_play_sec` BIGINT COMMENT '各章节视频人均观看时长',
    `user_count`   BIGINT COMMENT '各章节观看人数',
    PRIMARY KEY (`dt`, `recent_days`, `chapter_id`, `video_id`)
) COMMENT '单章视频播放情况统计';


# 24)各课程播放情况统计
DROP TABLE IF EXISTS ads_learn_play_stats_by_course;
CREATE TABLE ads_learn_play_stats_by_course
(
    `dt`           DATETIME COMMENT '统计日期',
    `recent_days`  BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `course_id`    VARCHAR(255) COMMENT '课程id',
    `course_name`  VARCHAR(255) COMMENT '课程名称',
    `play_count`   BIGINT COMMENT '各课程视频播放次数',
    `avg_play_sec` BIGINT COMMENT '各课程视频人均观看时长',
    `user_count`   BIGINT COMMENT '各课程观看人数',
    PRIMARY KEY (`dt`, `recent_days`, `course_id`)
) COMMENT '各课程播放情况统计';


# 25)各课程完课人数统计
DROP TABLE IF EXISTS ads_complete_complete_user_count_per_course;
CREATE TABLE ads_complete_complete_user_count_per_course
(
    `dt`          DATETIME COMMENT '统计日期',
    `recent_days` BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `course_id`   VARCHAR(255) COMMENT '课程 id',
    `user_count`  BIGINT COMMENT '各课程完课人数',
    PRIMARY KEY (`dt`, `recent_days`, `course_id`)
) COMMENT '各课程完课人数统计';


# 26)完课综合指标
DROP TABLE IF EXISTS ads_complete_complete_stats;
CREATE TABLE ads_complete_complete_stats
(
    `dt`                         DATETIME COMMENT '统计日期',
    `recent_days`                BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `user_complete_count`        BIGINT COMMENT '完课人数',
    `user_course_complete_count` BIGINT COMMENT '完课人次',
    PRIMARY KEY (`dt`, `recent_days`)
) COMMENT '完课综合指标';


# 27)各课程人均完成章节视频数
DROP TABLE IF EXISTS ads_complete_complete_chapter_count_per_course;
CREATE TABLE ads_complete_complete_chapter_count_per_course
(
    `dt`                     DATETIME COMMENT '统计日期',
    `recent_days`            BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
    `course_id`              VARCHAR(255) COMMENT '课程 id',
    `complete_chapter_count` BIGINT COMMENT '各课程用户平均完成章节数',
    PRIMARY KEY (`dt`, `recent_days`, `course_id`)
) COMMENT '各课程人均完成章节视频数';

02. Modifique o pacote jar do datax

DadosX

  1. GitHub - alibaba/DataX: DataX é a versão de código aberto da integração de dados Alibaba Cloud DataWorks.
  2. https://github.com/alibaba/DataX/blob/master/mysqlwriter/doc/mysqlwriter.md
  3. https://github.com/alibaba/DataX/blob/master/hdfsreader/doc/hdfsreader.md
[atguigu@node001 ~]$ cd /opt/module/datax/
[atguigu@node001 datax]$ python bin/datax.py -p"-Dexportdir=/warehouse/edu/ads/ads_traffic_stats_by_source/" job/ads_traffic_stats_by_source.json

2023-09-05 10:59:01.854 [job-0] ERRO RetryUtil - Exceção ao chamar callable, a primeira tentativa será tentada. Esta nova tentativa está planejada para esperar [1000]ms, e a espera real é [1001]ms , Mensagem de exceção:[Código:[DBUtilErrorCode-10], Descrição:[Falha ao conectar ao banco de dados. Verifique sua conta, senha, nome do banco de dados, IP, Porta ou peça ajuda ao DBA (preste atenção ao ambiente de rede) .]. - Informações de erro específicas para: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Não foi possível criar conexão com o servidor de banco de dados.]
2023-09-05 10:59:03.860 [job-0] ERRO RetryUtil - Exceção quando chamando callable, prestes a tentar executar as duas primeiras tentativas. Essa nova tentativa foi planejada para aguardar [2.000] ms, e a espera real foi de [2.000] ms. Mensagem de exceção: [Código: [DBUtilErrorCode-10], Descrição: [ Falha ao conectar ao banco de dados. Verifique sua conta, senha, nome do banco de dados, IP, porta ou peça ajuda ao DBA (preste atenção ao ambiente de rede).]. - A mensagem de erro específica é: com.mysql.jdbc.exceptions .jdbc4.MySQLNonTransientConnectionException: Não foi possível criar conexão com o servidor de banco de dados.]
2023-09-05 10:59:07.865 [job-0] ERRO RetryUtil - Exceção ao chamar callable, a terceira tentativa será tentada. Esta nova tentativa está planejada para esperar [4000]ms, e a espera real é [4000]ms , Mensagem de exceção:[Código:[DBUtilErrorCode-10], Descrição:[Falha ao conectar ao banco de dados. Verifique sua conta, senha, nome do banco de dados, IP, Porta ou peça ajuda ao DBA (preste atenção ao ambiente de rede) .]. - Informações de erro específicas para: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Não foi possível criar conexão com o servidor de banco de dados.]

Solução: Verificado N vezes, não há problema com a conta e senha, coloque /opt/module/datax/plugin/ writer /mysqlwriter/libs e /opt/module/datax/plugin/ reader /mysqlreader/libs nas duas lib diretórios O pacote mysql-connector-java-5.1.34.jar foi substituído por mysql-connector-java-8.0.29.jar.

03. arquivo ads_traffic_stats_by_source.json

Após análise inteligente do DataX, a causa mais provável do erro nesta tarefa é:
com.alibaba.datax.common.exception.DataXException: Código:[DBUtilErrorCode-01], Descrição:[Falha ao obter informações relacionadas ao campo da tabela.] . - Obter a tabela: falha ao adicionar meta informações ao campo de ads_traffic_stats_by_source. Entre em contato com o DBA para verificar as informações da biblioteca e da tabela. - java.sql.SQLSyntaxErrorException: coluna desconhecida 'canal' na 'lista de campos' em
        com.mysql .cj.jdbc.exceptions.SQLError.createSQLException (SQLError.java:120)
        em com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
        em com.mysql.cj.jdbc.StatementImpl.executeQuery (StatementImpl.java:1201)
        em com.alibaba.datax.plugin.rdbms.util.DBUtil.getColumnMetaData(DBUtil.java:563)
        em com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:125)
        em com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:140)
        em com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.doPretreatment(OriginalConfPretreatmentUtil.java:35)
        em com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Job.init(CommonRdbmsWriter.java:41)
        em com.alibaba.datax.plugin.writer.mysqlwriter.MysqlWriter$Job.init(MysqlWriter.java:31)
        em com.alibaba.datax.core.job.JobContainer.initJobWriter(JobContainer.java:704)
        em com.alibaba.datax.core.job.JobContainer.init(JobContainer.java:304)
        em com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113)
        em com.alibaba.datax.core .Engine.start(Engine.java:92)
        em com.alibaba.datax.core.Engine.entry(Engine.java:171)
        em com.alibaba.datax.core.Engine.main(Engine.java:204)

        em com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:33)
        em com.alibaba.datax.plugin.rdbms.util.DBUtil.getColumnMetaData(DBUtil.java:575)
        em com.alibaba.datax .plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:125)
        em com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:140)
        em com.alibaba.datax .plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.doPretreatment(OriginalConfPretreatmentUtil.java:35)
        em com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Job.init(CommonRdbmsWriter.java:41)
        em com.alibaba.datax.plugin.writer.mysqlwriter.MysqlWriter$Job.init(MysqlWriter.java:31)
        em com.alibaba.datax.core.job.JobContainer.initJobWriter(JobContainer.java:704)
        em com.alibaba .datax.core.job.JobContainer.init(JobContainer.java:304)
        em com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113)
        em com.alibaba.datax.core.Engine.start (Engine.java:92)
        em com.alibaba.datax.core.Engine.entry(Engine.java:171)
        em com.alibaba.datax.core.Engine.main(Engine.java:204)

/opt/module/datax/job/ads_traffic_stats_by_source.json

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "hdfsreader",
                    "parameter": {
                        "column": [
                            "*"
                        ],
                        "defaultFS": "hdfs://node001:8020",
                        "encoding": "UTF-8",
                        "fieldDelimiter": "\t",
                        "fileType": "text",
                        "nullFormat": "\\N",
                        "path": "${exportdir}"
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "column": [
                            "dt",
                            "recent_days",
                            "source_id",
                            "source_site",
                            "uv_count",
                            "avg_duration_sec",
                            "avg_page_count",
                            "sv_count",
                            "bounce_rate"
                        ],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://node001:3306/edu_report?useUnicode=true&characterEncoding=utf-8",
                                "table": [
                                    "ads_traffic_stats_by_source"
                                ]
                            }
                        ],
                        "username": "root",
                        "password": "123456",
                        "writeMode": "replace"
                    }
                }
            }
        ],
        "setting": {
            "errorLimit": {
                "percentage": 0.02,
                "record": 0
            },
            "speed": {
                "channel": 3
            }
        }
    }
}

P113

12.2.2 Script de geração de arquivo de configuração DataX

P114

Capítulo 13 Agendamento do fluxo de trabalho do data warehouse

Apache DolphinScheduler é uma plataforma de agendamento de tarefas de fluxo de trabalho DAG visual distribuída e facilmente escalonável. Comprometido em resolver as intrincadas dependências no processo de processamento de dados, para que o sistema de agendamento possa ser usado imediatamente no processo de processamento de dados.

P115

Capítulo 2 Instruções de implantação do DolphinScheduler

Capítulo 3 Implantação do modo cluster DolphinScheduler

3.6 Implantação do DolphinScheduler com um clique

[atguigu@node001 apache-dolphinscheduler-2.0.3-bin]$ jpsall
================ node001 ================
5360 QuorumPeerMain
2832 NameNode
9296 WorkerServer
3411 JobHistoryServer
5988 RunJar
9668 ApiApplicationServer
6100 RunJar
9414 LoggerServer
3000 DataNode
9545 AlertServer
10540 Jps
7020 NodeManager
================ node002 ================
5296 NodeManager
5984 WorkerServer
6032 LoggerServer
6231 Jps
4745 QuorumPeerMain
5178 ResourceManager
4986 DataNode
================ node003 ================
3985 NodeManager
4658 LoggerServer
4884 Jps
1861 DataNode
3594 QuorumPeerMain
1967 SecondaryNameNode
[atguigu@node001 apache-dolphinscheduler-2.0.3-bin]$ 

P116

3.7 Comandos de início e parada do DolphinScheduler

[atguigu@node001 apache-dolphinscheduler-2.0.3-bin]$ cd /opt/module/dolphinScheduler/ds-2.0.3/
[atguigu@node001 ds-2.0.3]$ ll
总用量 60
drwxrwxr-x 2 atguigu atguigu  4096 9月   6 11:21 bin
drwxrwxr-x 5 atguigu atguigu  4096 9月   6 11:21 conf
-rwxrwxr-x 1 atguigu atguigu  5190 9月   6 11:22 install.sh
drwxrwxr-x 2 atguigu atguigu 20480 9月   6 11:22 lib
drwxrwxr-x 2 atguigu atguigu  4096 9月   6 11:23 logs
drwxrwxr-x 2 atguigu atguigu  4096 9月   6 11:22 pid
drwxrwxr-x 2 atguigu atguigu  4096 9月   6 11:22 script
drwxrwxr-x 3 atguigu atguigu  4096 9月   6 11:22 sql
drwxrwxr-x 8 atguigu atguigu  4096 9月   6 11:22 ui
[atguigu@node001 ds-2.0.3]$ cd bin/
[atguigu@node001 bin]$ ll
总用量 20
-rwxrwxr-x 1 atguigu atguigu 6770 9月   6 11:21 dolphinscheduler-daemon.sh
-rwxrwxr-x 1 atguigu atguigu 2427 9月   6 11:21 start-all.sh
-rwxrwxr-x 1 atguigu atguigu 3332 9月   6 11:21 status-all.sh
-rwxrwxr-x 1 atguigu atguigu 2428 9月   6 11:21 stop-all.sh
[atguigu@node001 bin]$ 

Node003 não está rodando WorkerServer e tem recursos insuficientes, pode ser executado alterando os recursos para 8g, mas não é necessário.

P117

Inicie o hadoop, zookeeper, hive, hive-service2, ds.

  1. [atguigu@node001 ~]$ myhadoop.sh iniciar
  2. [atguigu@node001 ~]$ zookeeper.sh iniciar
  3. [atguigu@node001 ~]$ nohup /opt/module/hive/hive-3.1.2/bin/hive &
  4. [atguigu@node001 ~]$ nohup /opt/module/hive/hive-3.1.2/bin/hive --service hiveserver2 &
  5. [atguigu@node001 ~]$ /opt/module/dolphinScheduler/ds-2.0.3/bin/start-all.sh
[atguigu@node001 ~]$ myhadoop.sh start
 ================ 启动 hadoop集群 ================
 ---------------- 启动 hdfs ----------------
Starting namenodes on [node001]
Starting datanodes
Starting secondary namenodes [node003]
 --------------- 启动 yarn ---------------
Starting resourcemanager
Starting nodemanagers
 --------------- 启动 historyserver ---------------
[atguigu@node001 ~]$ zookeeper.sh start
---------- zookeeper node001 启动 ----------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
---------- zookeeper node002 启动 ----------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
---------- zookeeper node003 启动 ----------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[atguigu@node001 ~]$ nohup /opt/module/hive/hive-3.1.2/bin/hive &
[1] 3741
[atguigu@node001 ~]$ nohup: 忽略输入并把输出追加到"nohup.out"

[atguigu@node001 ~]$ nohup /opt/module/hive/hive-3.1.2/bin/hive --service hiveserver2 &
[2] 3912
[atguigu@node001 ~]$ nohup: 忽略输入并把输出追加到"nohup.out"

[atguigu@node001 ~]$ /opt/module/dolphinScheduler/ds-2.0.3/bin/start-all.sh
node001:default
...

Por que o DolphinScheduler não pode ser encontrado na instância do fluxo de trabalho após a execução do fluxo de trabalho? Basta ajustar a memória operacional do node001 de 4G para 8G.

P118

Capítulo 5 DolphinScheduler Avançado

5.1 Parâmetros de fluxo de trabalho

DolphinScheduler oferece suporte à transferência flexível de parâmetros para nós de tarefas, e os nós de tarefas podem referenciar valores de parâmetros por meio de ${parameter name} .

Pode-se observar que a prioridade é de alta para baixa: parâmetros locais > parâmetros globais > parâmetros passados ​​pela tarefa upstream.

5.1.5 Prioridade dos parâmetros

3) Conclusão

(1) Parâmetros locais > Parâmetros globais > Parâmetros passados ​​por tarefas upstream;

(2) Quando vários nós upstream passam parâmetros com o mesmo nome, os nós downstream darão prioridade aos parâmetros com valores não vazios;

(3) Se houver vários parâmetros com valores não vazios, classifique-os de acordo com o tempo de conclusão das tarefas upstream e selecione o parâmetro correspondente à tarefa upstream com o tempo de conclusão mais próximo.

P119

5.2 Recursos dependentes de referência

P120

13.2 Preparação de dados

Inicie hadoop, zookeeper, kafka, maxwell, f1, f2, f3.

P121

13.3 Prática de agendamento de fluxo de trabalho

[2023-09-06 17:15:26,824] ERRO [Broker id=0] Recebeu LeaderAndIsrRequest com ID de correlação 1 do controlador 1 época 33 para partição __consumer_offsets-44 (última atualização do controlador época 33) mas não pode se tornar seguidor desde o novo líder -1 não está disponível. (state.change.logger)
[2023-09-06 17:15:26,824] ERRO [Broker id = 0] Recebeu LeaderAndIsrRequest com ID de correlação 1 do controlador 1 época 33 para partição __consumer_offsets-32 (última atualização do controlador época 33), mas não pode se tornar seguidor porque o novo líder -1 não está disponível. (estado.change.logger)
[2023-09-06 17:15:26,824] ERRO [Broker id=0] Recebeu LeaderAndIsrRequest com ID de correlação 1 do controlador 1 época 33 para partição __consumer_offsets-41 (última atualização do controlador época 33) mas não pode se tornar seguidor desde o novo líder -1 não está disponível. (estado.change.logger)

[2023-09-06 19:32:27,802] ERRO [ID do controlador = 0 época = 34] O controlador 0 época 34 falhou ao alterar o estado da partição __transaction_state-27 de OfflinePartition para OnlinePartition (state.change.logger) kafka.common
. StateChangeFailedException: Falha ao eleger o líder para a partição __transaction_state-27 na estratégia OfflinePartitionLeaderElectionStrategy (false)
    em kafka.controller.ZkPartitionStateMachine.$anonfun$doElectLeaderForPartitions$7(PartitionStateMachine.scala:424)
    em scala.collection.mutable.ResizableArray.foreach(ResizableAr ray.scala :62)
    em scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)
    em scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)
    em kafka.controller.ZkPartitionStateMachine.doElectLeaderForPartitions(PartitionStateMachine.scala:421)
    em kafka.controller.ZkPartitionStateMachine.electLeaderForPartitions(PartitionStateMachine.scala:332)
    em kafka.controller.ZkPartitionStateMachine.doHandleStateChanges(Parti tionStateMachine.scala:238)
    em kafka.controller. ZkPartitionStateMachine.handleStateChanges(PartitionStateMachine.scala:158)
    em kafka.controller.PartitionStateMachine.triggerOnlineStateChangeForPartitions(PartitionStateMachine.scala:74)
    em kafka.controller.PartitionStateMachine.triggerOnlinePartitionStateChange(PartitionStateMachine.scala :59)
    em kafka.controller.KafkaController.onBrokerStartup (KafkaController .scala:536)
    em kafka.controller.KafkaController.processBrokerChange(KafkaController.scala:1594)
    em kafka.controller.KafkaController.process(KafkaController.scala:2484)
    em kafka.controller.QueuedEvent.process(ControllerEventManager.scala:52)
    em kafka.controller. ControllerEventManager$ControllerEventThread.process$1(ControllerEventManager.scala:130)
    em kafka.controller.ControllerEventManager$ControllerEventThread.$anonfun$doWork$1(ControllerEventManager.scala:133)
    em scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0 $mcV$sp.java:23)
    em kafka.metrics.KafkaTimer.time(KafkaTimer.scala:31)
    em kafka.controller.ControllerEventManager$ControllerEventThread.doWork(ControllerEventManager.scala:133)
    em kafka.utils.ShutdownableThread.run (ShutdownableThread.scala:96)
[2023-09-06 19:32:27,805] INFO [ID do controlador = 0 época = 34] Partição alterada __consumer_offsets-22 de OfflinePartition para OnlinePartition com estado LeaderAndIsr ( líder=1, líderEpoch=37, isr=List(1), zkVersion=37) (state.change.logger)

maxwell 报错: java.lang.RuntimeException: erro: conjunto de caracteres não tratado 'utf8mb3'

  1. erro maxwell: java.lang.RuntimeException: erro: conjunto de caracteres não tratado 'utf8mb3'_Your 482 Blog-CSDN Blog
  2. Instalação e uso do Maxwell - Nuggets

Este problema ocorre porque o MySQL usa a codificação utf8mb4 para implementar UTF-8 completo a partir de 5.5.3, onde mb4 representa a maioria dos bytes 4 e ocupa até 4 bytes. O utf8 original foi substituído pelo utf8mb3. Uma solução é fazer o downgrade do MySQL e reinstalar uma versão inferior a 5.5.3. Outro método é modificar o código-fonte do maxwell. Descompacte e abra, encontre a classe problemática: com.zendesk.maxwell.schema.columndef.StringColumnDef, adicione uma instrução que possa reconhecer utf8mb3 e empacote-a novamente. Substitua maxwell/lib/maxwell-1.19.0.jar pelo pacote maxwell-1.19.0.jar e reinicie.

Inicie hadoop, zookeeper, kafka, maxwell, f1.sh, f2.sh, f3.sh.

Feche os componentes relacionados à coleção: kafka, flume (f1, f2, f3), maxwell; start hadoop, hive, zookeeper, dolphinscheduler...

Esqueci de iniciar o zookeeper...

Erro ao iniciar ApplicationContext. Para exibir o relatório de condições, execute novamente seu aplicativo com 'debug' habilitado.
[ERRO] 2023-09-07 14:46:32.033 org.springframework.boot.SpringApplication:[843] - Falha na execução do aplicativo
org.springframework.beans.factory.UnsatisfiedDependencyException: Erro ao criar bean com nome 'monitorServiceImpl': Dependência insatisfeita expressa através do campo 'registryClient'; a exceção aninhada é org.springframework.beans.factory.BeanCreationException: Erro ao criar o bean com o nome 'registryClient': falha na invocação do método init; exceção aninhada é org.apache.dolphinscheduler.registry.api.RegistryException: zookeeper connect timeout

...

datax sincroniza dados para hdfs, mysql_to_hdfs_full.sh;

Importe dados para a camada ods, hdfs_to_ods_db.sh,

ods_to_dwd.sh。

exportar HADOOP_HOME=/opt/module/hadoop/hadoop-3.1.3
exportar HADOOP_CONF_DIR=/opt/module/hadoop/hadoop-3.1.3/etc/hadoop
exportar SPARK_HOME=/opt/module/spark/spark-3.0.0- bin-hadoop3.2
exportar JAVA_HOME=/opt/module/jdk/jdk1.8.0_212
exportar HIVE_HOME=/opt/module/hive/hive-3.1.2
exportar DATAX_HOME=/opt/module/datax

exportar PATH=$HADOOP_HOME/bin:$SPARK_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$DATAX_HOME/bin:$PATH

ligação em série

P122【122_Revisão do desenvolvimento de data warehouse educacional on-line 04:23】

Acho que você gosta

Origin blog.csdn.net/weixin_44949135/article/details/132685054
Recomendado
Clasificación