电商数仓(数据采集模块)

写在前面:本文是我在学习电商数仓项目的过程中,对相关知识点的记录与总结。

文章目录

  • 电商数仓(数据采集模块)
    • 1. Hadoop 安装
      • 1.1 安装 Hadoop
      • 1.2 Hadoop 集群启动停止脚本
    • 2. Zookeeper 安装
      • 2.1 安装 ZK
      • 2.2 ZK 集群启动停止脚本
    • 3. 日志生成
      • 3.1 日志启动
      • 3.2 集群日志生成启动脚本
      • 3.3 集群时间同步脚本
      • 3.4 集群查看所有进程脚本
    • 4. Flume 采集日志
      • 4.1 安装 Flume
      • 4.2 日志采集 Flume 配置
      • 4.3 日志采集启动停止脚本
    • 5. Kafka 安装配置
      • 5.1 Kafka 集群安装
      • 5.2 Kafka 集群启动停止脚本
      • 5.3 查看 Kafka Topic 列表
      • 5.4 创建 Kafka Topic
      • 5.5 Kafka Manager 安装
      • 5.6 Kafka Manager 启动停止脚本
    • 6. Flume 消费 Kafka 数据
      • 6.1 **流程分析**
      • 6.2 具体配置
      • 6.3 日志消费 Flume 启动停止脚本
    • 7. 采集通道启动停止脚本

1. Hadoop 安装

1.1 安装 Hadoop

  1. 集群规划:

    服务名 hadoop 101 hadoop102 hadoop103
    HDFS NameNode DataNode DataNode SecondaryNameNode DataNode
    Yarn NodeManager ResourceManager NodeManager NodeManager
  2. 安装。

    先 Mark,之后陆续更新。

1.2 Hadoop 集群启动停止脚本

  1. hadoop101/home/zgl/bin/ 目录下创建脚本 hdp.sh

    #!/bin/bashcase $1 in
    "start") {echo "***************** 启动Hadoop集群 *****************"ssh hadoop101 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/start-dfs.sh"ssh hadoop102 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/start-yarn.sh"ssh hadoop101 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/mr-jobhistory-daemon.sh start historyserver"
    };;
    "stop") {echo "***************** 关闭Hadoop集群 *****************"ssh hadoop101 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/mr-jobhistory-daemon.sh stop historyserver"ssh hadoop102 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/stop-yarn.sh"ssh hadoop101 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/stop-dfs.sh"
    };;
    esac
    
  2. 增加脚本执行权限。

    chmod 777 hdp.sh
    
  3. Hadoop 集群启动脚本。

    hdp.sh start
    
  4. Hadoop 集群停止脚本。

    hdp.sh stop
    

2. Zookeeper 安装

2.1 安装 ZK

  1. 集群规划:

    服务名 hadoop101 hadoop102 hadoop103
    Zookeeper
  2. 安装。

    先 Mark,之后陆续更新。

2.2 ZK 集群启动停止脚本

  1. hadoop101/home/zgl/bin/ 目录下创建脚本 zk.sh

    #!/bin/bashcase $1 in
    "start") {for i in hadoop101 hadoop102 hadoop103dossh $i "source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"done
    };;
    "stop") {for i in hadoop101 hadoop102 hadoop103dossh $i "source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"done
    };;
    "status") {for i in hadoop101 hadoop102 hadoop103dossh $i "source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"done
    };;
    esac
    
  2. 增加脚本执行权限。

    chmod 777 zk.sh
    
  3. zookeeper 集群启动脚本。

    zk.sh start
    
  4. zookeeper 集群停止脚本。

    zk.sh stop
    
  5. zookeeper 集群查看状态脚本。

    zk.sh status
    

3. 日志生成

3.1 日志启动

  1. 将用户数据生成的代码 jar 包,拷贝到 hadoop101 上,并同步到 hadoop102 上。

  2. hadoop101 上执行 jar 程序。

    java -classpath log-collector-1.0-SNAPSHOT-jar-with-dependencies.jar  com.guli.appclient.AppMain >/opt/module/test.log
    
  3. /tmp/logs/ 路径下查看生成的数据。

    [zgl@hadoop101 module]$ cd /tmp/logs/
    [zgl@hadoop101 logs]$ ll
    -rw-rw-r--. 1 zgl zgl 712210 5月  15 19:57 app-2020-05-15.log
    

