小言_互联网的博客

hadoop 分布式文件系统的部署

238人阅读  评论(0)

1. hadoop 文件系统的简介

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。

  1. Hadoop的框架最核心的设计就是:HDFS和MapReduce
    HDFS为海量的数据提供了存储。
    MapReduce为海量的数据提供了计算。

  2. Hadoop框架包括以下四个模块:
    Hadoop Common: 这些是其他Hadoop模块所需的Java库和实用程序。这些库提供文件系统和操作系统级抽象,并包含启动Hadoop所需的Java文件和脚本。
    Hadoop YARN: 这是一个用于作业调度和集群资源管理的框架。
    Hadoop Distributed File System (HDFS): 分布式文件系统,提供对应用程序数据的高吞吐量访问。
    Hadoop MapReduce:这是基于YARN的用于并行处理大数据集的系统。

优点

Hadoop是一个能够对大量数据进行分布式处理的软件框架。 Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理 。
Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理 。
Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度 。
Hadoop 还是可伸缩的,能够处理 PB 级数据 。
此外,Hadoop 依赖于社区服务,因此它的成本比较低,任何人都可以使用 。
Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。它主要有以下几个优点

  1. 高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。
  2. 高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中 。
  3. 高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快 。
  4. 高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配 。
  5. 低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低 。
    Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++ 。

Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。

HDFS属于Master与Slave结构。一个集群中只有一个NameNode,可以有多个DataNode。

HDFS存储机制保存了多个副本,当写入1T文件时,我们需要3T的存储,3T的网络流量带宽;系统提供容错机制,副本丢失或宕机可自动恢复,保证系统高可用性。

HDFS默认会将文件分割成block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,会导致内存的负担很重。

HDFS采用的是一次写入多次读取的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。

HDFS存储理念是以最少的钱买最烂的机器并实现最安全、难度高的分布式文件系统(高容错性低成本),HDFS认为机器故障是种常态,所以在设计时充分考虑到单个机器故障,单个磁盘故障,单个文件丢失等情况。

HDFS容错机制
节点失败监测机制:DN每隔3秒向NN发送心跳信号,10分钟收不到,认为DN宕机。
通信故障监测机制:只要发送了数据,接收方就会返回确认码。
数据错误监测机制:在传输数据时,同时会发送总和校验码。

2. 虚拟集群的搭建

官网 https://hadoop.apache.org/ 此处下载的是 3.2.1 的版本;

(1)创建用户 hadoop ,给创建的用户设定密码;

[root@server5 ~]# useradd hadoop			
##新建用户,以普通用户的身份去搭建 hadoop 平台
[root@server5 ~]# echo westos | passwd --stdin hadoop 
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.

(2)搭建平台
解压 jdk 的包,并做一个软链接,方便后面做升级;

[root@server5 ~]# su - hadoop 
[hadoop@server5 ~]$ ls
hadoop-3.2.1.tar.gz  jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ tar zxf jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ ls
hadoop-3.2.1.tar.gz  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ ln -s  jdk1.8.0_181 java		##软连接,以后升级做更改软连接即可
[hadoop@server5 ~]$ ls
hadoop-3.2.1.tar.gz  java  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ ll
total 532076
-rw-r--r-- 1 root   root   359196911 Apr 24 10:02 hadoop-3.2.1.tar.gz
lrwxrwxrwx 1 hadoop hadoop        12 Apr 24 10:02 java -> jdk1.8.0_181
drwxr-xr-x 7 hadoop hadoop       245 Jul  7  2018 jdk1.8.0_181
-rw-r--r-- 1 root   root   185646832 Apr 24 10:02 jdk-8u181-linux-x64.tar.gz

解压 hadoop 的包,并做一个软链接,方便后面做升级;

[hadoop@server5 ~]$ tar zxf hadoop-3.2.1.tar.gz 
[hadoop@server5 ~]$ ls
hadoop-3.2.1  hadoop-3.2.1.tar.gz  java  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ ln -s hadoop-3.2.1 hadoop
[hadoop@server5 ~]$ ls
hadoop  hadoop-3.2.1  hadoop-3.2.1.tar.gz  java  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz

修改配置文件

[hadoop@server5 ~]$ cd hadoop
[hadoop@server5 hadoop]$ ls
bin  etc  include  lib  libexec  LICENSE.txt  NOTICE.txt  README.txt  sbin  share
[hadoop@server5 hadoop]$ cd etc/hadoop/
[hadoop@server5 hadoop]$ vim hadoop-env.sh ##编辑环境脚本

