DukeDuke
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
  • 技术文档

    • 网络原理

      • 交换机
      • 路由器
      • TCP/IP协议
      • HTTP 与 HTTPS
    • 软件架构

      • 什么是软件架构
      • 分层架构
      • 微服务架构
      • 事件驱动架构
      • 领域驱动设计(DDD)
      • 架构图
      • 高并发系统
    • Vue3

      • Vue3简介
      • Vue3响应式系统
      • Vue3组合式API
      • Vue3生命周期
      • Vue3模板语法
      • Vue3组件系统
      • Vue3 路由系统
      • Vue3 状态管理
      • Vue3 性能优化
      • Vue3 TypeScript 支持
      • Vue3 项目实战
      • VUE 面试题大全
      • Node.js 安装
    • JAVA

      • JVM

        • 认识JVM
        • JVM类加载器
        • 运行时数据区
        • 执行引擎
        • 本地方法接口
        • 本地方法库
        • JVM垃圾回收
        • JVM性能监控
        • JVM调优
      • 设计模式
        • 单例模式
        • 工厂模式
        • 策略模式
        • 适配器模式
        • 建造者模式
        • 原型模式
        • 装饰器模式
        • 代理模式
        • 外观模式
        • 享元模式
        • 组合模式
        • 桥接模式
      • Java多线程

        • Java 线程基础详解
        • Java 线程池详解
        • Java ThreadLocal 详解
        • Java volatile 详解
        • Java 线程间通信详解
        • Java 线程安全详解
        • Java 线程调度详解
        • Java 线程优先级详解

        • Java 线程中断详解
        • Java 线程死锁详解
      • Java反射
      • Java 面试题

        • Java 基础概念面试题
        • Java 面向对象编程面试题
        • Java 集合框架面试题
        • Java 多线程与并发面试题
        • JVM 与内存管理面试题
        • Java I/O 与 NIO 面试题
        • Java 异常处理面试题
        • Java 反射与注解面试题
        • Java Spring 框架面试题
        • Java 数据库与 JDBC 面试题
        • Java 性能优化面试题
        • Java 实际项目经验面试题
        • Java 高级特性面试题
        • Java 面试准备建议
    • Python

      • Python简介
      • Python安装
      • Python hello world
      • Python基础语法
      • Python数据类型
      • Python数字
      • Python字符串
      • Python列表
      • Python元组
      • Python字典
      • Python日期时间
      • Python文件操作
      • Python异常处理
      • Python函数
      • Python类
      • Python模块
      • Python包
      • Python多线程
      • Python面向对象
      • Python爬虫
      • Django web框架
      • Python 面试题

        • Python 面试题导航
        • Python 基础概念
        • Python 面向对象编程
        • Python 数据结构
        • Python 高级特性
        • Python 框架
        • Python 性能优化
        • Python 项目经验
    • Spring

      • Spring
      • Springboot
      • Spring Security 安全框架
      • SpringBoot 中的事件详解
      • SpringBoot 中的定时任务详解
      • SpringBoot 自动装配原理与源码解释
    • Mybatis

      • Mybatis
      • Mybatis-Plus
    • 数据库

      • Redis

        • Redis简介
        • Redis(单机)安装
        • Redis配置
        • Redis数据结构
        • RDB、AOF 和混合持久化机制
        • Redis内存管理
        • Redis缓存一致性
        • Redis缓存穿透
        • Redis缓存击穿
        • Redis缓存雪崩
        • Redis Lua脚本
        • Redis主从复制
        • Redis哨兵模式
        • Redis集群
        • Redis数据分片
        • Redis CPU使用率过高
        • Redis面试题
      • MySQL

        • MySQL简介
        • MySQL安装
        • MySQL配置
        • MYSQL日常维护
        • MYSQL优化-慢查询
        • MYSQL优化-索引
        • MYSQL数据库设计规范
    • 消息队列

      • RocketMQ
      • Kafka
      • RabbitMQ
      • 消息队列面试题
    • 微服务

      • SpringCloud 微服务
      • Eureka 注册中心
      • Nacos 注册中心
      • Gateway 网关
      • Feign 服务调用
      • Sentinel 限流 与 熔断
      • Seata 分布式事务
      • CAP 理论
      • Redis 分布式锁
      • 高并发系统设计
    • ELK日志分析系统

      • Elasticsearch 搜索引擎
      • Logstash 数据处理
      • Kibana 可视化
      • ELK 实战
    • 开放API

      • 开放API设计
      • 开放API示例项目
    • 人工智能

      • 人工智能简介
      • 机器学习

      • 深度学习

      • 自然语言处理

      • 计算机视觉

        • CUDA与cuDNN详细安装
        • Conda 安装
        • Pytorch 深度学习框架
        • yolo 目标检测
        • TensorRT 深度学习推理优化引擎
        • TensorFlow 机器学习
        • CVAT 图像标注
        • Windows 下安装 CUDA、cuDNN、TensorRT、TensorRT-YOLO 环境
        • Windows10+CUDA+cuDNN+TensorRT+TensorRT-YOLO 部署高性能YOLO11推理
    • 大数据

      • 大数据简介
      • Hadoop 数据存储
      • Flume 数据采集
      • Sqoop 数据导入导出
      • Hive 数据仓库
      • Spark 数据处理
      • Flink 数据处理
      • Kafka 数据采集
      • HBase 数据存储
      • Elasticsearch 搜索引擎
    • 图像处理

      • 图像处理简介
      • 医学图像web呈现
      • 医学图像处理
      • 切片细胞分离问题
    • 服务器&运维

      • Linux 系统

        • Linux 系统管理
        • Linux 网络管理
        • Linux 文件管理
        • Linux 命令大全
      • Nginx Web 服务器

        • Nginx 安装 与 配置
        • Nginx 负载均衡
        • Nginx SSL证书配置
        • Nginx Keepalived 高可用
      • Docker 容器

        • Docker 简介
        • Docker 安装与配置
        • Docker 命令
        • Docker 部署 Nginx
        • Docker 部署 MySQL
        • Docker 部署 Redis
      • 服务器

        • 塔式服务器
        • 机架式服务器
        • 刀片服务器
      • Git 版本控制
      • Jenkins 持续集成
      • Jmeter 性能测试
      • Let's Encrypt 免费SSL证书
    • 简历

      • 项目经理简历
      • 开发工程师简历

