黑马程序员-大数据入门到实战-HDFS分布式存储

简介: 黑马程序员-大数据入门到实战-HDFS分布式存储

1. 为什么需要分布式存储

① 数据量太大,单机存储能力有上限,需要靠数量来解决问题

② 数量的提升带来的是网络传输,磁盘读写、CPU、内存等各方面的综合提升,分布式组合在一起可以达到1+1>2的效果

2. 分布式的基础架构分析

① 去中心化模式:没有明确中心,大家协调工作

② 中心化模式:有明确的中心,基于中心节点分配工作(Hadoop)

3. HDFS的基础架构

  • NameNode:主角色,管理HDFS集群和DataNode角色
  • DataNode:从角色,负责数据的存储
  • SecondaryNameNode:辅助角色,协助NameNode整理元数据

4. HDFS集群环境部署

4.1 VMware虚拟机中部署

4.1.1 集群规划

Hadoop HDFS 的角色

  • NameNode
  • DataNode
  • SecondaryNameNode

节点服务

  • node1:NameNode、DataNode、SecondaryNameNode
  • node2:DataNode
  • node3:DataNode

4.1.2 上传解压

  1. 上传Hadoop安装包到node1节点中
  1. 解压安装包到/export/server/中
tar -zxvf hadoop-3.3.6.tar.gz -C /export/server/
  1. 构建软链接
cd /export/server
ln -s /export/server/hadoop-3.3.6 hadoop
  1. 进入hadoop安装包内
cd hadoop

4.1.3 Hadoop安装包目录结构

  • bin:存放Hadoop的各类程序
  • etc:存放Hadoop的配置文件
  • sbin:管理员程序
  • lib:存放Linux系统的动态链接库(.so文件)
  • libexec:存放配置Hadoop系统的脚本文件(.sh和.cmd)

4.1.4 修改配置文件

配置HDFS集群,我们主要涉及如下文件的修改

  1. 配置workers文件
cd etc/hadoop  #进入配置文件目录
vim workers # 编辑workers文件
# 填入如下内容
node1
node2
node3
  1. 配置hadoop-env.sh文件
# 填入如下内容
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
  1. 配置core-site.xml文件
# 在文件内部填入如下内容
<configuration>
  <property>
    <name>fs.defaultFS</name> # HDFS文件系统的网络通讯路径
    <value>hdfs://node1:8020</value> 
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value> # io操作文件缓冲区大小
  </property>
</configuration>
  • hdfs://node1:8020为整个HDFS内部的通讯地址,应用协议为hdfs://(Hadoop内置协议)
  • 表明DataNode将和node1的8020端口通讯,node1是NameNode所在机器
  • 此配置固定了node1必须启动NameNode进程
  1. 配置hdfs-site.xml文件
# 在文件内部填入如下内容
<configuration>
  <property>
    <name>dfs.datanode.data.dir.perm</name>  # hdfs文件系统,默认创建的文件权限设置
    <value>700</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>    # NameNode元数据的存储位置
    <value>/data/nn</value>
  </property>
  <property>
    <name>dfs.namenode.hosts</name>     # NameNode允许哪几个节点的DataNode连接(即允许加入集群)
    <value>node1,node2,node3</value>
  </property>
  <property>
    <name>dfs.blocksize</name>     # hdfs默认块大小
    <value>268435456</value>
  </property>
  <property>
    <name>dfs.namenode.handler.count</name>    # namenode处理的并发线程数
    <value>100</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>   # 从节点DataNode的数据存储目录
    <value>/data/dn</value>
  </property>
</configuration>

4.1.5 准备数据目录

  1. 在node1节点:
mkdir -p /data/nn
mkdir /data/dn
  1. 在node2,node3节点:
mkdir -p /data/dn

4.1.6 分发Hadoop文件夹

  1. 分发
# 在node1执行如下命令
cd /export/server
scp -r hadoop-3.3.6 node2:`pwd`/
scp -r hadoop-3.3.6 node3:`pwd`/
  1. 在node2执行,为hadoop配置软链接
# 在node2执行如下命令
ln -s /export/server/hadoop-3.3.6 /export/server/hadoop
  1. 在node3执行,为hadoop配置软链接
# 在node3执行如下命令
ln -s /export/server/hadoop-3.3.6 /export/server/hadoop

4.1.7 配置环境变量

  1. vim /etc/profile
# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  1. 在node2和node3配置同样的环境变量

4.1.8 格式化整个文件系统

  1. 格式化namenode
# 确保以hadoop用户执行
su - hadoop
# 格式化namenode
hadoop namenode -format
  1. 启动
# 一键启动hdfs集群
start-dfs.sh
# 一键关闭hdfs集群
stop-dfs.sh
# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh

5. HDFS的Shell操作

5.1 进程启停管理

5.1.1 一键启停脚本

  1. 一键启动HDFS集群
$HADOOP_HOME/sbin/start-dfs.sh

执行原理:

  • 在执行此脚本的机器上,启动SecondaryNameNode
  • 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,启动NameNode
  • 读取workers内容,确认DataNode所在机器,启动全部DataNode
  1. 一键关闭HDFS集群
