黑马程序员-大数据入门到实战-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节点中
  2. 解压安装包到/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

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

6.4.2 数据读取流程

2

  1. 客户端向NameNode申请读取某文件
  2. NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表
  3. 客户端拿到block列表后自行寻找DataNode读取即可

猜你喜欢

转载自blog.csdn.net/m0_68111267/article/details/131734908