3.2 集群日志生成启动脚本

  1. hadoop101/home/zgl/bin/ 目录下创建脚本 lg.sh

    #!/bin/bashfor i in hadoop101 hadoop102
    do
    # $1 表示控制发送每条数据的延时时间,默认是0
    # $2 表示一共发送多少条数据ssh $i "source /etc/profile;java -classpath /opt/module/log-collector-1.0-SNAPSHOT-jar-with-dependencies.jar  com.guli.appclient.AppMain $1 $2 >/opt/module/test.log &"
    done
    
  2. 修改脚本执行权限。

    chmod 777 lg.sh
    
  3. 启动脚本。

    lg.sh
    
  4. 分别在 hadoop101hadoop102/tmp/logs 目录上查看生成的数据。

3.3 集群时间同步脚本

  1. hadoop101/home/zgl/bin/ 目录下创建脚本 dt.sh

    #!/bin/bashlog_date=$1
    for i in hadoop101 hadoop102 hadoop103
    dossh -t $i "sudo date -s $log_date"
    done
    
  2. 修改脚本执行权限。

    chmod 777 dt.sh
    
  3. 启动脚本。

    dt.sh 2020-5-15
    

3.4 集群查看所有进程脚本

  1. hadoop101/home/zgl/bin/ 目录下创建脚本 xcall

    #!/bin/bashparams=$@
    for((i=101 ;i <104 ;i=$i+1 ));doecho ==========hadoop$i==========ssh hadoop$i "source /etc/profile;$params"
    done
    
  2. 修改脚本执行权限。

    chmod 777 xcall
    
  3. 启动脚本。

    xcall jps
    

4. Flume 采集日志

4.1 安装 Flume

  1. 集群规划:

    服务名 hadoop101 hadoop102 hadoop103
    Flume
  2. 安装。

    先 Mark,之后陆续更新。

