从0到1搭建大数据数据服务平台:完整教程

关键词:大数据平台、数据服务、数据采集、数据治理、实时分析、分布式存储、API服务

摘要:本文从企业级大数据需求出发,以“数据工厂”为比喻,用通俗易懂的语言拆解大数据数据服务平台的核心模块(采集-存储-计算-治理-服务),结合具体工具链(Flume/Kafka、HDFS/ClickHouse、Spark/Flink、Atlas、Spring Boot)和实战代码,手把手教你从0搭建一个支持实时/离线分析、高可用、可扩展的大数据平台。无论你是刚接触大数据的开发者,还是想搭建企业数据中台的技术负责人,都能通过本文掌握平台搭建的全流程逻辑与关键细节。


背景介绍

目的和范围

想象一下:你的公司每天产生用户行为日志、交易记录、设备传感器数据等千万级数据,但这些数据分散在MySQL、Redis、日志文件中,业务部门需要分析用户画像时,技术团队要手动从多个系统导数据、写脚本清洗,耗时3天才能出结果——这就是典型的“数据孤岛”困境。
本文的目标,就是教你搭建一个统一的大数据数据服务平台,解决以下问题:

  • 数据分散:将多源数据(结构化/非结构化)统一采集、存储;
  • 分析低效:支持离线批量计算(如每日用户画像)和实时计算(如双11实时GMV);
  • 服务不可靠:通过数据治理保证数据质量,通过API服务让业务快速获取数据。

本文覆盖平台搭建的全流程,从需求分析到上线运维,但不深入特定工具的底层源码(如Hadoop的RPC机制),更关注“如何选工具、如何集成、如何解决常见问题”。

预期读者

  • 初级/中级大数据开发者:想系统学习平台搭建的全流程;
  • 中小企业技术负责人:想为公司搭建数据中台,解决数据孤岛问题;
  • 业务分析师:想了解数据从产生到服务的完整链路,更好地提需求。

文档结构概述

本文以“数据工厂”为核心比喻,按“原材料(数据源)→ 运输(采集)→ 仓库(存储)→ 加工(计算)→ 质检(治理)→ 销售(服务)”的逻辑展开,最后补充实战技巧与未来趋势。

术语表

术语 解释(用小学生能懂的话)
ETL 数据“整理魔法”:从各个地方收集(Extract)数据,清洗/转换(Transform)成统一格式,存到仓库(Load)。
分布式存储 像图书馆的多个书架,数据分散存放在多台机器上,但取书时能快速找到所有相关的书。
实时计算 像超市的收银机,顾客一结账,销售额立刻更新到屏幕上,而不是等晚上关店再统计。
元数据 数据的“说明书”:记录数据来自哪里、有什么字段、更新时间,就像药盒上的成分表。
API服务 数据的“外卖窗口”:业务部门不用自己去仓库搬数据,通过接口(如HTTP请求)就能拿到需要的结果。

核心概念与联系:像搭“数据工厂”一样搭建平台

故事引入:小明的奶茶店数据困境

小明开了3家奶茶店,每天产生:

  • 订单系统(MySQL):用户点了什么奶茶、支付金额;
  • 门店监控(日志文件):顾客在店停留时间、热门产品区域;
  • 会员系统(Redis):会员积分、优惠券使用情况。

小明想分析“哪些顾客最爱买草莓奶茶+蛋糕套餐”,但遇到麻烦:

  1. 数据分散:需要找技术部从3个系统导数据,格式不统一(订单是表格,日志是文本);
  2. 分析慢:技术部手动清洗数据要2天,结果可能过时;
  3. 数据不准:日志里的“停留时间”可能因为监控故障有错误值。

这时候,小明需要一个“数据工厂”——把所有数据拉到一起(采集)、存好(存储)、加工成有用的信息(计算)、保证质量(治理)、最后通过窗口卖给业务(服务)。这就是本文要搭建的“大数据数据服务平台”。

核心概念解释(用奶茶店打比方)

核心概念一:数据采集(运输车)

数据采集就像奶茶店的“原材料运输车”:把分散在各个系统(订单系统、监控、会员系统)的数据拉到“数据工厂”。

  • 常见工具:Flume(拉日志文件)、Kafka(实时传输高并发数据,如双11订单)、Sqoop(从MySQL导数据到大数据平台)。