配置 hadoop-env.sh 文件内容如图所示:

2.1 单机模式

安装单机模式的Hadoop无需配置,在这种方式下,Hadoop被认为是一个单独的Java进程,这种方式经常被用来调试

[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ bin/hadoop		   
	##检验环境,写入文件中的路径是否正确
[hadoop@server5 hadoop]$ mkdir input		##新建目录
[hadoop@server5 hadoop]$ cp etc/hadoop/*.xml input/	##导入测试文件
[hadoop@server5 hadoop]$ ls input/
capacity-scheduler.xml  hadoop-policy.xml  httpfs-site.xml  kms-site.xml     yarn-site.xml
core-site.xml           hdfs-site.xml      kms-acls.xml     mapred-site.xml
[hadoop@server5 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar 		##查看可以做那些计算
[hadoop@server5 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'		
	##运算,此时 output 目录不能存在,如果存在就会报错
此时很快,因为数据比较小,小数据量不建议用 hadoop ,小数据会浪费时间在网络等因素上。
[hadoop@server5 hadoop]$ cd output/		
##完成之后会生成该目录
[hadoop@server5 output]$ ls
part-r-00000  _SUCCESS
[hadoop@server5 output]$ cat *	##查看文件内容
1	dfsadmin

运行 Hadoop 自带算法 grep ,运行结束后匹配统计结果已经被写入了HDFS 的 output 目录下,output目录会被自动建立。

2.2 伪分布式

伪分布式 Hadoop 配置可以把伪分布式的 Hadoop 视为只有一个节点的集群;在这个集群中,这个节点既是 Master,又是 Slave;既是NameNode,又是DataNode;既是JobTracker,又是TaskTracker。

  1. 修改配置文件
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server5 hadoop]$ vim core-site.xml 
[hadoop@server5 hadoop]$ vim hdfs-site.xml 

修改配置文件 core-site.xml 内容如下图所示:

修改配置文件 hdfs-site.xml内容如下图所示:

  1. 做免密认证:
[hadoop@server5 ~]$ ssh-keygen
[hadoop@server5 ~]$ ssh-copy-id localhost
[hadoop@server5 ~]$ cd hadoop/etc/hadoop/
[hadoop@server5 hadoop]$ ll workers 	##这个里面默认定义的是存储结点(node)
-rw-r--r-- 1 hadoop hadoop 10 Sep 10  2019 workers
[hadoop@server5 hadoop]$ cat workers 
localhost
[hadoop@server5 hadoop]$ ssh localhost	##测试面密是否成功
Last login: Sat Apr 24 10:40:22 2021
[hadoop@server5 ~]$ exit
logout
Connection to localhost closed.
  1. 格式化,然后启动
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ bin/hdfs namenode -format		##格式化,默认的数据目录在/tmp
[hadoop@server5 hadoop]$ id
uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop)
[hadoop@server5 hadoop]$ ls /tmp/
hadoop  hadoop-hadoop  hadoop-hadoop-namenode.pid  hsperfdata_hadoop
[hadoop@server5 hadoop]$ sbin/start-dfs.sh 	##启动


格式化完成之后的效果如图所示,此时在 /tmp/ 中会生成 Hadoop 的数据 ;


启动之后便可以看到其端口等信息;

  1. 写入环境变量
    用命令 jps 可以查看到 Hadoop 是否启动成功;启动成功之后当前主机既是 NameNode,又是 DataNode;9000 端口也成功打开;
[hadoop@server5 hadoop]$ cd
[hadoop@server5 ~]$ vim .bash_profile 
[hadoop@server5 ~]$ source .bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/java/bin	##写入解析的目的是为了查看进程方便
[hadoop@server5 ~]$ jps
5234 Jps
4870 DataNode
4763 NameNode
5054 SecondaryNameNode

此时查过端口号之后,便可以在网页加端口号访问172.25.25.5:9870;

  1. Hadoop 基本命令及测试
    hadoop 中默认的块是 128M
    (1)上传
[hadoop@server5 hadoop]$ bin/hdfs dfs -ls	##列出用户的根目录
ls: `.': No such file or directory
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop	##创建以自己用户名称的目录
[hadoop@server5 hadoop]$ bin/hdfs dfs -ls		##此时没有报错
[hadoop@server5 hadoop]$ rm -fr output/
[hadoop@server5 hadoop]$ ls
bin  etc  include  input  lib  libexec  LICENSE.txt  logs  NOTICE.txt  README.txt  sbin  share
[hadoop@server5 hadoop]$ bin/hdfs dfs -put input		##上传


此时再次访问网页时便可看到上传到分布式文件系统的信息:

(2)下载

当分布式文件系统存在时,此时下载时时从分布式文件系统中获得的;此处删除本地的 input 目录来观察实验效果;
当删除本地的 input 目录之后,此时通过网页查看 Hadoop 内的资源,发现input目录依旧存在。
这里再次运行 Hadoop 自带算法 wordcount 来过滤单词;
运行结束后词频统计结果已经被写入了HDFS 的 output 目录下;

[hadoop@server5 hadoop]$ rm -fr input/
[hadoop@server5 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount input output
##用计算来统计数量,此时input目录不在会在分布式文件系统中去找,output 目录不能存在,output 也会在分布式文件系统中出现
[hadoop@server5 hadoop]$ bin/hdfs dfs -ls
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2021-04-30 11:20 input
drwxr-xr-x   - hadoop supergroup          0 2021-04-30 11:22 output

: hadoop 要求系统的结点时间要一致.


执行命令 bin/hdfs dfs -cat output/*查看词频统计结果;
执行命令 bin/hdfs dfs -get output下载数据;

[hadoop@server1 hadoop]$ bin/hdfs dfs -cat output/*
[hadoop@server1 hadoop]$ bin/hdfs dfs -get output	##下载



以上的集中方式,不管是网页查看,还是命令行的查看还是下载到本地文件系统,都是巍峨了查看文件内容;
分布式文件系统分块的意义是为了快速定位。

(3)删除

[hadoop@server1 hadoop]$ cd output/
[hadoop@server1 output]$ ls
part-r-00000  _SUCCESS
[hadoop@server1 hadoop]$ rm -fr output/*
[hadoop@server1 hadoop]$ bin/hdfs dfs -rm -r output
Deleted output

从网页也可以删除,但是默认是没有权限的。

2.3 完全分布式文件系统

Hadoop 的配置文件分为2类:

  • 只读类型的默认文件:src/core/core-default.xml、src/hdfs/hdfs-default.xml、src/mapred/mapred-default.xml

  • 定位设置:etc/hadoop/core-default.xml、etc/hadoop/hdfs-default.xml、etc/hadoop/mapred-default.xml

  • 除此之外,也可以通过设置 conf/Hadoop-env.sh来为Hadoop的守护进程设置环境变量(在bin目录中)

    在Hadoop的设置中,Hadoop的配置是通过资源定位的。每个资源由一系列name/value对以XML文件的形式构成,它以一个字符串命名或者是以Hadoop定义的Path类命名

集群中至少有三台主机来观察实验效果;
前面的操作方法和第一台雷同,新建用户,设定密码,写入解析。
此时,将 server5 作为NameNodeserver6server7作为DataNode.

(1)新建用户

[root@server6 ~]# useradd hadoop
[root@server6 ~]# echo westos | passwd --stdin hadoop 
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.
[root@server7 ~]# useradd hadoop
[root@server7 ~]# echo westos | passwd --stdin hadoop
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.

(2)关闭之前伪分布文件系统开启的进程

[hadoop@server5 hadoop]$ ls
bin  etc  include  input  lib  libexec  LICENSE.txt  logs  NOTICE.txt  output  README.txt  sbin  share
[hadoop@server5 hadoop]$ sbin/stop-dfs.sh 

(3)为了保证全平台数据一致性,此处在每台主机上安装 nfs ;

[root@server5 ~]# yum install -y nfs-utils.x86_64
[root@server6 ~]# yum install -y nfs-utils.x86_64
[root@server7 ~]# yum install -y nfs-utils.x86_64

在第一个用户上进行挂载需要写配置文件,将 /home/hadoop 目录共享出去;

[root@server5 ~]# vim /etc/exports
[root@server5 ~]# cat /etc/exports
/home/hadoop	*(rw,anonuid=1000,anongid=1000)
[root@server5 ~]# systemctl start nfs
[root@server5 ~]# showmount -e
Export list for server5:
/home/hadoop *


在其他结点上也将其挂载:

[root@server6 ~]# showmount -e 172.25.25.5
Export list for 172.25.25.5:
/home/hadoop *
[root@server6 ~]#  mount 172.25.25.5:/home/hadoop/ /home/hadoop/
[root@server6 ~]# su - hadoop
[hadoop@server6 ~]$ ls
hadoop  hadoop-3.2.1  hadoop-3.2.1.tar.gz  java  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz

[root@server7 ~]# showmount -e 172.25.25.5
Export list for 172.25.25.5:
/home/hadoop *
[root@server7 ~]#  mount 172.25.25.5:/home/hadoop/ /home/hadoop/
[root@server7 ~]# su - hadoop
[hadoop@server7 ~]$ ls
hadoop  hadoop-3.2.1  hadoop-3.2.1.tar.gz  java  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz

此时面密也已经自动好了; DataNode 挂载了server5 的/home/hadoop;在挂载的目录中就包含有 SSH 的公钥;只需要进行免密的验证即可

(4) Hadoop 集群的配置

  1. 配置Hadoop核心的配置文件
[hadoop@server5 hadoop]$ vim workers ##告诉 server6 和 server7 是 datanode
[hadoop@server5 hadoop]$ vim hdfs-site.xml ##此时有两个结点
[hadoop@server1 hadoop]$ vim core-site.xml ##解析文件中的域名


  1. 格式化
    删除之前伪分布式操作留下的临时数据,然后格式化再启动;
[hadoop@server5 hadoop]$ rm -fr /tmp/*
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ bin/hdfs namenode -format
[hadoop@server5 hadoop]$ sbin/start-dfs.sh 

启动之后在另外两个结点即可看到对应的信息;

[hadoop@server6 ~]$ jps
4032 Jps
3965 DataNode
[hadoop@server7 ~]$ jps
3905 DataNode
3966 Jps

此时文件系统就已经搭建完毕。

接下来做测试

  1. 生成一个文件
    生成一个200M的文件;该文件大于128M时会被分割成两个block;
[hadoop@server5 hadoop]$ dd if=/dev/zero of=bigfile bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 0.139584 s, 1.5 GB/s
[hadoop@server5 hadoop]$ bin/hdfs dfsadmin -report		##查看报告



也可以在网页中通过图形的方式来查看:

  1. 上传
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server5 hadoop]$ bin/hdfs dfs -put bigfile 

此时访问网页,发现存了2份,在两个节点上;

(5)热添加
再新建一个 server8 用来实现热更改.
和之前一样要下载 nfs ,写入解析,创建用户和密码;

[root@server8 ~]# yum install nfs-utils.x86_64 -y
[root@server8 ~]# vim /etc/hosts
[root@server8 ~]# useradd hadoop
[root@server8 ~]# echo westos | passwd --stdin hadoop
[root@server8 ~]# showmount -e 172.25.25.5
[root@server8 ~]#  mount 172.25.25.5:/home/hadoop/ /home/hadoop/
[root@server8 ~]# su - hadoop 
[hadoop@server8 ~]$ ls
hadoop  hadoop-3.2.1  hadoop-3.2.1.tar.gz  java  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz

完成之后,此时需要编辑配置文件来实现热添加;新添加的 server8 作为 DataNode 要写入 workers 文件中;

[hadoop@server8 ~]$ cd hadoop
[hadoop@server8 hadoop]$ jps 	##此时没改文件,可以看到没有添加上去
13648 Jps
[hadoop@server8 hadoop]$ vim workers
[hadoop@server8 hadoop]$ cat workers 
server6
server7
server8
[hadoop@server8 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server8 hadoop]$ bin/hdfs --daemon start datanode	##启动集群
[hadoop@server8 hadoop]$ jps
14107 Jps
14077 DataNode

以上启动过程在那个结点都可以,热添加;

此时在网页访问使便可以看到三个 datanode;


测试
模拟用户上传数据

不管是在slave 还是master 端操作都一样;此次在 server8 上上传数据来观察效果;
客户端将文件 kkk 分割成 2个block,分别交给指定的DataNode,DataNode复制保存block;

[hadoop@server8 hadoop]$ ls
bigfile  etc      lib      LICENSE.txt  NOTICE.txt  README.txt  share
bin      include  libexec  logs         output      sbin
[hadoop@server8 hadoop]$ mv bigfile kkk
[hadoop@server8 hadoop]$ bin/hdfs dfs -put kkk

此时 server8 即是一个数据结点又是一个客户端;

此时在网页中可以看到新上传的文件,三个节点之间是均匀分布的。
第一个副本一定会存放在当前。


转载:https://blog.csdn.net/weixin_54720351/article/details/116088193
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场