
1) 【一句话结论】:在360大数据平台中,数据湖存储原始未加工的日志数据,数据仓库存储加工后的结构化分析数据,通过数据管道实现流动与分离,通过元数据管理、API服务实现数据共享。
2) 【原理/概念讲解】:数据湖(Data Lake)是存储原始、未经过滤或加工的数据集合,支持多种数据格式(如JSON、日志文件),类似“原始水库”,存储的是“原材料”;数据仓库(Data Warehouse)是存储经过ETL/ELT处理后的结构化数据,用于业务分析,类似“加工后的饮用水”,存储的是“成品”。数据流动逻辑是:原始日志首先写入数据湖,通过数据管道(如Kafka、Flink)进行清洗、转换,加载到数据仓库;分离逻辑基于数据生命周期——湖中是“原始阶段”,仓库是“加工阶段”,两者通过数据格式、处理复杂度区分。类比:数据湖像超市的“生鲜区”,存放未加工的食材;数据仓库像“熟食区”,存放加工好的菜肴,用户直接取用熟食,不用自己处理生鲜。
3) 【对比与适用场景】:
| 特性/场景 | 数据湖 | 数据仓库 |
|---|---|---|
| 定义 | 存储原始、未加工的日志/数据 | 存储经过ETL/ELT处理的结构化分析数据 |
| 特性 | 支持多种格式(结构化/半/非结构化),可扩展,成本较低 | 数据标准化,一致性高,面向分析,模型复杂 |
| 使用场景 | 日志分析、用户行为追踪、非结构化数据(如图片、视频)、探索性分析 | 报表、BI、决策支持、业务指标计算(如用户活跃度、转化率) |
| 注意点 | 数据质量差,需要治理;查询性能低(原始数据) | 数据模型设计复杂,扩展性相对有限;处理成本高(ETL/ELT) |
4) 【示例】:假设360的日志数据存储在HDFS(数据湖),用户访问日志(结构化日志,如JSON格式)每天写入数据湖。通过Spark读取数据湖中的日志文件,进行数据清洗(过滤无效记录、处理缺失值),然后转换(如聚合用户ID、时间戳、URL),最后写入数据仓库的“用户访问表”(如MySQL或Hive表)。伪代码示例(Spark SQL):
// 读取数据湖中的日志文件
df = spark.read.format("json").load("hdfs://data-lake/user_access_logs/*")
// 数据清洗与转换
cleaned_df = df.filter("user_id is not null") \
.withColumn("visit_time", to_timestamp("timestamp")) \
.groupBy("user_id", "visit_time") \
.agg(count("url").alias("visit_count"))
// 写入数据仓库
cleaned_df.write.format("parquet").save("hdfs://data-warehouse/user_access")
5) 【面试口播版答案】:好的,面试官。在360的大数据平台架构中,我们采用“数据湖+数据仓库”的混合模式。数据湖用于存储原始的日志数据,比如用户访问日志、系统操作日志,这些数据是未经过滤或加工的,支持多种格式(JSON、日志文件等),类似“原始水库”,存储的是“原材料”;数据仓库则存储经过ETL处理后的结构化数据,用于业务分析,比如用户活跃度、转化率等指标,类似“加工后的饮用水”,存储的是“成品”。数据流动逻辑是:原始日志首先写入数据湖,通过数据管道(如Kafka、Flink)进行清洗、转换,然后加载到数据仓库;分离逻辑基于数据生命周期——湖中是“原始阶段”,仓库是“加工阶段”,两者通过数据格式、处理复杂度区分。数据共享方面,我们通过元数据管理(如Apache Atlas)统一管理湖和仓库的元数据,提供数据目录服务;同时,通过API服务(如RESTful API)暴露数据仓库的表,供业务系统调用;对于数据湖中的原始数据,提供轻量级查询服务(如HiveQL),支持探索性分析。这样既保证了原始数据的完整性,又通过加工后的数据支持业务决策,实现了数据流动与分离,并支持高效共享。
6) 【追问清单】:
7) 【常见坑/雷区】: