一起重新开始学大数据-hadoop篇-Day45-hdfs解析和zookeeper安装

一起重新开始学大数据-hadoop篇-Day45-hdfs解析和zookeeper安装

在这里插入图片描述


hadoop启动脚本


详细启动脚本介绍

第一种:全部启动集群所有进程
启动sbin/start-all.sh
停止:sbin/stop-all.sh
第二种:单独启动hdfs【web端口50070】和yarn【web端口8088】的相关进程
启动sbin/start-dfs.sh sbin/start-yarn.sh
停止:sbin/stop-dfs.sh sbin/stop-yarn.sh
每次重新启动集群的时候使用

第三种:单独启动某一个进程

启动hdfs:sbin/hadoop-daemon.sh start (namenode | datanode)

停止:hdfs:sbin/hadoop-daemon.sh stop (namenode | datanode)

启动yarn:sbin/yarn-daemon.sh start (resourcemanager | nodemanager)
停止:yarn:sbin/yarn-daemon.sh stop(resourcemanager | nodemanager)
用于当某个进程启动失败或者异常down掉的时候,重启进程

hdfs


hdfs Shell介绍

调用文件系统(FS)Shell命令应使用 bin/hdfs dfs -xxx 的形式。

所有的FS shell命令使用URI路径作为参数。

URI格式是scheme://authority/path。HDFS的scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。
例如:/parent/child可以表示成hdfs://namenode:namenodePort/parent/child,或者更简单的/parent/child(假设配置文件是namenode:namenodePort)
大多数FS Shell命令的行为和对应的Linux Shell命令类似。

调用文件系统(FS)Shell命令

应使用hdfs dfs -xxx 的形式

-ls 查看hdfs上目录,如 hdfs dfs -ls /
-put 将本地文件上传到hdfs,如hdfs dfs -put 本地文件路径 hdfs路径
-get 将hdfs文件下载到本地,如 hdfs dfs -get hdfs文件路径 本地文件路径
-mkdir在hdfs 上创建文件夹,如hdfs dfs -mkdir /test
-cp 将hdfs文件或目录复制 如 hdfs dfs -cp /test.txt /a/
-cat 查看hdfs上文件内容 如hdfs dfs -cat /test.txt

👉hdfs 命令大全链接

HDFS概述

  • 数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统 。

  • 是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。

  • 通透性。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。

-m容错。即使系统中有某些节点宕机,整体来说系统仍然可以持续运作而不会有数据损失【通过副本机制实现】。

  • 分布式文件管理系统很多,hdfs只是其中一种,不合适小文件。

HDFS架构

在这里插入图片描述

Namenode

NameNode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
文件包括:
  fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
  edits:操作日志文件,namenode启动后一些新增元信息日志。
  fstime:保存最近一次checkpoint的时间
以上这些文件是保存在linux的文件系统中。
  hdfs-site.xml的dfs.namenode.name.dir属性

secondary namenode的工作流程

  1. secondary通知namenode切换edits文件
  2. secondary从namenode获得fsimage和edits(通过http)
  3. secondary将fsimage载入内存,然后开始合并edits
  4. secondary将新的fsimage发回给namenode
  5. namenode用新的fsimage替换旧的fsimage

什么时候checkpiont

  • fs.checkpoint.period指定两次checkpoint的最大时间间隔,默认3600秒。

  • fs.checkpoint.size规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。
    在这里插入图片描述

DataNode

  • 提供真实文件数据的存储服务。

  • 文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。2.0以后HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.
      hdfs-site.xml中dfs.blocksize属性

  • 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间

  • Replication。多复本。默认是三个。
      hdfs-site.xml的dfs.replication属性

HDFS的Trash回收站

和Linux系统(桌面环境)的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,fs.trash.interval是在指在这个回收周期之内,文件实际上是被移动到trash的这个目录下面,而不是马上把数据删除掉。等到回收周期真正到了以后,hdfs才会将数据真正删除。默认的单位是分钟,1440分钟=60*24,刚好是一天。 配置:在每个节点(不仅仅是主节点)上添加配置 core-site.xml,增加如下内容
在这里插入图片描述

注意:如果删除的文件过大,超过回收站大小的话会提示删除失败
     需要指定参数 -skipTrash

FileSystem

fileSysterm是使用java代码操作hdfs的api接口

文件操作

  • create 写文件
  • open 读取文件
  • delete 删除文件

目录操作

  • mkdirs 创建目录

  • delete 删除文件或目录

  • listStatus 列出目录的内容

  • getFileStatus 显示文件系统的目录和文件的元数据信息

  • getFileBlockLocations 显示文件存储位置

