• Hadoop源码解析


    Hadoop源码解析

    第0章 RPC通信原理解析

    0)回顾

    在这里插入图片描述

    1)需求: 模拟RPC的客户端、服务端、通信协议三者如何工作的!

    在这里插入图片描述

    2)代码编写:
    (1)在HDFSClient项目基础上创建包名com.atguigu.rpc
    (2)创建RPC协议

    package com.atguigu.rpc;
    
    public interface RPCProtocol {
    
        long versionID = 666;
    
        void mkdirs(String path);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (3)创建RPC服务端

    package com.atguigu.rpc;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    import org.apache.hadoop.ipc.Server;
    
    import java.io.IOException;
    
    //实现通讯接口
    public class NNServer implements RPCProtocol{
    
        @Override
        public void mkdirs(String path) {
            System.out.println("服务端,创建路径" + path);
        }
    
        public static void main(String[] args) throws IOException {
    	//启动服务
            Server server = new RPC.Builder(new Configuration())
                    .setBindAddress("localhost")
                    .setPort(8888)
                    .setProtocol(RPCProtocol.class)
                    .setInstance(new NNServer())
                    .build();
    
            System.out.println("服务器开始工作");
    
            server.start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    (4)创建RPC客户端

    package com.atguigu.rpc;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    
    public class HDFSClient {
    
        public static void main(String[] args) throws IOException {
            RPCProtocol client = RPC.getProxy(
                    RPCProtocol.class,
                    RPCProtocol.versionID,
                    new InetSocketAddress("localhost", 8888),
                    new Configuration());
    
            System.out.println("我是客户端");
    
            client.mkdirs("/input");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3)测试

    (1)启动服务端 观察控制台打印:服务器开始工作 在控制台Terminal窗口输入,jps,查看到NNServer服务
    (2)启动客户端 观察客户端控制台打印:我是客户端 观察服务端控制台打印:服务端,创建路径/input

    4)总结
    RPC的客户端调用通信协议方法,方法的执行在服务端;
    通信协议就是接口规范。
    RPC使用的是netty框架底层是socket

    第1章 NameNode启动源码解析

    在这里插入图片描述

    在这里插入图片描述

    在pom.xml中增加如下依赖

    
    	
    		org.apache.hadoop
    		hadoop-client
    		3.1.3
    	
    
    	
    		org.apache.hadoop
    		hadoop-hdfs
    		3.1.3
    	
    
    	
    		org.apache.hadoop
    		hadoop-hdfs-client
    		3.1.3
    		provided
    	
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    点击两下shift,搜索NameNode选择hadoop-hdfs-3.1.3的依赖包

    在这里插入图片描述

    NameNode官方说明

    NameNode serves as both directory namespace manager and “inode table”
    for the Hadoop DFS. There is a single NameNode running in any DFS
    deployment. (Well, except when there is a second backup/failover
    NameNode, or when using federated NameNodes.) The NameNode controls
    two critical tables: 1) filename->blocksequence (namespace) 2)
    block->machinelist (“inodes”) The first table is stored on disk and is
    very precious. The second table is rebuilt every time the NameNode
    comes up. ‘NameNode’ refers to both this class as well as the
    ‘NameNode server’. The ‘FSNamesystem’ class actually performs most of
    the filesystem management. The majority of the ‘NameNode’ class itself
    is concerned with exposing the IPC interface and the HTTP server to
    the outside world, plus some configuration management. NameNode
    implements the ClientProtocol interface, which allows clients to ask
    for DFS services. ClientProtocol is not designed for direct use by
    authors of DFS client code. End-users should instead use the
    FileSystem class. NameNode also implements the DatanodeProtocol
    interface, used by DataNodes that actually store DFS data blocks.
    These methods are invoked repeatedly and automatically by all the
    DataNodes in a DFS deployment. NameNode also implements the
    NamenodeProtocol interface, used by secondary namenodes or rebalancing
    processes to get partial NameNode state, for example partial blocksMap
    etc.

    百度翻译(主要是懒): NameNode同时充当Hadoop DFS的目录命名空间管理器和“inode表”。
    在任何DFS部署中都有一个NameNode在运行。(存在第二个备份/故障转移NameNode或使用联合NameNodes时除外。)
    NameNode控制两个关键表:
    1)filename->blocksequence(名称空间)
    2) block->machinelist(“inodes”)第一个表存储在磁盘上,非常珍贵。每次出现NameNode时,都会重新生成第二个表。”“NameNode”既指此类,也指“NameNode服务器”。
    “FSNamesystem”类实际上执行大部分文件系统管理。“NameNode”类本身的大部分内容涉及将IPC接口和HTTP服务器公开给外部世界,以及一些配置管理。NameNode实现ClientProtocol接口,允许客户端请求DFS服务。
    ClientProtocol不是为DFS客户端代码的作者直接使用而设计的。最终用户应该改为使用文件系统类。NameNode还实现了DatanodeProtocol接口,由实际存储DFS数据块的Datanode使用。
    DFS部署中的所有DataNode都会反复自动调用这些方法。NameNode还实现NamenodeProtocol接口,由辅助namenodes或重新平衡过程使用,以获取部分NameNode状态,例如部分blocksMap

    在这里插入图片描述

    main方法中有个创建NameNode方法,进入

    在这里插入图片描述

    NameNode方法中new了一个NameNode对象

    在这里插入图片描述

    进入初始化方法

    在这里插入图片描述

    启动Http服务

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    一直往下走,找到启动的服务端口号是9870,这个端口号开启后,web页面hadoop102:9870才能打开

    在这里插入图片描述

    http服务开始启动

    在这里插入图片描述

    HttpServer2对象绑定了一些页面的相关操作和组件

    在这里插入图片描述

    进入加载镜像文件的方法

  • 相关阅读:
    编程题练习@9-5
    浅析RocketMQ-broker接收消息
    瑛字取名寓意及含义
    [附源码]计算机毕业设计JAVA“原创音乐爱好者”交流网站论文
    记录一次线下渗透电气照明系统(分析与实战)
    三、鼎捷T100月加权成本开账管理篇
    go skip list跳表实现之Redis为啥这么快之一的原因
    pyqt5:pandas 读取 Excel文件或 .etx 电子表格文件,并显示
    通过 Nginx 实现多机负载均衡
    微信小程序轮问题集合
  • 原文地址:https://blog.csdn.net/m0_67392182/article/details/126370092