4.2 日志采集 Flume 配置

  1. 配置分析

  2. 实现两个自定义拦截器

    2.1 ETL 拦截器: 用于过滤时间戳不合法与 JSON 数据不完整的日志。

    2.1.1 创建 Maven 工程 flume-interceptor

    2.1.2 创建包 com.guli.flume.interceptor

    2.1.3 在 pom.xml 中添加如下依赖:

    <dependencies><dependency><groupId>org.apache.flume</groupId><artifactId>flume-ng-core</artifactId><version>1.7.0</version></dependency>
    </dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
    </build>
    
    • com.guli.flume.interceptor 下创建类 LogETLInterceptor

      package com.guli.flume.interceptor;import org.apache.flume.Context;
      import org.apache.flume.Event;
      import org.apache.flume.interceptor.Interceptor;import java.nio.charset.Charset;
      import java.util.ArrayList;
      import java.util.List;/*** 用于过滤时间戳不合法的数据和不完整的数据*/
      public class LogETLInterceptor implements Interceptor {@Overridepublic void initialize() {}@Overridepublic Event intercept(Event event) {String logStr = new String(event.getBody(), Charset.forName("UTF-8"));if (logStr.contains("start")) {if (LogUtils.validateStart(logStr)) {return event;}} else {if (LogUtils.validateEvent(logStr)) {return event;}}return null;}@Overridepublic List<Event> intercept(List<Event> list) {ArrayList<Event> events = new ArrayList<>();for (Event event : list) {if (intercept(event) != null) {events.add(intercept(event));}}return events;}@Overridepublic void close() {}public static class Builder implements Interceptor.Builder {@Overridepublic Interceptor build() {return new LogETLInterceptor();}@Overridepublic void configure(Context context) {}}
      }
      
    • 创建工具类 LogUtils

      package com.guli.flume.interceptor;import org.apache.commons.lang.math.NumberUtils;public class LogUtils {public static boolean validateStart(String log) {if (log == null) {return false;}if (!log.trim().startsWith("{") || !log.trim().endsWith("}")) {return false;}return true;}public static boolean validateEvent(String log) {if (log.contains("|")) {String[] logFiled = log.split("\\|");if (logFiled.length != 2) {return false;}if (logFiled[0].length() != 13 || !NumberUtils.isDigits(logFiled[0])) {return false;}if (!logFiled[1].trim().startsWith("{") || !logFiled[1].trim().endsWith("}")) {return false;}}return true;}
      }
      
    • 类型区分拦截器: 用于将启动日志和事件日志区分开,以便发往 Kafka 的不同 Topic

      • com.guli.flume.interceptor 下创建类 LogTypeInterceptor
      package com.guli.flume.interceptor;import org.apache.flume.Context;
      import org.apache.flume.Event;
      import org.apache.flume.interceptor.Interceptor;import java.nio.charset.Charset;
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Map;public class LogTypeInterceptor implements Interceptor {@Overridepublic void initialize() {}@Overridepublic Event intercept(Event event) {String logStr = new String(event.getBody(), Charset.forName("UTF-8"));Map<String, String> headers = event.getHeaders();if (logStr.contains("start")) {headers.put("topic", "topic_start");} else {headers.put("topic", "topic_event");}return event;}@Overridepublic List<Event> intercept(List<Event> list) {ArrayList<Event> events = new ArrayList<>();for (Event event : list) {events.add(intercept(event));}return events;}@Overridepublic void close() {}public static class Builder implements Interceptor.Builder {@Overridepublic Interceptor build() {return new LogTypeInterceptor();}@Overridepublic void configure(Context context) {}}
      }
      
    • 打包放入 hadoop101hadoop102flumelib 目录下。

  3. 具体配置

    • /opt/module/flume-1.7.0/conf 目录下创建 file-flume-kafka.conf 文件。

    • 在文件中配置如下内容:

      # 组件定义
      a1.sources = r1
      a1.channels = c1 c2# tailDir Source
      a1.sources.r1.type = TAILDIR
      a1.sources.r1.channels = c1 c2
      a1.sources.r1.positionFile = /opt/module/flume-1.7.0/taildir_position.json
      a1.sources.r1.filegroups = f1
      a1.sources.r1.filegroups.f1 = /tmp/logs/app.+
      a1.sources.r1.fileHeader = true# interceptors
      a1.sources.r1.interceptors = i1 i2
      a1.sources.r1.interceptors.i1.type = com.guli.flume.interceptor.LogETLInterceptor$Builder
      a1.sources.r1.interceptors.i2.type = com.guli.flume.interceptor.LogTypeInterceptor$Builder
      a1.sources.r1.selector.type = multiplexing
      a1.sources.r1.selector.header = topic
      a1.sources.r1.selector.mapping.topic_start = c1
      a1.sources.r1.selector.mapping.topic_event = c2# kafka channels
      a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
      a1.channels.c1.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092
      a1.channels.c1.kafka.topic = topic_start
      a1.channels.c1.parseAsFlumeEvent = false
      a1.channels.c1.kafka.consumer.group.id = zgla1.channels.c2.type = org.apache.flume.channel.kafka.KafkaChannel
      a1.channels.c2.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092
      a1.channels.c2.kafka.topic = topic_event
      a1.channels.c2.parseAsFlumeEvent = false
      a1.channels.c2.kafka.consumer.group.id = zgl
      

4.3 日志采集启动停止脚本

  1. hadoop101/home/zgl/bin/ 下创建脚本 f1.sh

    #!/bin/bashcase $1 in
    "start") {for i in hadoop101 hadoop102doecho " --------启动 $i 采集flume-------"ssh $i "source /etc/profile;nohup /opt/module/flume-1.7.0/bin/flume-ng agent --name a1 --conf-file /opt/module/flume-1.7.0/conf/file-flume-kafka.conf -Dflume.root.logger=INFO,LOGFILE >/dev/null 2>&1 &"done
    };;
    "stop") {for i in hadoop101 hadoop102doecho " --------停止 $i 采集flume-------"ssh $i "source /etc/profile;ps -ef | grep file-flume-kafka | grep -v grep |awk '{print \$2}' | xargs kill"done
    };;
    esac
    
    • nohup,该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup 就是不挂起的意思,不挂断地运行命令。
    • /dev/null 代表 linux 的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。
  2. 增加脚本执行权限。

    chmod 777 f1.sh
    
  3. 日志采集启动。

    f1.sh start
    
  4. 日志采集停止。

    f1.sh stop
    

5. Kafka 安装配置

5.1 Kafka 集群安装

  1. 集群规划。

    服务名 hadoop101 hadoop102 hadoop103
    Kafka
  2. 安装。

    先 Mark ,之后陆续更新。

