Notas 007 del proyecto Shang Silicon Valley Big Data "Almacén de datos fuera de línea para educación en línea"

Dirección del video: Proyecto Shang Silicon Valley Big Data "Almacén de datos fuera de línea para educación en línea"_bilibili_bilibili

Tabla de contenido

Capítulo 12 Exportación de datos de informes

P112

01. Crea una tabla de datos.

02. Modificar el paquete jar de datax

03. Archivo ads_traffic_stats_by_source.json

P113

P114

P115

P116

P117

P118

P119

P120

P121

P122【122_Revisión del desarrollo del almacén de datos educativos en línea 04:23】


Capítulo 12 Exportación de datos de informes

P112

01. Crea una tabla de datos.

# 第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. Modificar el paquete jar de datax

DatosX

  1. GitHub - alibaba/DataX: DataX es la versión de código abierto de la integración de datos de 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 [trabajo-0] ERROR RetryUtil: excepción al llamar a lo invocable, se intentará el primer reintento. Está previsto que este reintento espere [1000] ms, y la espera real es [1001] ms , Mensaje de excepción:[Código:[DBUtilErrorCode-10], Descripción:[Error al conectarse a la base de datos. Verifique su cuenta, contraseña, nombre de la base de datos, IP, puerto o solicite ayuda al DBA (preste atención al entorno de red) .]. - Información de error específica para: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No se pudo crear la conexión al servidor de la base de datos.]
2023-09-05 10:59:03.860 [job-0] ERROR RetryUtil - Excepción cuando llamando a invocable, está a punto de intentar ejecutar los primeros 2 reintentos. Se planificó que este reintento esperara [2000] ms, y la espera real fue [2000] ms. Mensaje de excepción: [Código: [DBUtilErrorCode-10], Descripción: (Error al conectarse a la base de datos. Verifique su cuenta, contraseña, nombre de la base de datos, IP, puerto o solicite ayuda al DBA (preste atención al entorno de red).] - El mensaje de error específico es: com.mysql.jdbc. excepciones.jdbc4.MySQLNonTransientConnectionException: no se pudo crear la conexión al servidor de la base de datos.]
2023-09-05 10:59:07.865 [trabajo-0] ERROR RetryUtil: excepción al llamar a lo invocable, se intentará el tercer reintento. Está previsto que este reintento espere [4000] ms, y la espera real es [4000] ms , Mensaje de excepción:[Código:[DBUtilErrorCode-10], Descripción:[Error al conectarse a la base de datos. Verifique su cuenta, contraseña, nombre de la base de datos, IP, puerto o solicite ayuda al DBA (preste atención al entorno de red) .]. - Información de error específica Para: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No se pudo crear la conexión al servidor de la base de datos.]

Solución: Comprobado N veces, no hay problema con la cuenta y la contraseña, coloque /opt/module/datax/plugin/ writer /mysqlwriter/libs y /opt/module/datax/plugin/ lector /mysqlreader/libs en las dos bibliotecas directorios El paquete mysql-connector-java-5.1.34.jar se reemplaza por mysql-connector-java-8.0.29.jar.

03. Archivo ads_traffic_stats_by_source.json

Después del análisis inteligente realizado por DataX, la causa más probable del error en esta tarea es:
com.alibaba.datax.common.exception.DataXException: Código:[DBUtilErrorCode-01], Descripción:[Error al obtener información relacionada con el campo de la tabla.] . - Obtener la tabla: error al agregar metainformación al campo de ads_traffic_stats_by_source. Comuníquese con el DBA para verificar la biblioteca y la información de la tabla. - java.sql.SQLSyntaxErrorException: columna desconocida 'canal' en la 'lista de campos' en
        com.mysql .cj.jdbc.exceptions.SQLError.createSQLException (SQLError.java:120)
        en com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
        en com.mysql.cj.jdbc.StatementImpl.executeQuery (StatementImpl.java:1201)
        en com.alibaba.datax.plugin.rdbms.util.DBUtil.getColumnMetaData(DBUtil.java:563)
        en com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:125)
        en com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:140)
        en com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.doPretreatment(OriginalConfPretreatmentUtil.java:35)
        en com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Job.init(CommonRdbmsWriter.java:41)
        en com.alibaba.datax.plugin.writer.mysqlwriter.MysqlWriter$Job.init(MysqlWriter.java:31)
        en com.alibaba.datax.core.job.JobContainer.initJobWriter(JobContainer.java:704)
        en com.alibaba.datax.core.job.JobContainer.init(JobContainer.java:304)
        en com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113)
        en com.alibaba.datax.core .Engine.start(Engine.java:92)
        en com.alibaba.datax.core.Engine.entry(Engine.java:171)
        en com.alibaba.datax.core.Engine.main(Engine.java:204)

        en com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:33)
        en com.alibaba.datax.plugin.rdbms.util.DBUtil.getColumnMetaData(DBUtil.java:575)
        en com.alibaba.datax .plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:125)
        en com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:140)
        en com.alibaba.datax .plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.doPretreatment(OriginalConfPretreatmentUtil.java:35)
        en com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Job.init(CommonRdbmsWriter.java:41)
        en com.alibaba.datax.plugin.writer.mysqlwriter.MysqlWriter$Job.init(MysqlWriter.java:31)
        en com.alibaba.datax.core.job.JobContainer.initJobWriter(JobContainer.java:704)
        en com.alibaba .datax.core.job.JobContainer.init(JobContainer.java:304)
        en com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113)
        en com.alibaba.datax.core.Engine.start (Engine.java:92)
        en com.alibaba.datax.core.Engine.entry(Engine.java:171)
        en 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 generación del archivo de configuración de DataX

