Contents

Hadoop基础

参考资料

  • 腾讯大数据技术文章:https://blog.csdn.net/dftgcdf45645466/article/details/89065714
  • Hadoop 安装参考:https://blog.csdn.net/hawkzy/article/details/83867384
  • JDK 下载参考:https://blog.csdn.net/weixin_43252521/article/details/119119646

概述

Hadoop 是一个开源的分布式计算解决方案,可编写和运行分布式应用,用于处理大规模数据。

Hadoop 由两大部分组成:

  • HDFS(Hadoop Distributed File System):分布式文件系统,负责数据存储
  • MapReduce:分布式数据处理框架,负责数据计算

核心特点

  • 适合离线场景大规模数据分析
  • 不适合对少量记录进行随机读写的在线事务处理场景
  • 在处理半结构化和非结构化数据时,比关系型数据库更加灵活
  • 所有数据最终都会转化为 key/value 形式,key/value 是基本数据单元

版本演进

Hadoop 1.0

版本号涵盖 0.20.x、0.21.x、0.22.x 和 1.x 系列。

核心架构:

  • HDFS:由一个 NameNode 和多个 DataNode 组成
  • MapReduce:由一个 JobTracker 和多个 TaskTracker 组成

Hadoop 2.0

版本号涵盖 0.23.x 和 2.x 系列。

针对 1.0 版本在扩展性和多框架支持方面的不足,引入了全新的资源管理框架 YARN

YARN 将 JobTracker 中的资源管理和作业控制功能分开,分别由以下组件实现:

  • ResourceManager:负责所有应用程序的资源分配
  • ApplicationMaster:仅负责管理一个应用程序

HDFS 详解

HDFS 全称为 Hadoop Distributed File System,基于 Google File System(GFS)设计。

基本特性

  • 保存大量数据,提供对分布在网络上的多个客户端的透明访问
  • 通过可靠、可扩展的方式存储大量文件
  • 通过块复制机制在集群中分发副本来确保可靠性
  • 默认复制因子为 3,每个块在集群中存在三份副本
  • 即使机器发生故障,块级复制也能保证数据可用性

节点架构

HDFS 集群的节点类型:

节点类型 角色 说明
NameNode master 存储文件系统的目录树、文件元数据和集群中每个文件的位置信息,将客户端指向正确的 DataNode
Secondary NameNode master 执行 NameNode 的内务任务并生成内存结构快照,降低数据丢失风险
DataNode worker 存储和管理本地磁盘上的 HDFS 块,向 NameNode 报告健康状况

注意:Secondary NameNode 虽然名字中有"Secondary",但它并不是 NameNode 的备份节点。

NameNode 和 DataNode 进程可以在一台机器上运行,但生产环境中通常使用一台运行 NameNode 的专用服务器加上数千台运行 DataNode 的机器组成集群。

生态系统与实际应用

Hive

Hive 是基于 Hadoop 的数据仓库工具,主要功能包括:

  • 数据提取、转化、加载(ETL)
  • 提供 SQL 查询功能
  • 将 SQL 语句转换为 MapReduce 任务执行

