(四)数据存储——HDFS

烂漫一生 提交于 2019-12-23 00:24:34

Hadoop概述

引言

Hadoop: 适合大数据的分布式存储和计算平台
Hadoop不是指具体一个框架或者组件,它是Apache软件基金会下用Java语言开发的一个开源分布式计算平台。实现在大量计算机组成的集群中对海量数据进行分布式计算。适合大数据的分布式存储和计算平台。
Hadoop1.x中包括两个核心组件:MapReduce和Hadoop Distributed File System(HDFS)
其中HDFS负责将海量数据进行分布式存储,而MapReduce负责提供对数据的计算结果的汇总。

Hadoop生态圈

Hadoop生态圈

HDFS概述

引言

Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File System)。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。

HDFS架构

架构图

架构图

NameNode:存储系统的元数据(用于描述数据的数据),例如:文件的命名空间、block到DataNode的映射,负责管理DataNode。
DataNode:用于存储数据的节点,负责相应客户端读写请求,向NameNode汇报块信息。
Block:数据块,是对文件拆分的最小单元,表示一个默认为128MB的切分尺度,每个数据块副本默认为3,通过dfs.replication进行配置,并且用户可以通过dfs.blocksize设置块的大小。
rack:机架,使用机架对存储节点做物理编排,用于优化存储和计算。

HDFS写数据流程

写数据流程

HDFS读数据流程

读数据流程

NameNode工作机制

namenode工作机制

关于Block块

  • 大小为什么是128M?

答:在hadoop1.X上为64MB(因为工业限制)。硬件限制:廉价PC机械硬盘速度慢;软件优化:通常认为最佳状态为:寻址时间为传输时间的100分之一。

  • Block块的大小能够随意设置吗?

答:不能。如果block块的设置过小,则集群中几百万个小文件的寻址时间会增加很多,效率低下。如果太大,会造成存取时间过长,效率仍然很低。

机架感知

在默认副本因子为3的情况下,第一个副本存储子在本地机架的本地机器上,第二个存储在本地机架上的其他节点上面,第三个存储在除本地机架以外的其他节点上。(总之,1/3的文件副本在某个节点上,2/3的文件副本在本地机架上,另外的1/3在其他机架上均分)

SecondaryNameNode和NameNode的关系

NN和2NN的关系

FSImage:元数据信息的备份,会被加载到内存中。
Edits:Edits文件帮助记录文件增加和更新的操作,提高效率。
NameNode在启动的时候需要加载Edits和FSImage文件,所以在第一次启动的时候需要格式化NameNode。
当用户上传或下载文件的时候,会将记录写入edits文件中,(edits+FSImage=Metadata),所以当用户一致操作时,edits会越来越大,导致下次启动时会变慢。未来解决这个问题,可以将edits和FSImage文件进行合并,但是NameNode不能自己合并元数据,合并元数据的任务交给SecondaryNameNode。注意:在SecondaryNameNode进行edits和FSImage合并期间,客户端新的操作请求会写入一个叫edits-inprogress文件中,等到合并完成,edits-inprogress会更名为当前系统的edits文件。

检查节点机制

默认情况下,secondarynamenode每隔一小时创建检查点,此外如果上一个检查点开始编辑日志的大小已经达到了100万个事务,那么及时不到一小时,也会创建检查点,检查频率为每60秒一次。

#两个连续检查点之间的最大延迟
<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
  <description>The number of seconds between two periodic checkpoints.
  </description>
</property>

#非检查点的事务数
<property>
  <name>dfs.namenode.checkpoint.txns</name>
  <value>1000000</value>
  <description>The Secondary NameNode or CheckpointNode will create a checkpoint
  of the namespace every 'dfs.namenode.checkpoint.txns' transactions, regardless
  of whether 'dfs.namenode.checkpoint.period' has expired.
  </description>
</property>

安全模式

HDFS在启动的时候会默认开启安全模式,当等待发现绝大多数的Block可用的时候,会自动退出安全模式。安全模式是HDFS的只读模式,但是显式的将HDFS至于安全模式,使用 hdfs dfsadmin -safemode 命令即可。