5.2 Kafka 集群启动停止脚本

  1. hadoop101/home/zgl/bin/ 目录下创建脚本 kk.sh

    #!/bin/bashcase $1 in
    "start") {for i in hadoop101 hadoop102 hadoop103doecho " --------启动 $i Kafka-------"# 用于KafkaManager监控ssh $i "source /etc/profile;export JMX_PORT=9988 && /opt/module/kafka_2.11/bin/kafka-server-start.sh -daemon /opt/module/kafka_2.11/config/server.properties"done
    };;
    "stop") {for i in hadoop101 hadoop102 hadoop103doecho " --------停止 $i Kafka-------"ssh $i "/opt/module/kafka_2.11/bin/kafka-server-stop.sh stop"done
    };;
    esac
    
    • 启动 Kafka 时要先开启 JMX 端口,是用于后续 KafkaManager 监控。
  2. 增加脚本执行权限。

    chmod 777 kk.sh
    
  3. Kafka 集群启动。

    kk.sh start
    
  4. Kafka 集群停止。

    kk.sh stop
    

5.3 查看 Kafka Topic 列表

[zgl@hadoop101 kafka_2.11]$ bin/kafka-topics.sh --zookeeper hadoop101:2181 --list

5.4 创建 Kafka Topic

[zgl@hadoop101 kafka_2.11]$ bin/kafka-topics.sh --zookeeper hadoop101:2181 --create --topic topic_start --replication-factor 1 --partitions 1[zgl@hadoop101 kafka_2.11]$ bin/kafka-topics.sh --zookeeper hadoop101:2181 --create --topic topic_event --replication-factor 1 --partitions 1[zgl@hadoop101 kafka_2.11]$ bin/kafka-topics.sh --zookeeper hadoop101:2181 --list
topic_event
topic_start

5.5 Kafka Manager 安装

  1. Kafka Manageryahoo 的一个 Kafka 监控管理项目。

  2. 安装。

    先 Mark,之后陆续更新。

  3. 启动 Kafka Manager

    [zgl@hadoop101 kafka-manager-1.3.3.22]$ bin/kafka-manager -Dhttp.port=7456 >/opt/module/kafka-manager-1.3.3.22/start.log 2>&1 &
    
  4. 启动后用浏览器打开 : http://hadoop101:7456 。

  • 选择添加 Cluster

  • 确定之后,就可以查看整个 Kafka 集群的状态。

5.6 Kafka Manager 启动停止脚本

  1. hadoop101/home/zgl/bin/ 目录下创建脚本 km.sh

    #!/bin/bashcase $1 in
    "start") {echo " -------- 启动 KafkaManager -------"source /etc/profilenohup /opt/module/kafka-manager-1.3.3.22/bin/kafka-manager -Dhttp.port=7456 >start.log 2>&1 &
    };;
    "stop"){echo " -------- 停止 KafkaManager -------"source /etc/profile ps -ef | grep ProdServerStart | grep -v grep |awk '{print $2}' | xargs kill
    };;
    esac
    
  2. 增加脚本执行权限。

    chmod 777 km.sh
    
  3. km 集群启动

    km.sh start
    
  4. km 集群停止

    km.sh stop
    

6. Flume 消费 Kafka 数据

6.1 流程分析