实操

pom.xml导包

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.6</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
</dependency>

HdfsDemo.java

package hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.*;
public class HdfsDemo {
    FileSystem fs=null;
    @Before
    public void getconf() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://master:9000");
        fs = FileSystem.get(conf);
    }
    @Test
    public void create() throws IOException {
        FSDataOutputStream os=null;
        if (!fs.exists(new Path("/1.txt"))) {
            os = fs.create(new Path("/1.txt"));
        }else{
            os=fs.append(new Path("/1.txt"));
        }
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
        bw.write("hadoop hdfs mapreduce yarn");
        bw.close();
    }

    @Test
    public void readFile()throws Exception{
        FSDataInputStream is = fs.open(new Path("/1.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line=null;
        while ((line=br.readLine())!=null){
            System.out.println(line);
        }
        br.close();
        is.close();
    }
    @Test
    public void deleteFile() throws IOException {
        fs.delete(new Path("/1.txt"),true);
    }
    @Test
    public void mkdir() throws IOException {
        fs.mkdirs(new Path("/dir1/dir2"));
    }
    @Test
    public void deledir() throws IOException {
        fs.delete(new Path("/dir1/dir2"),true);
    }
    @Test
    public void listStatus() throws IOException {
        FileStatus[] fs1 = fs.listStatus(new Path("/"));
        for (FileStatus f : fs1) {
            if(f.isFile()){
                System.out.println(f);
            }else if (f.isDirectory()){
                FileStatus[] fileStatuses = fs.listStatus(f.getPath());
                for (FileStatus f1 : fileStatuses) {
                    System.out.println(f1);
                }
            }
        }
    }
    @After
    public void close() throws IOException {
        fs.close();
    }
}

Client读取多副本文件过程

在这里插入图片描述

RPC(Remote Procedure Call)

在这里插入图片描述

  • RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

  • RPC采用客户机(client)/服务器(server)模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

  • hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)。

HDFS中的单位block,packet,chunk

1、Block
文件上传前需要分块,这个块就是block,一般为128MB,当然你可以去改,不顾不推荐。因为块太小:寻址时间占比过高。块太大:Map任务数太少,作业执行速度变慢。它是最大的一个单位。

2、Packet
packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传数据的基本单位,默认64KB。

3、Chunk
chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Byte,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk写入packet的大小为516Byte。由此可见真实数据与校验值数据的比值约为128 : 1。(即64*1024 / 512)

例如,在client端向DataNode传数据的时候,HDFSOutputStream会有一个chunk buff,写满一个chunk后,会计算校验和并写入当前的chunk。之后再把带有校验和的chunk写入packet,当一个packet写满后,packet会进入dataQueue队列,其他的DataNode就是从这个dataQueue获取client端上传的数据并存储的。同时一个DataNode成功存储一个packet后之后会返回一个ack packet,放入ack Queue中。

HDFS读文件

在这里插入图片描述


读文件流程分析
1.首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例

2.DistributedFileSystem通过rpc获得文件的第一个block的locations,同一block按照副本数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面.

3.前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接。

4.数据从datanode源源不断的流向客户端。

5.如果第一块的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。

6.如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。

7.如果在读数据的时候,DFSInputStream和datanode的通讯发生异常,就会尝试正在读的block的排第二近的datanode,并且会记录哪个datanode发生错误,剩余的blocks读的时候就会直接跳过该datanode。DFSInputStream也会检查block数据校验和,如果发现一个坏的block,就会先报告到namenode节点,然后DFSInputStream在其他的datanode上读该block的镜像
8.该设计的方向就是客户端直接连接datanode来检索数据并且namenode来负责为每一个block提供最优的datanode,namenode仅仅处理block location的请求,这些信息都加载在namenode的内存中,hdfs通过datanode集群可以承受大量客户端的并发访问。
  

HDFS写文件

在这里插入图片描述

(注:写完数据,发送完成信号的时机取决于集群是强一致性还是最终一致性,强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报,HDFS一般情况下都是强调强一致性)


写文件流程分析
1.客户端通过调用DistributedFileSystem的create方法创建新文件

2.DistributedFileSystem通过RPC调用namenode去创建一个没有blocks关联的新文件,创建前,namenode会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,namenode就会记录下新文件,否则就会抛出IO异常.

3.前两步结束后会返回FSDataOutputStream的对象,与读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream.DFSOutputStream可以协调namenode和datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列data quene。