P114

Capítulo 13 Programación del flujo de trabajo del almacén de datos

Apache DolphinScheduler es una plataforma de programación de tareas de flujo de trabajo DAG visual distribuida y fácilmente escalable. Comprometido a resolver las intrincadas dependencias en el proceso de procesamiento de datos, de modo que el sistema de programación pueda usarse de inmediato en el proceso de procesamiento de datos.

P115

Capítulo 2 Instrucciones de implementación de DolphinScheduler

Capítulo 3 Implementación del modo de clúster DolphinScheduler

3.6 Implementación con un clic de DolphinScheduler

[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 inicio y parada de 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 no ejecuta WorkerServer y no tiene recursos suficientes, se puede ejecutar cambiando los recursos a 8g, pero no es necesario.

P117

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

  1. [atguigu@node001 ~]$ myhadoop.sh inicio
  2. [atguigu@node001 ~]$ zookeeper.sh inicio
  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 qué no se puede encontrar DolphinScheduler en la instancia del flujo de trabajo después de ejecutar el flujo de trabajo? Simplemente ajuste la memoria de ejecución de node001 de 4G a 8G.

P118

Capítulo 5 DolphinScheduler Avanzado

5.1 Parámetros del flujo de trabajo

DolphinScheduler admite la transferencia flexible de parámetros a los nodos de tareas, y los nodos de tareas pueden hacer referencia a los valores de los parámetros a través de ${parameter name} .

Se puede ver que la prioridad es de mayor a menor: parámetros locales> parámetros globales> parámetros pasados ​​por la tarea ascendente.

5.1.5 Prioridad de parámetros

3) Conclusión

(1) Parámetros locales> Parámetros globales> Parámetros pasados ​​por tareas ascendentes;

(2) Cuando varios nodos ascendentes pasan parámetros con el mismo nombre, los nodos descendentes darán prioridad a los parámetros con valores no vacíos;

(3) Si hay varios parámetros con valores no vacíos, ordénelos según el tiempo de finalización de las tareas ascendentes y seleccione el parámetro correspondiente a la tarea ascendente con el tiempo de finalización más temprano.

P119

5.2 Recursos dependientes de referencia

P120

13.2 Preparación de datos

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

P121

13.3 Práctica de programación del flujo de trabajo

[2023-09-06 17:15:26,824] ERROR [ID del corredor = 0] Se recibió LeaderAndIsrRequest con el ID de correlación 1 del controlador 1, época 33 para la partición __consumer_offsets-44 (última actualización del controlador, época 33) pero no puede convertirse en seguidor ya que es el nuevo líder -1 no está disponible. (state.change.logger)
[2023-09-06 17:15:26,824] ERROR [ID del corredor = 0] Se recibió LeaderAndIsrRequest con ID de correlación 1 del controlador 1, época 33 para la partición __consumer_offsets-32 (última actualización del controlador, época 33) pero no puede convertirse en seguidor ya que el nuevo líder -1 no está disponible. (registrador.de.cambios.de.estado)
[2023-09-06 17:15:26,824] ERROR [ID del corredor = 0] Se recibió LeaderAndIsrRequest con ID de correlación 1 del controlador 1, época 33 para la partición __consumer_offsets-41 (última actualización del controlador, época 33) pero no puede convertirse en seguidor ya que es el nuevo líder -1 no está disponible. (registrador.de.cambios.de.estado)