6.2 具体配置

  1. hadoop103opt/module/flume-1.7.0/conf 目录下创建 kafka-flume-hdfs.conf 文件。

    a1.sources = r1 r2
    a1.sinks = k1 k2
    a1.channels = c1 c2# kafka Source
    a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
    a1.sources.r1.channels = c1
    a1.sources.r1.batchSize = 5000
    a1.sources.r1.batchDurationMillis = 2000
    a1.sources.r1.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092
    a1.sources.r1.kafka.topics = topic_starta1.sources.r2.type = org.apache.flume.source.kafka.KafkaSource
    a1.sources.r2.channels = c2
    a1.sources.r2.batchSize = 5000
    a1.sources.r2.batchDurationMillis = 2000
    a1.sources.r2.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092
    a1.sources.r2.kafka.topics = topic_event# File channels
    a1.channels.c1.type = file
    a1.channels.c1.checkpointDir = /opt/module/flume-1.7.0/checkpoint/behavior1
    a1.channels.c1.dataDirs = /opt/module/flume-1.7.0/data/behavior1/
    a1.channels.c1.maxFileSize = 2146435071
    a1.channels.c1.capacity = 1000000
    a1.channels.c1.keep-alive = 6a1.channels.c2.type = file
    a1.channels.c2.checkpointDir = /opt/module/flume-1.7.0/checkpoint/behavior2
    a1.channels.c2.dataDirs = /opt/module/flume-1.7.0/data/behavior2/
    a1.channels.c2.maxFileSize = 2146435071
    a1.channels.c2.capacity = 1000000
    a1.channels.c2.keep-alive = 6# HDFS sinks
    a1.sinks.k1.type = hdfs
    a1.sinks.k1.channel = c1
    a1.sinks.k1.hdfs.path = /orgin_data/gmall/log/topic_start/%Y-%m-%d
    a1.sinks.k1.hdfs.filePrefix = logstart-
    a1.sinks.k1.hdfs.round = true
    a1.sinks.k1.hdfs.roundValue = 10
    a1.sinks.k1.hdfs.roundUnit = seconda1.sinks.k2.type = hdfs
    a1.sinks.k2.channel = c2
    a1.sinks.k2.hdfs.path = /orgin_data/gmall/log/topic_event/%Y-%m-%d
    a1.sinks.k2.hdfs.filePrefix = logevent-
    a1.sinks.k2.hdfs.round = true
    a1.sinks.k2.hdfs.roundValue = 10
    a1.sinks.k2.hdfs.roundUnit = second## 不要产生大量小文件
    a1.sinks.k1.hdfs.rollInterval = 10
    a1.sinks.k1.hdfs.rollSize = 134217728
    a1.sinks.k1.hdfs.rollCount = 0a1.sinks.k2.hdfs.rollInterval = 10
    a1.sinks.k2.hdfs.rollSize = 134217728
    a1.sinks.k2.hdfs.rollCount = 0## 控制输出文件是原生文件。
    a1.sinks.k1.hdfs.fileType = CompressedStream
    a1.sinks.k2.hdfs.fileType = CompressedStream a1.sinks.k1.hdfs.codeC = lzop
    a1.sinks.k2.hdfs.codeC = lzop
    

6.3 日志消费 Flume 启动停止脚本

  1. hadoop103/home/zgl/bin/ 目录下创建脚本 f2.sh

    #!/bin/bashcase $1 in
    "start") {for i in hadoop103do echo " --------启动 $i 消费flume-------"ssh $i "source /etc/profile;nohup /opt/module/flume-1.7.0/bin/flume-ng agent --conf-file /opt/module/flume-1.7.0/conf/kafka-flume-hdfs.conf --name a1 -Dflume.root.logger=INFO,LOGFILE >/opt/module/flume-1.7.0/log.txt 2>&1 &"done
    };;
    "stop") {for i in hadoop103do echo " --------停止 $i 消费flume-------"ssh $i "source /etc/profile;ps -ef | grep kafka-flume-hdfs | grep -v grep |awk '{print \$2}' | xargs kill"done
    };;
    esac
    
  2. 增加脚本执行权限。

    chmod 777 f2.sh
    
  3. 启动。

    f2.sh start
    
  4. 停止。

    f2.sh stop
    

7. 采集通道启动停止脚本

  1. hadoop101/home/zgl/bin/ 目录下创建脚本 cluster.sh

    #!/bin/bashcase $1 in
    "start") {echo " -------- 启动集群 -------"hdp.sh startzk.sh startsleep 4s;f1.sh startkk.sh startsleep 6s;f2.sh startkm.sh start
    };;
    "stop") {echo " -------- 停止集群 -------"km.sh stopf2.sh stopkk.sh stopsleep 6s;f1.sh stopzk.sh stophdp.sh stop
    };;
    esac
    
  2. 增加脚本执行权限。

    chmod 777 cluster.sh
    
  3. 启动脚本

    cluster.sh start
    
  4. 停止脚本

    cluster.sh stop
    