# 开启安全模式
[root@HadoopNode00 ~]# hdfs  dfsadmin -safemode enter
# 关闭安全模式
[root@HadoopNode00 ~]# hdfs  dfsadmin -safemode leave

为什么说HDFS不擅长存储小文件?

因为NameNode使用的是单机存储元数据,如果存储过多的小文件,会导致内存紧张。

HDFS安装

1. 安装环境

  • Linux操作系统
  • JDK1.8
  • 配置主机名和IP的映射关系
# vi /etc/sysconfig/network     # 配置主机名,如果之前没有配置  记得重启
  • 关闭防火墙
 service iptables stop  	# 关闭防火墙
 chkconfig iptables off 	# 关闭防火墙自启
  • 配置SSH免登录
# ssh-keygen -t rsa    # 生成公私玥
# ssh-copy-id HadoopNode00  # 复制Hadoopnode00的公钥

2. 安装+配置Hadoop&HDFS

  • 解压
# tar -zxvf hadoop-2.6.0.tar.gz -C /home/hadoop/
  • 配置Hadoop环境变量
[root@HadoopNode00 ~]# vi .bashrc
export HADOOP_HOME=/home/hadoop/hadoop-2.6.0
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
[root@HadoopNode00 ~]# source .bashrc

HADOOP_HOME环境变量被第三方所依赖, 如HBase、Hive、Flume、Spark 在集成Hadoop的时候,是通过读取HADOOP_HOME环境确定hadoop的位置

  • 配置core-site.xml vim etc/hadoop
<configuration>
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://HadoopNode00:9000</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/home/hadoop/hadoop-2.6.0/hadoop-${user.name}</value>
</property>
</configuration>
  • 配置hdfs-site.xml vim etc/hadoop
<configuration>
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>
</configuration>

3. 启动HDFS

# 如果是第一次启动
[root@HadoopNode00 ~]# hdfs namenode -format   # 格式化namenode
# start-dfs.sh   # 启动hdfs
# stop-dfs.sh  # 关闭hdfs

访问:your.host.name:50070 可以在web界面看到相关信息

HDFS的使用

基础命令

使用基本同linux命令,下面列举一些常用命令:

[root@HadoopNode00 ~]# hadoop fs -put 1.txt 
[root@HadoopNode00 ~]# hadoop fs -get /1.txt /root/2.txt
[root@HadoopNode00 ~]# hadoop fs -ls
[root@HadoopNode00 ~]# hadoop fs -cp /1.txt /2.txt
[root@HadoopNode00 ~]# hadoop fs -mkdir /baizhi
[root@HadoopNode00 ~]# hadoop fs -moveFromLocal 1.txt.tar.gz /
[root@HadoopNode00 ~]# hadoop fs -copyToLocal  /1.txt /root/3.txt
[root@HadoopNode00 ~]# hadoop fs -rm -r -f /1.txt
[root@HadoopNode00 ~]# hadoop fs -rmdir /baizhi
[root@HadoopNode00 ~]# hadoop fs -cat /2.txt
[root@HadoopNode00 ~]# hadoop fs -tail -f /2.txt
[root@HadoopNode00 ~]# hadoop fs -appendToFile  1.txt /2.txt

回收站机制

core-site.xml ,改完重启

<property>
  <name>fs.trash.interval</name>
  <value>1</value>
 </property>

Windows上权限不足解决方案

  1. 方案1
//在代码中加上下列系统设置参数
System.setProperty("HADOOP_USER_NAME","root");
  1. 方案2
//为虚拟机机上-D 参数
-DHADOOP_USER_NAME=root
  1. 方案3
    hdfs-site.xml,关闭权限检查
<property>
  <name>dfs.permissions.enabled</name>
  <value>false</value>
  <description>
    If "true", enable permission checking in HDFS.
    If "false", permission checking is turned off,
    but all other behavior is unchanged.
    Switching from one parameter value to the other does not change the mode,
    owner or group of files or directories.
  </description>
</property>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!