Hadoop 技术详解

目录

  • Hadoop 概述
  • Hadoop 核心组件
  • HDFS 分布式文件系统
  • MapReduce 编程模型
  • YARN 资源管理
  • Hadoop 生态系统
  • Hadoop 安装配置
  • Hadoop 实践案例
  • Hadoop 最佳实践

Hadoop 概述

什么是 Hadoop

提示

Hadoop 是一个开源的分布式存储和计算框架,专门用于处理大规模数据集。它基于 Google 的 MapReduce 和 GFS 论文设计,能够以可靠、高效、可伸缩的方式处理海量数据。

Hadoop 核心特点

  1. 高可靠性:数据自动保存多个副本,容错能力强
  2. 高扩展性:可扩展到数千个节点,处理 PB 级数据
  3. 高效性:数据并行处理,提高处理效率
  4. 高容错性:自动检测和处理硬件故障
  5. 低成本:基于普通硬件构建,成本低廉

Hadoop 发展历程

  • 2003 年:Google 发布 GFS 论文
  • 2004 年:Google 发布 MapReduce 论文
  • 2006 年:Doug Cutting 创建 Hadoop 项目
  • 2008 年:Hadoop 成为 Apache 顶级项目
  • 2011 年:Hadoop 1.0 正式发布
  • 2013 年:Hadoop 2.0 发布,引入 YARN
  • 2017 年:Hadoop 3.0 发布,支持纠删码

Hadoop 核心组件

1. HDFS (Hadoop Distributed File System)

HDFS 是 Hadoop 的分布式文件系统,具有以下特点:

  • 大文件存储:适合存储 GB、TB 级别的大文件
  • 流式数据访问:适合批量处理,不适合低延迟访问
  • 简单一致性模型:一次写入,多次读取
  • 移动计算而非移动数据:将计算任务分发到数据所在节点

2. MapReduce

MapReduce 是 Hadoop 的分布式计算框架:

  • Map 阶段:将输入数据分割并并行处理
  • Reduce 阶段:对 Map 阶段的输出进行汇总
  • 自动并行化:自动处理任务调度和容错
  • 数据本地性:尽量在数据所在节点执行计算

3. YARN (Yet Another Resource Negotiator)

YARN 是 Hadoop 2.0 引入的资源管理系统:

  • 资源管理:统一管理集群资源
  • 应用调度:支持多种计算框架
  • 高可用性:支持 ResourceManager 高可用
  • 多租户:支持多用户、多应用共享集群

HDFS 分布式文件系统

HDFS 架构

HDFS 采用主从架构:

┌─────────────────┐    ┌─────────────────┐
│   NameNode      │    │   DataNode      │
│   (主节点)       │    │   (从节点)       │
│                 │    │                 │
│ • 元数据管理     │    │ • 数据块存储     │
│ • 文件系统树     │    │ • 心跳报告       │
│ • 客户端访问     │    │ • 数据块复制     │
└─────────────────┘    └─────────────────┘