核心概念二:数据存储(仓库)

数据存储是“数据工厂的仓库”,需要存不同类型的“原材料”:

  • 原始数据(未加工):像刚运来的牛奶、茶叶,存到HDFS(分布式大文件存储,便宜量大);
  • 清洗后的数据:像已经过滤的牛奶,存到Hive(类似大数据版Excel,支持SQL查询);
  • 实时数据:像刚煮好的奶茶,需要快速取,存到HBase(实时读写的NoSQL数据库)或ClickHouse(分析型数据库,查得快)。
核心概念三:数据计算(加工车间)

数据计算是“加工车间”,把原始数据变成业务需要的“奶茶产品”:

  • 离线计算(批量处理):像晚上关店后统一煮珍珠,用Spark(处理TB级数据,比Hadoop快);
  • 实时计算(边收边处理):像顾客下单时立刻煮奶茶,用Flink(毫秒级延迟,适合实时GMV统计)。
核心概念四:数据治理(质检部门)

数据治理是“质检部门”,保证“奶茶”质量:

  • 元数据管理:记录“牛奶来自哪个供应商(数据来源)、什么时候运来的(更新时间)”,用Apache Atlas;
  • 数据质量监控:检查“牛奶有没有过期(数据是否缺失)、甜度是否达标(字段是否符合规则)”;
  • 数据血缘追踪:如果“奶茶喝了拉肚子”,能找到是“牛奶”还是“茶叶”的问题(定位数据错误源头)。
核心概念五:数据服务(销售窗口)

数据服务是“销售窗口”,业务部门不用自己去仓库搬数据,通过API直接拿结果:

  • 接口类型:HTTP API(像点单小程序)、SDK(像预包装奶茶,直接拿走用);
  • 常见工具:Spring Boot(快速写API)、Apache Superset(可视化图表,直接给业务看)。

核心概念之间的关系(数据工厂的协作)

  • 采集→存储:运输车(采集工具)把原材料(数据)送到仓库(存储系统),不同原材料存不同仓库(如日志存HDFS,订单存Hive)。
  • 存储→计算:加工车间(计算框架)从仓库取数据,离线计算(Spark)处理Hive的历史数据,实时计算(Flink)处理Kafka的实时数据流。
  • 计算→治理:质检部门(治理工具)检查加工后的“奶茶”是否合格(数据质量),并记录“奶茶用了哪些原材料”(数据血缘)。
  • 治理→服务:只有质检合格的“奶茶”才能放到销售窗口(API服务),业务部门通过接口拿到可靠的数据。

核心概念原理和架构的文本示意图

数据源(MySQL/日志/Redis) → 采集(Flume/Kafka/Sqoop) → 存储(HDFS/Hive/HBase)  
↑                        ↓  
计算(Spark/Flink)← 治理(Atlas/质量监控)  
↑  
服务(API/Superset)→ 业务部门(运营/分析师)

Mermaid 流程图

graph TD
    A[数据源:MySQL/日志/Redis] --> B[采集:Flume/Kafka/Sqoop]
    B --> C[存储:HDFS/Hive/HBase]
    C --> D[计算:Spark(离线)/Flink(实时)]
    D --> E[治理:Atlas(元数据)/质量监控]
    E --> F[服务:API/Superset]
    F --> G[业务部门:运营/分析师]

核心算法原理 & 具体操作步骤

步骤1:明确需求(先想清楚建什么样的工厂)

  • 业务需求:小明的奶茶店需要分析“用户复购率”(离线)、“实时订单量”(实时)、“会员优惠券使用率”(多维分析)。
  • 数据量预估:每天订单10万条(500MB)、日志100GB、会员数据10万条(100MB)→ 总数据量约100GB/天,需支持3年存储(约100TB)。
  • 性能要求:离线分析(次日早上出结果)、实时分析(延迟<5秒)、API查询(响应时间<2秒)。

步骤2:搭建基础环境(选工具、装软件)

硬件/云资源准备(以云服务器为例)
  • 3台Master节点(CPU 4核、内存16GB、磁盘100GB):跑Hadoop NameNode、Spark Master、Flink JobManager;
  • 5台Worker节点(CPU 8核、内存32GB、磁盘1TB):跑Hadoop DataNode、Spark Executor、Flink TaskManager;
  • 1台治理节点(CPU 4核、内存8GB、磁盘200GB):跑Apache Atlas;
  • 1台服务节点(CPU 4核、内存8GB、磁盘200GB):跑Spring Boot API服务。