$HADOOP_HOME/sbin/stop-dfs.sh

执行原理:

  • 在执行此脚本的机器上,关闭SecondaryNameNode
  • 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,关闭NameNode
  • 读取workers内容,确认DataNode所在机器,关闭全部NameNode

5.1.2 单进程启停

单独控制所在机器的进程的启停

  1. $HADOOP_HOME/sbin/hadoop-daemon.sh
hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
  1. $HADOOP_HOME/bin/hdfs
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)

5.2 文件系统操作命令

  1. 创建文件夹
hadoop fs -mkdir [-p] <path>
hdfs dfs -mkdir [-p] <path>
  • -p:沿着路径创建父目录
  1. 查看指定目录下内容
hadoop fs -ls [-h] [-R] [<path> ....]
hdfs dfs -ls [-h] [-R] [<path> ....]
  • -h:人性化显示文件size
  • -R:递归查看指定目录及其子目录
  1. 上传文件到HDFS指定目录下
hadoop fs -put [-f] [-p] <localsrc> <dst>
hdfs dfs -put [-f] [-p] <localsrc> <dst>
  • -f:覆盖目标文件
  • -p:保留访问和修改时间,所有权和权限
  • localsrc:本地文件系统
  • dst:目标文件系统(HDFS)
  1. 查看HDFS文件内容
hadoop fs -cat <src> ....| more
hdfs dfs -cat <src> ....| more
  1. 下载HDFS文件
hadoop fs -get [-f] [-p] <src>....<localdst>
hdfs dfs -get [-f] [-p] <src>....<localdst>
  • -f:覆盖目标文件
  • -p:保留访问和修改时间
  1. 拷贝HDFS文件
hadoop fs -cp [-f] <src>....<dst>
hdfs dfs -cp [-f] <src>....<dst>
  • -f:覆盖目标文件
  1. 追加数据到HDFS文件中
hadoop fs -appendToFile <localsrc>....<dst>
hdfs dfs -appendToFile <localsrc>....<dst>
  1. HDFS数据移动操作
hadoop fs -mv <src>....<dst>
hdfs dfs -mv <src>....<dst>
  1. HDFS数据删除操作
hadoop fs -rm -f [-skipTrash] [URl..]
hdfs dfs -rm -f [-skipTrash] [URl..]
  • -skipTrash跳过回收站,直接删除

5.3 HDFS权限

5.4 HDFS 客户端

6. HDFS的存储原理

6.1 存储原理

6.2 fsck命令

6.2.1 HDFS副本块数量的配置

  • 在hdfs-site.xml中配置:
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>
  • 或者
hadoop fs -D dfs.replication=2 -put test.txt /tmp/

6.2.2 fsck命令检查文件的副本数

hdfs fsck path [-files [-blocks [-locations]]]

6.2.3 block配置

 <property>
    <name>dfs.blocksize</name>
    <value>268435456</value>
    <description>设置HDFS块大小,单位是b</description>
  </property>

6.3 NameNode元数据

6.4 HDFS数据的读写流程

6.4.1 数据写入流程

  1. 客户端向NameNode发起请求
  2. NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
  3. 客户端向指定的DataNode发送数据包
  4. 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode
  1. 如上图,DataNode1复制给DataNode2,然后基于DataNode2复制给Datanode3和DataNode4
  2. 写入完成客户端通知NameNode,NameNode做元数据记录工作

6.4.2 数据读取流程

  1. 客户端向NameNode申请读取某文件
  2. NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表
  3. 客户端拿到block列表后自行寻找DataNode读取即可
相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
11月前
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
231 2
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
11月前
|
存储 SQL 监控
数据中台架构解析:湖仓一体的实战设计
在数据量激增的数字化时代,企业面临数据分散、使用效率低等问题。数据中台作为统一管理与应用数据的核心平台,结合湖仓一体架构,打通数据壁垒,实现高效流转与分析。本文详解湖仓一体的设计与落地实践,助力企业构建统一、灵活的数据底座,驱动业务决策与创新。
|
12月前
|
人工智能 分布式计算 大数据
大数据≠大样本:基于Spark的特征降维实战(提升10倍训练效率)
本文探讨了大数据场景下降维的核心问题与解决方案,重点分析了“维度灾难”对模型性能的影响及特征冗余的陷阱。通过数学证明与实际案例,揭示高维空间中样本稀疏性问题,并提出基于Spark的分布式降维技术选型与优化策略。文章详细展示了PCA在亿级用户画像中的应用,包括数据准备、核心实现与效果评估,同时深入探讨了协方差矩阵计算与特征值分解的并行优化方法。此外,还介绍了动态维度调整、非线性特征处理及降维与其他AI技术的协同效应,为生产环境提供了最佳实践指南。最终总结出降维的本质与工程实践原则,展望未来发展方向。
636 0
|
11月前
|
数据采集 缓存 NoSQL
分布式新闻数据采集系统的同步效率优化实战
本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
478 1
分布式新闻数据采集系统的同步效率优化实战
|
12月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
3288 7
|
10月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
677 2
|
10月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
775 6
|
11月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
1801 0
分布式爬虫框架Scrapy-Redis实战指南

热门文章

最新文章