HDFS 核心概念

1. 数据块 (Block)

  • 默认大小:128MB (Hadoop 2.x+),64MB (Hadoop 1.x)
  • 副本数量:默认 3 个副本
  • 容错机制:副本分布在不同机架

2. NameNode

  • 职责:管理文件系统命名空间
  • 存储内容:文件元数据、数据块位置信息
  • 内存要求:每个文件约占用 150 字节内存

3. DataNode

  • 职责:存储实际数据块
  • 心跳机制:每 3 秒向 NameNode 发送心跳
  • 数据块报告:定期报告存储的数据块信息

HDFS 文件操作

文件写入流程

  1. 客户端向 NameNode 请求创建文件
  2. NameNode 检查权限和文件是否存在
  3. NameNode 返回 DataNode 列表
  4. 客户端向 DataNode 写入数据
  5. DataNode 之间进行数据复制
  6. 写入完成后通知 NameNode

文件读取流程

  1. 客户端向 NameNode 请求文件位置
  2. NameNode 返回数据块位置信息
  3. 客户端直接从 DataNode 读取数据
  4. 如果读取失败,自动切换到其他副本

HDFS 高可用性

NameNode 高可用 (HA)

  • Active NameNode:处理客户端请求
  • Standby NameNode:热备份,快速切换
  • JournalNode:存储元数据变更日志
  • ZooKeeper:协调故障转移

数据块复制策略

机架1: 副本1
机架2: 副本2, 副本3
  • 第一个副本:本地机架任意节点
  • 第二个副本:不同机架任意节点
  • 第三个副本:与第二个副本相同机架

MapReduce 编程模型

MapReduce 工作原理

1. Map 阶段

// Map 函数示例
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        String line = value.toString();
        String[] words = line.split(" ");
        for (String word : words) {
            this.word.set(word);
            context.write(this.word, one);
        }
    }
}

2. Reduce 阶段

// Reduce 函数示例
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        result.set(sum);
        context.write(key, result);
    }
}

MapReduce 执行流程

  1. Input Split:输入数据分片
  2. Map Task:并行执行 Map 函数
  3. Shuffle & Sort:数据排序和分组
  4. Reduce Task:执行 Reduce 函数
  5. Output:输出最终结果

MapReduce 优化策略

1. 数据本地性优化

  • 数据本地性:尽量在数据所在节点执行任务
  • 机架本地性:同一机架内执行任务
  • 网络本地性:通过网络传输数据

2. 内存优化

<!-- mapred-site.xml -->
<property>
    <name>mapreduce.map.memory.mb</name>
    <value>2048</value>
</property>
<property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>4096</value>
</property>

3. 并行度优化

// 设置 Map 任务数量
job.setNumMapTasks(10);

// 设置 Reduce 任务数量
job.setNumReduceTasks(5);

YARN 资源管理

YARN 架构组件

1. ResourceManager (RM)

  • 全局资源管理:管理整个集群资源
  • 应用调度:调度应用程序
  • 高可用性:支持主备模式

2. NodeManager (NM)

  • 节点资源管理:管理单个节点资源
  • 容器管理:启动和监控容器
  • 资源报告:向 RM 报告资源使用情况

3. ApplicationMaster (AM)

  • 应用管理:管理单个应用程序
  • 资源请求:向 RM 请求资源
  • 任务监控:监控任务执行状态

YARN 工作流程

  1. 应用提交:客户端提交应用程序
  2. 资源请求:AM 向 RM 请求资源
  3. 资源分配:RM 分配资源给 AM
  4. 容器启动:NM 启动容器执行任务
  5. 任务监控:AM 监控任务执行
  6. 应用完成:清理资源并报告结果

YARN 调度器

1. FIFO 调度器

  • 特点:先进先出,简单但不够灵活
  • 适用场景:单用户环境

2. Capacity 调度器

  • 特点:支持多队列,按容量分配资源
  • 适用场景:多用户共享集群

3. Fair 调度器

  • 特点:公平分配资源,支持动态调整
  • 适用场景:多用户、多应用环境

Hadoop 生态系统

数据存储组件

1. HBase

  • 特点:分布式列族数据库
  • 适用场景:实时读写、随机访问
  • 架构:基于 HDFS,支持水平扩展

2. Hive

  • 特点:数据仓库软件,SQL 接口
  • 适用场景:离线数据分析、数据挖掘
  • 优势:降低学习成本,提高开发效率

数据处理组件

