zoukankan      html  css  js  c++  java
  • [BigData]关于Hadoop学习笔记第二天(PPT总结)(一)

    Plan:

    分布式文件系统与HDFS
    HDFS体系结构与基本概念
    HDFS的shell操作
    java接口及常用api
    HADOOP的RPC机制
    HDFS源码分析
    远程debug

    自己设计一分布式文件系统?

    Distributed File System

    1.数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统 。
    2.是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。
    3.通透性。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。
    4.容错。即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。
    5.分布式文件管理系统很多,hdfs只是其中一种。适用于一次写入多次查询的情况,不支持并发写情况,小文件不合适。
    HDFS的Shell
    1.调用文件系统(FS)Shell命令应使用 bin/hadoop fs 的形式。
    2.所有的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)

    3.大多数FS Shell命令的行为和对应的Unix Shell命令类似。
    HDFS fs命令
    -help [cmd]  //显示命令的帮助信息
    -ls(r) <path>  //显示当前目录下所有文件
    -du(s) <path>  //显示目录中所有文件大小
    -count[-q] <path>  //显示目录中文件数量
    -mv <src> <dst>  //移动多个文件到目标目录
    -cp <src> <dst>  //复制多个文件到目标目录
    -rm(r)  //删除文件(夹)
    -put <localsrc> <dst>  //本地文件复制到hdfs
    -copyFromLocal  //同put
    -moveFromLocal  //从本地文件移动到hdfs
    -get [-ignoreCrc] <src> <localdst>  //复制文件到本地,可以忽略crc校验
    -getmerge <src> <localdst>  //将源目录中的所有文件排序合并到一个文件中
    -cat <src>  //在终端显示文件内容
    -text <src>  //在终端显示文件内容
    -copyToLocal [-ignoreCrc] <src> <localdst>  //复制到本地
    -moveToLocal <src> <localdst>
    -mkdir <path>  //创建文件夹
    -touchz <path>  //创建一个空文件
    HDFS的Shell命令练习
    #hadoop fs -ls /  查看HDFS根目录
    #hadoop fs -mkdir /test 在根目录创建一个目录test

        #hadoop fs -mkdir /test1 在根目录创建一个目录test1

    #hadoop fs -put ./test.txt /test 
    或#hadoop fs -copyFromLocal ./test.txt /test

        #hadoop fs -get /test/test.txt .

       或#hadoop fs -getToLocal /test/test.txt .

    #hadoop fs -cp /test/test.txt /test1
    #hadoop fs -rm /test1/test.txt
    #hadoop fs -mv /test/test.txt /test1
    #hadoop fs -rmr /test1   
    HDFS架构
    NameNode
    DataNode
    Secondary NameNode
    HDFS Architecture
    元数据存储细节
     
    NameNode
    1.是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
    2.文件包括:
    ①fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。(hdfs-site.xml的dfs.name.dir属性)
    ②edits:操作日志文件。
    ③fstime:保存最近一次checkpoint的时间
    3.以上这些文件是保存在linux的文件系统中。
    NameNode的工作特点 
    1.Namenode始终在内存中保存metedata,用于处理“读请求”
    2.到有“写请求”到来时,namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回
    3.Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary namenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。
    SecondaryNameNode
    1.HA的一个解决方案。但不支持热备。配置即可。
    2.执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,替换旧的fsimage.
    3.默认在安装在NameNode节点上,但这样...不安全!
    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 
    1.fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。
    2.fs.checkpoint.size    规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。
     
     
    Datanode
    1.提供真实文件数据的存储服务。
    2.文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.

    dfs.block.size

    3.不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
    4.Replication。多复本。默认是三个。

    hdfs-site.xml的dfs.replication属性

    Shell命令练习:验证块大小
    1.方法:上传大于128MB的文件,观察块大小
    2.验证:使用 http://hadoop0:50070 观察

    HDFS的java访问接口——FileSystem

    •写文件 create
    •读取文件 open
    •删除文件delete
    •创建目录 mkdirs
    •删除文件或目录 delete
    •列出目录的内容 listStatus
    •显示文件系统的目录和文件的元数据信息 getFileStatus

     HDFS的FileSystem读取文件

        private static FileSystem getFileSystem() throws URISyntaxException,
                IOException {
            Configuration conf = new Configuration();
            URI uri = new URI("hdfs://hadoop240:9000");
            final FileSystem fileSystem = FileSystem.get(uri , conf);
            return fileSystem;
        }
        /**
         * 读取文件,调用fileSystem的open(path)
         * @throws Exception
         */
        private static void readFile() throws Exception {
            FileSystem fileSystem = getFileSystem();
            FSDataInputStream openStream = fileSystem.open(new Path("hdfs://itcast0106:9000/aaa"));
            IOUtils.copyBytes(openStream, System.out, 1024, false);
            IOUtils.closeStream(openStream);
        }

    HDFS的FileSystem目录

        /**
         * 创建目录,调用fileSystem的mkdirs(path)
         * @throws Exception
         */
        private static void mkdir() throws Exception {
            FileSystem fileSystem = getFileSystem();
            fileSystem.mkdirs(new Path("hdfs://itcast0106:9000/bbb"));
        }
        /**
         * 删除目录,调用fileSystem的deleteOnExit(path)
         * @throws Exception
         */
        private static void rmdir() throws Exception {
            FileSystem fileSystem = getFileSystem();
            fileSystem.delete(new Path("hdfs://itcast0106:9000/bbb"));
        }

    HDFS的FileSystem遍历目录

    /**
         * 遍历目录,使用FileSystem的listStatus(path)
         * 如果要查看file状态,使用FileStatus对象
         * @throws Exception
         */
        private static void list() throws Exception{
            FileSystem fileSystem = getFileSystem();
            FileStatus[] listStatus = fileSystem.listStatus(new Path("hdfs://itcast0106:9000/"));
            for (FileStatus fileStatus : listStatus) {
                String isDir = fileStatus.isDir()?"目录":"文件";
                String name = fileStatus.getPath().toString();
                System.out.println(isDir+"  "+name);
            }
        }

    FileSystem

    用户代码操作HDFS时,是直接调用FileSystem的子类完成的。

    Remote Procedure Call

    1.RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
    2.RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
    3.hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)。
    RPC示例
    public interface Bizable extends  VersionedProtocol{
        public abstract String hello(String name);
    }
    
    class Biz implements Bizable{
        @Override
        public String hello(String name){
            System.out.println("被调用了");
            return "hello "+name;
        }
    
        @Override
        public long getProtocolVersion(String protocol, long clientVersion)
                throws IOException {
            System.out.println("Biz.getProtocalVersion()="+MyServer.VERSION);
            return MyServer.VERSION;
        }
    }
    
    public class MyServer {
        public static int PORT = 3242;
        public static long VERSION = 23234l;
        
        public static void main(String[] args) throws IOException {
            final Server server = RPC.getServer(new Biz(), "127.0.0.1", PORT, new Configuration());
            server.start();
        }
    }
    
    public class MyClient {
        public static void main(String[] args) throws IOException {
            final InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", MyServer.PORT);
            final Bizable proxy = (Bizable) RPC.getProxy(Bizable.class, MyServer.VERSION, inetSocketAddress, new Configuration());
            final String ret = proxy.hello("吴超");
            System.out.println(ret);
            
            RPC.stopProxy(proxy);
        }
    }
    RPC调用流程
    ClientProtocol
    l是客户端(FileSystem)与NameNode通信的接口。
    DatanodeProtocol 
    l是DataNode与NameNode通信的接口
    NamenodeProtocol 
    l是SecondaryNameNode与NameNode通信的接口。
     
    HDFS读过程
    1.初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件
    2.FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。
    3.FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据。
    4.DFSInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端(client)
    5.当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
    6.当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。
    7.在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。
    8.失败的数据节点将被记录,以后不再连接。
    HDFS写过程 
    1.初始化FileSystem,客户端调用create()来创建文件
    2.FileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。
    3.FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。
    4.DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
    5.DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
    6.当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。
    7.如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。
     
    练习题
    1.练习shell命令
    2.在HDFS创建一个文本文件hadoop.test。内容自定;然后,用Java程序在本地终端打印hadoop.test文件内容
    3.用Java程序实现copyFromLocal
     
    思考题
    1.hdfs的组成部分有哪些,分别解释一下
    2.hdfs的高可靠如何实现
    3.hdfs的常用shell命令有哪些
    4.hdfs的常用java api有哪些
    5.请用shell命令实现目录、文件的增删改查
    6.请用java api实现目录、文件的增删改查
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
    简单几何(推公式) UVA 11646 Athletics Track
    简单几何(四边形形状) UVA 11800 Determine the Shape
    简单几何(求交点) UVA 11437 Triangle Fun
    计算几何模板
    简单几何(相对运动距离最值) UVA 11796 Dog Distance
    简单几何(求划分区域) LA 3263 That Nice Euler Circuit
    覆盖的面积 HDU
    Desert King 最小比率生成树 (好题)
    约会安排 (区间合并)毒瘤题
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/4566838.html
Copyright © 2011-2022 走看看