4.DataStreamer会去处理接受data queue,他先问询namenode这个新的block最适合存储的在哪几个datanode里,比如副本数是3,那么就找到3个最适合的datanode,把他们排成一个pipeline.DataStreamer把packet按队列输出到管道的第一个datanode中,第一个datanode又把packet输出到第二个datanode中,以此类推。

5.DFSOutputStream还有一个对列叫ack queue,也是由packet组成,等待datanode的收到响应,当pipeline中的所有datanode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
如果在写的过程中某个datanode发生错误,会采取以下几步:
    1) pipeline被关闭掉;
    2)为了防止丢包 ack queue里的packet会同步到data queue里;
    3)把产生错误的datanode上当前在写但未完成的block删掉;
    4)block剩下的部分被写到剩下的两个正常的datanode中;
    5)namenode找到另外的datanode去创建这个块的复制。当然,这些操作对客户端来说是无感知的。

6.客户端完成写数据后调用close方法关闭写入流
7.DataStreamer把剩余得包都刷到pipeline里然后等待ack信息,收到最后一个ack后,通知datanode把文件标示为已完成。

ZooKeeper


zk安装

1、上传安装包到master并解压
tar -xvf zookeeper-3.4.10.tar.gz -c /usr/local/soft

2、配置环境变量
vim /etc/profile

  export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.10
  export PATH=$PATH:$ZOOKEEPER_HOME/bin

  source /etc/profile

3、添加data文件目录,添加myid文件
cd /usr/local/soft/zookeeper-3.4.10/
mkdir zkdata
cd zkdata
touch myid
4、修改配置文件
cd conf
  ①配置文件重命名

cp zoo_sample.cfg zoo.cfg

  ②修改
vim zoo.cfg
  ③修改文件内容

dataDir=/usr/local/soft/zookeeper-3.4.10/zkdata

  ④增加

  server.0=master:2888:3888
  server.1=node1:2888:3888
  server.2=node2:2888:3888

配置参数详解
Server.A=B:C:D。
    A 是一个数字,表示第几台服务器;
    B 是这台服务器的 IP 地址;
    C 是这台服务器与集群中的 Leader 服务器交换信息的端口;
    D 表示当集群中的 Leader 服务器无法正常运行时,需要一个端口来重新进行选举,
选出一个新的 Leader 服务器,而这个端口就是用来执行选举时服务器相互通信的端口。
在集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,其中有一个数据就是 A
的值,Zookeeper 启动时读取此文件,并将里面的数据与 zoo.cfg 文件里面的配置信息进行比
较,从而判断到底是哪台服务器。

5、同步到其它节点
cd /usr/local/soft/

  scp -r zookeeper-3.4.10 node1:pwd
  scp -r zookeeper-3.4.10 node2:pwd

  配置node1和node2的环境变量
在这里插入图片描述

  在所有节点执行
  source /etc/profile

6、编辑/usr/local/soft/zookeeper-3.4.10/zkdata/myid

  master,node1,node2分别加上0,1,2

7、启动zk
zkServer.sh start 三台都需要执行

zkServer.sh status 查看状态

 通过jps可以查看zk的进程:QuorumPeerMain

 当有一个leader的时候启动成功

– —停止zk方式-----
zkServer.sh stop 一旦执行三台都需要执行

8、连接zk

  zkCli.sh
  参数:
  -server host:port
在这里插入图片描述

zk简析

zk 是一个目录结构 ,每个节点可以存数据,同时可以有子节点

zk shell

命令

 创建目录
create /test testData
create /test/a aData

 获取数据

get /test

ls /test

delete 只能删除没有子节点的节点

rmr /test 删除节点

重置zk

1、杀掉所有zk进程
kiil -9 pid

2、删除data目录下的version文件, 所有节点都要删除
rm -rf /usr/local/soft/zookeeper-3.4.10/zkdata/version-2

3、启动zk
zkServer.sh start

|
|
|
|

上一章-hadoop篇-Day44-Hadoop、hdfs概述架构简析,Hadoop集群搭建
下一章-hadoop篇-day46 Hdfs、yarn的HA,mapreduce(1)
|
|
|
|
|

听说长按大拇指👍会发生神奇的事情呢!好像是下面的画面,听说点过的人🧑一个月内就找到了对象的💑💑💑,并且还中了大奖💴$$$,考试直接拿满分💯,颜值突然就提升了😎,虽然对你好像也不需要,是吧,吴彦祖🤵!

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你的动作太慢了!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值