02 电商数仓(数据采集模块)相关推荐

  1. 电商数仓笔记2_用户行为采集(数据采集模块)

    电商数仓 一.数据采集模块 1.集群所有进程查看脚本 2.Hadoop安装 (1)项目经验之HDFS存储多目录 (2)集群数据均衡 (3)项目经验之支持LZO压缩配置 (4)项目经验之LZO创建索引 ...

  2. 大数据实战项目之电商数仓(一)

    大数据实战项目之电商数仓(一) 项目介绍 数据仓库概念 ​ 数据仓库是为企业所有决策制定过程,提供所有系统数据支持的战略集合.通过对数据仓库中数据的分析,可以帮助企业改进业务流程,控制成本,提高产品质 ...

  3. 电商数仓描述_大数据企业级电商数据仓库架构设计和实现(技术点与企业接轨)...

    课程咨询和资料获取请加老师QQ  1011800132 该项目以国内电商巨头实际业务应用场景为依托,紧跟大数据主流需求,对电商数仓的常见实战指标以及难点实战指标进行了详尽讲解,让你迅速成长,获取最前沿 ...

  4. 尚硅谷大数据项目之电商数仓(4即席查询数据仓库)

    尚硅谷大数据项目之电商数仓(即席查询) (作者:尚硅谷大数据研发部) 版本:V4.0 第1章 Presto 1.1 Presto简介 1.1.1 Presto概念 1.1.2 Presto架构 1.1 ...

  5. 大数据项目之电商数仓、业务数据介绍、电商系统表结构

    文章目录 6. 业务数据介绍 6.1 电商系统表结构 6.1.1 活动信息表(activity_info) 6.1.2 活动规则表(activity_rule) 6.1.3 活动商品关联表(activ ...

  6. 2 大数据电商数仓项目——项目需求及架构设计

    2 大数据电商数仓项目--项目需求及架构设计 2.1 项目需求分析 用户行为数据采集平台搭建. 业务数据采集平台搭建. 数据仓库维度建模(核心):主要设计ODS.DWD.DWS.AWT.ADS等各个层 ...

  7. 电商数仓描述_笔记-尚硅谷大数据项目数据仓库-电商数仓V1.2新版

    架构 项目框架 数仓架构 存储压缩 Snappy与LZO LZO安装: 读取LZO文件时,需要先创建索引,才可以进行切片. 框架版本选型Apache:运维麻烦,需要自己调研兼容性. CDH:国内使用最 ...

  8. 复盘离线电商数仓3.0项目–数据开发梳理

    复盘离线电商数仓项目–数据开发梳理 业务数据 数仓分层 ods层到ads层的开发 开源BI工具Superset ODS层业务数据&日志数据 ods层业务数据 使用Sqoop脚本从Mysql数据 ...

  9. 大数据电商数仓实战v5.0 (尚硅谷)

    电商数仓实战 环境搭建快速回忆 这次详细写!------阿里云ECS云服务器抢占式 1.进入环境先创建wts用户 1.useradd wts 2.passwd wts 去/home/下查看有没有wts ...

最新文章

  1. linux的三个时间
  2. 配置CITRIX XML 服务与IIS 7.x共享端口
  3. java添加删除用户信息泄露_java删除用户404错误!!神奇!增改查都没问题啊!!...
  4. rh9.0虚拟机dmesg启动过程分析(1)
  5. PHP字符串offset取值特性
  6. Qt 信号-槽的同步与异步处理
  7. 【转】【异常处理】Incorrect string value: ‘\xF0\x90\x8D\x83...‘ for column... Emoji表情字符过滤的Java实现
  8. 【图像分割】基于matlab GUI二值化+灰白质医学影像分割【含Matlab源码 184期】
  9. Python - OpenCV库的安装
  10. GUI界面设计学渣笔记———使用PyQt做深度学习的可视化界面
  11. c语言变量ppt,C语言数据类型和变量课件PPT
  12. 盒子模型(标准盒模型、怪异盒模型)
  13. R语言-rethinking包下载安装心得(windows)
  14. 四川大学图书情报档案专业考研经验贴(2022.9.16已更新)
  15. JavaScript实时获取现货黄金,白银,美元指数价格代码
  16. catti二级笔译综合能力真题_catti二级笔译综合能力试题精选及答案解析
  17. 判断两个向量是否平行
  18. Java 读取EXCEL表格中的数据,将数据转为SQL语句
  19. 计算机语言中的逻辑异或的应用,异或同或门逻辑符号_利用或门和非门设计的异或门方案...
  20. C#如何解析UTF-8编码

热门文章

  1. Android应用之个人日记本
  2. JDK8新特性详解Lambda、StreamAPI、Optional等
  3. Python基础知识随缘补(1)字符串的前缀f,r,u,b
  4. OkHttp之线程池的使用
  5. 万字泣血解析割韭菜内幕,程序员别老想着做副业
  6. 加密算法比较:SHA1,SHA256(SHA2),MD5
  7. python geometry参数_python arcgis Geometry | 学步园
  8. 程序思路分享 计算机毕业设计Python+Spark+Hadoop+Flink微博舆情预警系统 微博舆情可视化 舆情大数据 微博大数据 微博爬虫 大数据毕业设计 大数据毕设
  9. 微信公众号开发测试帐号
  10. 第133天学习打卡(Docker 初识Docker Docker的基本组成 安装docker 阿里云镜像加速 Docker常用命令)