工具安装(以CentOS 7为例)
  1. JDK安装(所有节点):

    yum install -y java-1.8.0-openjdk
    echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk' >> ~/.bashrc
    source ~/.bashrc
    
  2. Hadoop安装(分布式存储):
    下载Hadoop 3.3.6,解压到/opt/hadoop,修改core-site.xml配置NameNode地址(如hdfs://master1:9000),hdfs-site.xml配置副本数(3),然后启动:

    /opt/hadoop/sbin/start-dfs.sh
    
  3. Spark安装(离线计算):
    下载Spark 3.3.2,解压到/opt/spark,修改spark-env.sh配置Master地址(spark://master1:7077),Worker节点指向Master,启动:

    /opt/spark/sbin/start-all.sh
    

步骤3:数据采集(把原材料拉到工厂)

场景1:从MySQL导历史订单数据(离线采集)

用Sqoop(SQL到Hadoop的工具),将MySQL的order表导入Hive:

sqoop import \
--connect jdbc:mysql://mysql-host:3306/shop \
--username root \
--password 123456 \
--table order \
--hive-import \
--hive-table default.order \
--num-mappers 4  # 用4个线程并行导入
场景2:实时采集门店日志(实时传输)

用Flume(日志采集工具)监控/var/log/shop/access.log,实时发送到Kafka(消息队列,缓存高并发数据):

  1. 配置flume.conf

    agent.sources = logSource
    agent.channels = kafkaChannel
    agent.sinks = kafkaSink
    
    # 源:监控日志文件
    agent.sources.logSource.type = exec
    agent.sources.logSource.command = tail -F /var/log/shop/access.log
    agent.sources.logSource.channels = kafkaChannel
    
    # 通道:内存缓存
    agent.channels.kafkaChannel.type = memory
    agent.channels.kafkaChannel.capacity = 10000
    
    # 下沉:发送到Kafka
    agent.sinks.kafkaSink.type = org.apache.flume.sink.kafka.KafkaSink
    agent.sinks.kafkaSink.kafka.bootstrap.servers = kafka-host:9092
    agent.sinks.kafkaSink.kafka.topic = shop_log
    agent.sinks.kafkaSink.channel = kafkaChannel
    
  2. 启动Flume:

    flume-ng agent -n agent -c /etc/flume/conf -f flume.conf
    

步骤4:数据存储(选合适的仓库)

  • 原始数据(未加工的日志、MySQL导出数据):存HDFS的/raw目录,按天分区(如/raw/shop_log/2024-03-01),优点是便宜、支持大文件。
  • 清洗后的数据(去除空值、统一格式的订单):存Hive的clean_order表,支持SQL查询(如SELECT user_id, SUM(amount) FROM clean_order GROUP BY user_id)。
  • 实时数据(Kafka的实时订单流):存HBase的realtime_order表,按user_id作为RowKey,支持快速读写(如查某用户最近10分钟的订单)。

步骤5:数据计算(加工成业务需要的“奶茶”)

离线计算示例:用Spark计算用户复购率

需求:统计过去30天内,购买过2次及以上的用户占比。

  1. 读取Hive的clean_order表:

    val spark = SparkSession.builder().appName("RepurchaseRate").getOrCreate()
    import spark.implicits._
    val orderDF = spark.sql("SELECT user_id, order_time FROM clean_order WHERE order_time >= '2024-02-01'")
    
  2. 按用户分组,统计订单数:

    val userOrderCount = orderDF
      .groupBy("user_id")
      .agg(count("order_time").as("order_count"))
    
  3. 计算复购用户数:

    val repurchaseUsers = userOrderCount.filter("order_count >= 2").count()
    val totalUsers = userOrderCount.count()
    val repurchaseRate = repurchaseUsers.toDouble / totalUsers
    
  4. 将结果存回Hive的repurchase_rate表:

    repurchaseRateDF.write.mode("overwrite").saveAsTable("repurchase_rate")
    
实时计算示例:用Flink统计实时订单量(每5分钟更新)

需求:监控Kafka的order_topic,每5分钟统计一次订单数,输出到控制台。

  1. 读取Kafka数据流:

    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    Properties props = new Properties();
    props.setProperty("bootstrap.servers", "kafka-host:9092");
    DataStream<String> orderStream = env.addSource(
        new FlinkKafkaConsumer<>("order_topic", new SimpleStringSchema(), props)
    );
    
  2. 按时间窗口(5分钟)分组统计:

    DataStream<Tuple2<String, Integer>> countStream = orderStream
        .windowAll(TumblingProcessingTimeWindows.of(Time.minutes(5)))
        .process(new ProcessAllWindowFunction<String, Tuple2<String, Integer>, TimeWindow>() {
            @Override
            public void process(Context context, Iterable<String> elements, Collector<Tuple2<String, Integer>> out) {
                int count = 0;
                for (String e : elements) count++;
                out.collect(Tuple2.of(context.window().getEnd().toString(), count));
            }
        });
    
  3. 输出结果:

    countStream.print();
    env.execute("RealTimeOrderCount");
    

步骤6:数据治理(保证“奶茶”质量)

元数据管理(用Apache Atlas)

Atlas可以记录“clean_order表来自MySQL的order表,通过Sqoop在每天凌晨2点导入,包含user_id(用户ID)、amount(金额)字段”。

  • 安装Atlas:下载Atlas 2.3.0,启动服务:

    /opt/atlas/bin/atlas_start.py
    
  • 手动注册Hive表元数据(或通过Sqoop导入时自动同步):
    登录Atlas Web界面(http://atlas-host:21000),创建Hive表实体,填写“数据源”“字段描述”“更新时间”等信息。

数据质量监控(用Apache Griffin)

Griffin可以设置规则,比如“clean_order表的amount字段不能为负数”,发现问题时发邮件告警。

  • 配置质量规则(griffin-rule.json):

    {
      "name": "order_amount_check",
      "metrics": [
        {
          "name": "amount_non_negative",
          "type": "count",
          "filter": "amount < 0"
        }
      ],
      "threshold": {
        "amount_non_negative": 0  # 允许0条负数记录
      }
    }
    
  • 运行质量检查:

    griffin check --rule griffin-rule.json --data-source hive://clean_order
    

步骤7:数据服务(让业务部门方便取数据)

用Spring Boot写一个API,查询用户复购率:

  1. 创建Spring Boot项目,添加依赖(spring-boot-starter-webspring-boot-starter-jdbc)。

  2. 编写Controller:

    @RestController
    @RequestMapping("/api/repurchase")
    public class RepurchaseController {
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @GetMapping("/rate")
        public double getRepurchaseRate() {
            String sql = "SELECT rate FROM repurchase_rate ORDER BY date DESC LIMIT 1";
            return jdbcTemplate.queryForObject(sql, Double.class);
        }
    }
    
  3. 测试接口:访问http://service-host:8080/api/repurchase/rate,返回复购率(如0.35)。


数学模型和公式 & 详细讲解 & 举例说明

数据倾斜的数学解释(分布式计算的常见问题)

在分布式计算中,数据可能集中到某1个节点(如某用户的订单量是其他用户的100倍),导致该节点计算慢(“数据倾斜”)。

  • 数学模型:假设总数据量为( N ),节点数为( k ),理想情况下每个节点处理( N/k )条数据;但实际中,某节点可能处理( N \times p )条数据(( p )为倾斜比例,( p > 1/k ))。
  • 举例:100万条订单数据,10个节点,理想每个节点处理10万条;若某用户有50万条订单,且被分到同一个节点,该节点需处理50万条(( p=0.5 )),其他节点处理5万条,导致该节点成为瓶颈。

解决方案:加盐哈希

将用户ID加随机数(如user_id_1user_id_2),分散到多个节点,计算完成后再聚合。

  • 公式:新键 = ( \text{user_id} + \text{random}(1, 10) )(10为分桶数)。
  • 效果:50万条订单被分到10个节点,每个节点处理5万条,与其他节点负载均衡。

项目实战:代码实际案例和详细解释说明

开发环境搭建(本地调试版)

为了降低学习成本,先在本地用Docker搭建迷你平台(1台机器模拟集群):

  1. 安装Docker和Docker Compose。

  2. 下载docker-compose.yml(包含Hadoop、Spark、Kafka、Hive):

    version: '3'
    services:
      hadoop:
        image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
        ports:
          - "9870:9870"
        volumes:
          - hadoop_data:/hadoop/dfs/name
      spark:
        image: bde2020/spark-master:3.3.0-hadoop3.2
        ports:
          - "8080:8080"
        depends_on:
          - hadoop
      kafka:
        image: confluentinc/cp-kafka:7.2.1
        ports:
          - "9092:9092"
        environment:
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
    volumes:
      hadoop_data:
    
  3. 启动容器:

    docker-compose up -d
    

源代码详细实现和代码解读(以实时订单统计为例)

需求:用Flink消费Kafka的实时订单数据,统计每5分钟的订单量,输出到控制台。

步骤1:创建Maven项目,添加依赖

pom.xml添加Flink和Kafka依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.12</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka_2.12</artifactId>
        <version>1.17.1</version>
    </dependency>
</dependencies>
步骤2:编写Flink程序
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.flink.util.Collector;
import java.util.Properties;

public class RealTimeOrderCount {
    public static void main(String[] args) throws Exception {
        // 1. 创建执行环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 2. 配置Kafka消费者
        Properties props = new Properties();
        props.setProperty("bootstrap.servers", "localhost:9092");
        props.setProperty("group.id", "order-consumer-group");

        // 3. 从Kafka读取订单数据流(假设消息是JSON字符串,如{"orderId":"1","time":"2024-03-01 12:00:00"})
        DataStream<String> orderStream = env.addSource(
            new FlinkKafkaConsumer<>("order_topic", new SimpleStringSchema(), props)
                .setStartFromEarliest()  // 从最早的数据开始消费
        );

        // 4. 定义时间窗口(每5分钟统计一次)
        DataStream<Tuple2<String, Integer>> countStream = orderStream
            .windowAll(TumblingProcessingTimeWindows.of(Time.minutes(5)))
            .process(new ProcessAllWindowFunction<String, Tuple2<String, Integer>, TimeWindow>() {
                @Override
                public void process(Context context, Iterable<String> elements, Collector<Tuple2<String, Integer>> out) {
                    int count = 0;
                    // 遍历窗口内的所有订单消息,统计数量
                    for (String element : elements) {
                        count++;
                    }
                    // 输出窗口结束时间和订单数
                    out.collect(Tuple2.of(
                        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(context.window().getEnd())),
                        count
                    ));
                }
            });

        // 5. 输出结果到控制台
        countStream.print();

        // 6. 启动任务
        env.execute("Real-Time Order Count");
    }
}
步骤3:代码解读
  • 第2步:配置Kafka的连接地址(bootstrap.servers)和消费者组(group.id),确保能正确订阅order_topic
  • 第3步FlinkKafkaConsumer是Flink提供的Kafka连接器,SimpleStringSchema表示消息是字符串类型(实际项目中可能用JSON反序列化)。
  • 第4步windowAll定义全局窗口(所有数据都进入同一个窗口),TumblingProcessingTimeWindows.of(Time.minutes(5))表示每5分钟生成一个不重叠的窗口。
  • 第5步process方法遍历窗口内的所有消息,统计数量,输出窗口结束时间和订单数。

实际应用场景

场景1:电商用户行为分析

  • 数据来源:APP点击日志(Flume采集)、订单数据(Sqoop从MySQL导入)、购物车数据(Kafka实时传输)。
  • 平台处理:
    • 离线:用Spark计算“用户购买路径”(从点击商品到下单的转化率);
    • 实时:用Flink监控“大促期间每秒订单量”,触发库存预警;
    • 服务:通过API给运营部门提供“热门商品排行榜”。

场景2:金融风控

  • 数据来源:交易记录(Kafka实时传输)、用户征信(Sqoop从Oracle导入)、设备登录日志(Flume采集)。
  • 平台处理:
    • 实时:用Flink检测“同一用户5分钟内异地登录”,触发风险预警;
    • 治理:用Atlas追踪“某笔异常交易”的数据血缘(来自哪个POS机、哪个商户);
    • 服务:给风控系统提供“用户历史风险评分”API。

工具和资源推荐

必选工具

模块 工具 推荐理由
采集 Flume(日志)、Kafka(高并发)、Sqoop(关系型数据库) Flume简单易用,Kafka支持高吞吐,Sqoop完美衔接MySQL/Oracle和Hadoop。
存储 HDFS(大文件)、Hive(SQL分析)、ClickHouse(实时查询) HDFS便宜量大,Hive支持SQL,ClickHouse比Hive查得快10-100倍。
计算 Spark(离线)、Flink(实时) Spark生态完善(SQL/MLlib),Flink延迟更低(毫秒级)。
治理 Apache Atlas(元数据)、Apache Griffin(质量监控) Atlas是元数据管理的事实标准,Griffin支持自定义质量规则。
服务 Spring Boot(API)、Apache Superset(可视化) Spring Boot快速写API,Superset支持拖拽生成图表,业务部门自己就能用。

学习资源

  • 官方文档:Hadoop(hadoop.apache.org)、Spark(spark.apache.org)、Flink(flink.apache.org)。
  • 书籍:《Hadoop权威指南》《Spark大数据分析》《Flink基础与实践》。
  • 社区:Stack Overflow(提问找答案)、GitHub(搜工具源码和示例)。

未来发展趋势与挑战

趋势1:实时化

传统“离线计算为主”转向“实时+离线”融合,比如用Flink同时处理实时订单和历史数据,实现“实时用户画像”(用户刚下单,画像立即更新)。

趋势2:云原生

越来越多企业用云厂商的大数据服务(如AWS EMR、阿里云E-MapReduce),无需自己维护集群,按需付费,弹性扩缩容。

趋势3:AI与大数据融合

用机器学习模型优化数据治理(如自动识别数据质量问题)、提升计算效率(如用AI预测数据倾斜并自动调整任务)。

挑战1:数据安全

《个人信息保护法》要求数据脱敏(如将手机号“13812345678”转成“138****5678”),平台需支持脱敏规则自动应用(如在API输出时自动脱敏)。

挑战2:高并发性能

双11期间,Kafka需处理百万TPS(每秒消息数),HBase需支持百万QPS(每秒查询数),平台需优化网络、磁盘IO、内存使用。

挑战3:跨平台整合

企业可能同时用阿里云、AWS、自建数据中心,平台需支持多云数据互通(如用DataX同步阿里云RDS和AWS S3的数据)。


总结:学到了什么?

核心概念回顾

  • 数据采集:把分散的数据拉到平台(Flume/Kafka/Sqoop);
  • 数据存储:根据数据类型选存储(HDFS存大文件、Hive存清洗后数据、ClickHouse存实时数据);
  • 数据计算:离线用Spark,实时用Flink;
  • 数据治理:用Atlas管元数据,用Griffin监控质量;
  • 数据服务:通过API和可视化工具让业务部门用数据。

概念关系回顾

数据工厂的各个模块像奶茶店的流水线:运输车(采集)把原材料(数据)送到仓库(存储),加工车间(计算)做成奶茶(分析结果),质检(治理)合格后,通过销售窗口(服务)卖给顾客(业务部门)。


思考题:动动小脑筋

  1. 如果你是小明的技术负责人,奶茶店要新增“小程序点单”功能(产生更多实时订单),你会如何调整数据平台?(提示:考虑Kafka的分区数、Flink的并行度)

  2. 数据治理中,如何用元数据管理避免“重复开发”?比如,业务A已经计算过“用户复购率”,业务B又重新开发了一遍。

  3. 假设平台的HDFS集群有1个节点故障,数据会丢失吗?为什么?(提示:HDFS的副本机制)


附录:常见问题与解答

Q:搭建平台时,Hadoop和Spark需要装在同一台机器吗?
A:不需要!Hadoop(HDFS)负责存储,Spark负责计算,Spark的Executor可以从HDFS读取数据,所以Hadoop和Spark可以部署在不同集群(甚至不同云),只要网络连通。

Q:数据倾斜怎么解决?除了加盐哈希还有其他方法吗?
A:还可以:

  • 过滤掉倾斜键(如某用户订单异常多,可能是机器人,直接过滤);
  • 改用LocalAggregation(先在每个节点本地聚合,再全局聚合,减少网络传输)。

Q:API服务如何保证高可用?
A:用Nginx做负载均衡(多个API节点),用Redis缓存高频查询结果(如“今日实时GMV”),用Sentinel做流量控制(防止业务部门刷接口)。


扩展阅读 & 参考资料

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