[2023-09-06 19:32:27,802] ERROR [ID del controlador = 0 época = 34] El controlador 0 época 34 no pudo cambiar el estado de la partición __transaction_state-27 de OfflinePartition a OnlinePartition (state.change.logger) kafka.common
. StateChangeFailedException: no se pudo elegir el líder para la partición __transaction_state-27 bajo la estrategia OfflinePartitionLeaderElectionStrategy (false)
    en kafka.controller.ZkPartitionStateMachine.$anonfun$doElectLeaderForPartitions$7(PartitionStateMachine.scala:424)
    en scala.collection.mutable.ResizableArray.foreach(Res izableArray.scala :62)
    en scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)
    en scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)
    en kafka.controller.ZkPartitionStateMachine.doElectLeaderForPartitions(PartitionStateMachine.scala:421)
    en kafka.controller.ZkPartitionStateMachine.electLeaderForPartitions(PartitionStateMachine.scala:332)
    en kafka.controller.ZkPartitionStateMachine.doHandleStateChanges(PartitionStat eMachine.scala:238)
    en kafka.controller. ZkPartitionStateMachine.handleStateChanges(PartitionStateMachine.scala:158)
    en kafka.controller.PartitionStateMachine.triggerOnlineStateChangeForPartitions(PartitionStateMachine.scala:74)
    en kafka.controller.PartitionStateMachine.triggerOnlinePartitionStateChange(PartitionStateMachine.scala:59)
    en kafka.controller.KafkaController.onBrokerStartup(KafkaController .scala:536)
    en kafka.controller.KafkaController.processBrokerChange(KafkaController.scala:1594)
    en kafka.controller.KafkaController.process(KafkaController.scala:2484)
    en kafka.controller.QueuedEvent.process(ControllerEventManager.scala:52)
    en kafka.controller. ControllerEventManager$ControllerEventThread.process$1(ControllerEventManager.scala:130)
    en kafka.controller.ControllerEventManager$ControllerEventThread.$anonfun$doWork$1(ControllerEventManager.scala:133)
    en scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0 $mcV$sp.java:23)
    en kafka.metrics.KafkaTimer.time(KafkaTimer.scala:31)
    en kafka.controller.ControllerEventManager$ControllerEventThread.doWork(ControllerEventManager.scala:133)
    en kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96)
[2023-09-06 19:32:27,805] INFORMACIÓN [ID del controlador = 0 época = 34] Se cambió la partición __consumer_offsets-22 de OfflinePartition a OnlinePartition con el estado LeaderAndIsr ( líder=1, líderEpoch=37, isr=Lista(1), zkVersion=37) (state.change.logger)

Nota de maxwell: java.lang.RuntimeException: error: conjunto de caracteres no controlados 'utf8mb3'

  1. error de maxwell: java.lang.RuntimeException: error: conjunto de caracteres no controlados 'utf8mb3'_Su blog 482-CSDN Blog
  2. Instalación y uso de Maxwell-Nuggets

Este problema se debe a que MySQL usa la codificación utf8mb4 para implementar UTF-8 completo a partir de 5.5.3, donde mb4 representa la mayoría de los bytes 4 y ocupa hasta 4 bytes. El utf8 original fue reemplazado por utf8mb3. Una solución es degradar MySQL y reinstalar una versión inferior a 5.5.3. Otro método consiste en modificar el código fuente de Maxwell. Descomprímalo y ábralo, busque la clase problemática: com.zendesk.maxwell.schema.columndef.StringColumnDef, agregue una declaración que pueda reconocer utf8mb3 y vuelva a empaquetarlo. Reemplace maxwell/lib/maxwell-1.19.0.jar con el maxwell-1.19.0.jar empaquetado y reinicie.

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

Cierre los componentes relacionados con la colección: kafka, flume (f1, f2, f3), maxwell; inicie hadoop, hive, zookeeper, Dolphinscheduler...

Olvidé iniciar zookeeper...

Error al iniciar ApplicationContext. Para mostrar el informe de condiciones, vuelva a ejecutar su aplicación con la 'depuración' habilitada.
[ERROR] 2023-09-07 14:46:32.033 org.springframework.boot.SpringApplication:[843] - Error al ejecutar la aplicación
org.springframework.beans.factory.UnsatisfiedDependencyException: error al crear el bean con el nombre 'monitorServiceImpl': se expresó dependencia insatisfecha a través del campo 'registryClient'; la excepción anidada es org.springframework.beans.factory.BeanCreationException: Error al crear el bean con el nombre 'registryClient': falló la invocación del método init; La excepción anidada es org.apache.dolphinscheduler.registry.api.RegistryException: tiempo de espera de conexión del cuidador del zoológico

...

datax sincroniza datos con hdfs, mysql_to_hdfs_full.sh;

Importe datos a la capa 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

conexión en serie

P122【122_Revisión del desarrollo del almacén de datos educativos en línea 04:23】

Supongo que te gusta

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