1. Spark

  • 特点:内存计算,比 MapReduce 快 10-100 倍
  • 适用场景:批处理、流处理、机器学习
  • 优势:支持多种编程语言,丰富的 API

2. Flink

  • 特点:真正的流处理引擎
  • 适用场景:实时数据处理、复杂事件处理
  • 优势:低延迟、高吞吐量

数据采集组件

1. Flume

  • 特点:分布式日志收集系统
  • 适用场景:日志数据采集、数据传输
  • 架构:Agent、Collector、Storage

2. Sqoop

  • 特点:关系数据库与 Hadoop 之间的数据传输工具
  • 适用场景:数据导入导出、ETL 处理
  • 支持:MySQL、Oracle、PostgreSQL 等

数据可视化组件

1. Hue

  • 特点:Hadoop 用户界面
  • 功能:文件浏览、作业监控、SQL 查询
  • 优势:降低使用门槛,提高用户体验

Hadoop 安装配置

环境准备

1. 系统要求

  • 操作系统:Linux (CentOS、Ubuntu)
  • Java 版本:JDK 8 或更高版本
  • 内存要求:至少 4GB RAM
  • 磁盘空间:至少 10GB 可用空间

2. 网络配置

# 配置主机名
hostnamectl set-hostname hadoop-master

# 配置 hosts 文件
echo "192.168.1.100 hadoop-master" >> /etc/hosts
echo "192.168.1.101 hadoop-slave1" >> /etc/hosts
echo "192.168.1.102 hadoop-slave2" >> /etc/hosts

Hadoop 安装步骤

1. 下载 Hadoop

# 下载 Hadoop 3.3.4
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz

# 解压到指定目录
tar -xzf hadoop-3.3.4.tar.gz -C /opt/
mv /opt/hadoop-3.3.4 /opt/hadoop

2. 配置环境变量

# 编辑 ~/.bashrc
export HADOOP_HOME=/opt/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

3. 配置 Hadoop

core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop-master:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/hadoop/tmp</value>
    </property>
</configuration>

hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/opt/hadoop/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/opt/hadoop/datanode</value>
    </property>
</configuration>

mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop-master</value>
    </property>
</configuration>

4. 启动 Hadoop

# 格式化 NameNode
hdfs namenode -format

# 启动 HDFS
start-dfs.sh

# 启动 YARN
start-yarn.sh

# 检查服务状态
jps

Hadoop 实践案例

案例 1:日志分析系统

业务场景

分析 Web 服务器访问日志,统计:

  • 访问量最高的页面
  • 访问量最高的 IP 地址
  • 不同时间段的访问趋势

实现方案

1. 数据采集

# 使用 Flume 采集日志
agent.sources = r1
agent.sources.r1.type = spooldir
agent.sources.r1.spoolDir = /var/log/nginx
agent.sources.r1.channels = c1
agent.sinks = k1
agent.sinks.k1.type = hdfs
agent.sinks.k1.hdfs.path = /logs/nginx
agent.sinks.k1.channel = c1

2. 数据处理

// Map 阶段:解析日志行
public class LogMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    public void map(LongWritable key, Text value, Context context) {
        String line = value.toString();
        String[] fields = line.split(" ");
        String page = fields[6];  // 页面路径
        String ip = fields[0];   // IP 地址

        context.write(new Text(page), new IntWritable(1));
        context.write(new Text(ip), new IntWritable(1));
    }
}

// Reduce 阶段:统计访问次数
public class LogReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterable<IntWritable> values, Context context) {
        int sum = 0;
        for (IntWritable value : values) {
            sum += value.get();
        }
        context.write(key, new IntWritable(sum));
    }
}

案例 2:用户行为分析

业务场景

分析电商网站用户行为数据:

  • 用户购买偏好分析
  • 商品推荐算法
  • 用户流失预警

技术架构

数据源 → Kafka → Spark Streaming → HBase → 推荐系统

1. 实时数据处理

// Spark Streaming 处理用户行为数据
val stream = KafkaUtils.createDirectStream[String, String](
  ssc,
  LocationStrategies.PreferConsistent,
  ConsumerStrategies.Subscribe[String, String](topics, kafkaParams)
)

stream.map(record => {
  val userBehavior = parseUserBehavior(record.value())
  // 实时计算用户偏好
  calculateUserPreference(userBehavior)
}).foreachRDD(rdd => {
  // 存储到 HBase
  rdd.foreachPartition(partition => {
    saveToHBase(partition)
  })
})

案例 3:数据仓库建设

业务场景

构建企业级数据仓库:

  • 多源数据整合
  • 数据质量管控
  • 主题域建模

技术方案