典型应用场景

  • Facebook 的日志分析
  • 淘宝搜索中的自定义筛选
  • Twitter、LinkedIn 的社交推荐(“可能认识的人"功能)
  • 天猫的商品推荐系统
  • 垃圾邮件识别和过滤
  • 用户特征建模

计算引擎演进

阶段 引擎 特点
第一代 MapReduce 笨重但稳定,Map 阶段各机器分别处理,Reduce 阶段汇总结果
第二代 Tez、Spark Map 和 Reduce 界限更模糊,数据交换更灵活,减少磁盘读写
SQL 层 Pig、Hive Pig 用接近脚本的方式描述 MapReduce,Hive 使用 SQL,翻译成 MapReduce 程序执行
高速查询 Impala、Presto、Drill 牺牲通用性和稳定性,换取更快的 SQL 处理速度
流式计算 Streaming 数据流进来时就处理,适合实时场景,无法替代批处理系统
调度系统 Yarn 中央管理器,是目前最流行的资源调度框架

工作原理示例

问题背景

假设有一个 100M 大小的数据库备份 SQL 文件,需要在不导入数据库的情况下过滤出想要的内容。

小规模数据处理方法

  1. 使用 Linux 的 grep 命令通过正则匹配
  2. 通过编程读取文件,对每行数据进行正则匹配

问题:如果是 1G、1T 甚至 1PB 的数据,上述方法就不适用了,因为单台服务器的性能有上限。

分布式计算解决方案

分布式计算的核心是利用分布式算法,将运行在单台机器上的程序扩展到多台机器上并行运行,使数据处理能力成倍增加。

Hadoop 的优势

  • 可以将多台廉价的 Linux PC 组成分布式集群
  • 编程人员只需根据 MapReduce 规则定义好接口方法
  • Hadoop 自动将计算分布到各个节点,并行执行

处理流程

  1. 把大量数据文件导入 HDFS
  2. 编程人员定义 map 和 reduce(文件的行定义为 key,内容定义为 value)
  3. Hadoop 将程序分布到 N 个节点并行处理
  4. 通过 reduce 聚合结果并返回

Windows 环境配置指南

安装环境

  1. Java 环境:JDK 版本不低于 1.8

    • 下载地址:https://www.oracle.com/java/technologies/downloads/#java8-windows
  2. Hadoop

    • 下载地址:http://archive.apache.org/dist/hadoop/core/
    • 示例版本:hadoop-3.2.3
    • Windows 环境还需要下载 winutils
  3. Spark(可选):

    • 下载地址:http://archive.apache.org/dist/spark/
    • 示例版本:spark-3.1.2-bin-hadoop3.2

环境变量配置

变量名 变量值示例 Path 添加内容
JAVA_HOME D:\java\jdk1.8 %JAVA_HOME%\bin%JAVA_HOME%\jre\bin
HADOOP_HOME D:\hadoop\hadoop-3.2.3 %HADOOP_HOME%\bin
SPARK_HOME D:\spark\spark-3.1.2-bin-hadoop3.2 %SPARK_HOME%\bin%SPARK_HOME%\sbin

Hadoop 配置文件修改

D:\hadoop\hadoop-3.2.3\etc\hadoop 目录下修改以下配置文件:

1. core-site.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:50000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/D:/hadoop/hadoop-3.2.3/tmp</value>
    </property>
</configuration>

2. hdfs-site.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/D:/hadoop/hadoop-3.2.3/data/dfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/D:/hadoop/hadoop-3.2.3/data/dfs/datanode</value>
    </property>

    <property>
        <name>dfs.http.address</name>
        <value>localhost:50070</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>localhost:50090</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.https-address</name>
        <value>localhost:50091</value>
    </property>
    <property>
        <name>dfs.datanode.socket.write.timeout</name>
        <value>6000000</value>
    </property>
    <property>
        <name>dfs.socket.timeout</name>
        <value>6000000</value>
    </property>
    <property>
        <name>dfs.datanode.max.transfer.threads</name>
        <value>8192</value>
    </property>
</configuration>

3. mapred-site.xml(由 mapred-site.xml.template 重命名得到)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>localhost:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>localhost:19888</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=/D:/hadoop/hadoop-3.2.3</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=/D:/hadoop/hadoop-3.2.3</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=/D:/hadoop/hadoop-3.2.3</value>
    </property>
</configuration>

4. yarn-site.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>localhost</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>

    <property>
        <name>yarn.application.classpath</name>
        <value>
            %HADOOP_HOME%\etc\hadoop,
            %HADOOP_HOME%\share\hadoop\common\*,
            %HADOOP_HOME%\share\hadoop\common\lib\*,
            %HADOOP_HOME%\share\hadoop\mapreduce\*,
            %HADOOP_HOME%\share\hadoop\mapreduce\lib\*,
            %HADOOP_HOME%\share\hadoop\hdfs\*,
            %HADOOP_HOME%\share\hadoop\hdfs\lib\*,
            %HADOOP_HOME%\share\hadoop\yarn\*,
            %HADOOP_HOME%\share\hadoop\yarn\lib\*
        </value>
    </property>
</configuration>

测试使用

  1. 格式化 NameNodehdfs namenode -format

    • 注意:格式化前需删除 D:\hadoop\hadoop-3.2.3\data\dfs\ 下两个文件夹的内容

    可能遇到的问题:
    https://blog.csdn.net/chasonsp/article/details/115349728
    https://blog.csdn.net/weixin_43718641/article/details/117907516
    https://zhuanlan.zhihu.com/p/140389153

  2. 启动 Hadoop:进入 sbin 目录,执行 start-all.cmd

    • 浏览器访问 http://localhost:8088/ 查看 Hadoop 启动情况
    • 浏览器访问 http://localhost:50070/ 查看 HDFS 状态
  3. HDFS 基本操作

操作 命令
创建目录 hdfs dfs -mkdir /user/input
上传文件 hdfs dfs -put e:/test.txt /user/input
查看文件 hdfs dfs -cat /user/input/test.txt
  1. 词频统计示例
1
2
3
4
5
6
7
hadoop jar D:/hadoop/hadoop-3.2.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.3.jar wordcount /user/input/ /user/output

查看运行结果
hdfs dfs -ls /user/output/

将输出复制到本地
hdfs dfs -get /user/output 本地路径
  1. 停止服务stop-all.cmd

常见问题

https://blog.csdn.net/superice_/article/details/102689227
https://jingyan.baidu.com/article/cdddd41cb0d76f53ca00e144.html

问题 1:Windows 用户名包含中文导致权限错误

  • 解决方案:打开控制面板更改账户名称,或使用 netplwiz 命令修改

Windows 修改用户名:
1、打开控制面板,点击用户账户下的更改账户类型,里面可以更改账户名称
2、然后需要修改 User 目录下的用户目录,有些麻烦,要小心注意1
3、cmd 输入 netplwiz,双击用户名进行修改,电脑需要重启

5、停止服务
D:\hadoop\hadoop-3.2.3\sbin\stop-all.cmd

问题 2:缺少 Group Policy Client 扩展

  • 可通过执行以下批处理脚本解决:
1
2
3
4
5
6
@echo off
pushd "%~dp0"
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt
for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
pause

https://blog.csdn.net/qq_36470475/article/details/115670312

拓展与后续学习建议

  1. 深入 Spark:学习 Spark 的 RDD 编程模型、DataFrame 和 Dataset API,以及 Spark SQL 的使用
  2. Hadoop 集群部署:了解生产环境中 Hadoop 集群的规划和部署,包括 NameNode HA、ResourceManager HA 等高可用方案
  3. 数据处理工具:学习 Pig、Hive、Impala 等上层工具,根据场景选择合适的查询引擎
  4. 流式计算:了解 Kafka + Flink/Spark Streaming 的实时数据处理架构
  5. 安全机制:学习 Hadoop 的安全机制,包括 Kerberos 认证、HDFS 权限控制等