1. 数据分层架构

ODS层 (原始数据层)
├── 用户行为数据
├── 订单交易数据
└── 商品信息数据

DWD层 (数据明细层)
├── 用户行为明细表
├── 订单明细表
└── 商品明细表

DWS层 (数据服务层)
├── 用户画像表
├── 商品画像表
└── 交易汇总表

ADS层 (应用数据层)
├── 用户推荐表
├── 商品推荐表
└── 营销活动表

2. 数据质量监控

-- 数据质量检查
SELECT
    'user_behavior' as table_name,
    COUNT(*) as total_records,
    COUNT(DISTINCT user_id) as unique_users,
    COUNT(CASE WHEN user_id IS NULL THEN 1 END) as null_users
FROM ods.user_behavior
WHERE dt = '2024-01-01';

Hadoop 最佳实践

1. 集群规划

硬件配置建议

组件CPU内存磁盘网络
NameNode4 核+8GB+SSD 100GB+千兆+
DataNode8 核+16GB+机械硬盘 2TB+千兆+
ResourceManager4 核+8GB+SSD 100GB+千兆+

集群规模规划

  • 小规模集群:3-10 节点,适合学习和测试
  • 中等规模集群:10-100 节点,适合中小企业
  • 大规模集群:100+ 节点,适合大型企业

2. 性能优化

HDFS 优化

<!-- hdfs-site.xml 优化配置 -->
<property>
    <name>dfs.blocksize</name>
    <value>268435456</value> <!-- 256MB -->
</property>
<property>
    <name>dfs.namenode.handler.count</name>
    <value>100</value>
</property>
<property>
    <name>dfs.datanode.handler.count</name>
    <value>10</value>
</property>

MapReduce 优化

<!-- mapred-site.xml 优化配置 -->
<property>
    <name>mapreduce.map.memory.mb</name>
    <value>2048</value>
</property>
<property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>4096</value>
</property>
<property>
    <name>mapreduce.map.java.opts</name>
    <value>-Xmx1638m</value>
</property>

3. 监控和运维

监控指标

HDFS 监控

  • NameNode 内存使用率
  • DataNode 磁盘使用率
  • 数据块复制状态
  • 文件系统健康状态

YARN 监控

  • ResourceManager 资源使用率
  • NodeManager 节点状态
  • 应用程序执行状态
  • 队列资源分配情况

运维工具

1. Ambari

  • 集群管理界面
  • 服务监控和告警
  • 配置管理
  • 日志查看

2. Cloudera Manager

  • 企业级集群管理
  • 性能监控
  • 故障诊断
  • 自动化运维

4. 安全配置

认证和授权

<!-- core-site.xml 安全配置 -->
<property>
    <name>hadoop.security.authentication</name>
    <value>kerberos</value>
</property>
<property>
    <name>hadoop.security.authorization</name>
    <value>true</value>
</property>

数据加密

<!-- hdfs-site.xml 加密配置 -->
<property>
    <name>dfs.encryption.key.provider.uri</name>
    <value>kms://http@kms-server:16000/kms</value>
</property>
<property>
    <name>hadoop.security.key.provider.path</name>
    <value>kms://http@kms-server:16000/kms</value>
</property>

5. 故障处理

常见问题及解决方案

1. NameNode 故障

# 检查 NameNode 状态
hdfs dfsadmin -report

# 恢复 NameNode
hdfs namenode -recover

# 检查元数据完整性
hdfs fsck /

2. DataNode 故障

# 检查 DataNode 状态
hdfs dfsadmin -report

# 重新平衡数据
hdfs balancer -threshold 10

# 检查数据块完整性
hdfs fsck / -blocks

3. 作业执行失败

# 查看作业日志
yarn logs -applicationId application_xxx

# 检查资源使用情况
yarn node -list

# 重启 ResourceManager
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh start resourcemanager

总结

Hadoop 作为大数据处理的核心技术,提供了完整的分布式存储和计算解决方案。通过合理配置和优化,可以构建高效、稳定的大数据处理平台。在实际应用中,需要根据业务需求选择合适的组件和架构,并持续进行性能调优和运维监控。

学习建议

  1. 理论学习:深入理解分布式系统原理
  2. 实践操作:搭建实验环境,动手实践
  3. 项目实战:参与实际项目,积累经验
  4. 持续学习:关注新技术发展,不断更新知识

相关资源

  • Apache Hadoop 官网
  • Hadoop 官方文档
  • Cloudera 学习资源
  • Hortonworks 文档
最近更新:: 2025/10/11 10:54
Contributors: Duke
Prev
大数据简介
Next
Flume 数据采集