AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

2020年5月26日_day08_Hadoop

HDFSjavaAPI操作

1.FileSystem类操作

package com.youyong.sevenclass.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsPermission;

import java.io.IOException;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 * Author: Amos
 * E-mail: amos@amoscloud.com
 * Date: 2020/5/23
 * Time: 14:24
 * Description:
 */
public class HDFSDemo1 {

    public static void main(String[] args) throws Exception {
        // 学一个组件或者框架,记住核心关键类

        //1.获取文件系统实例
        // 1.1 创建连接
        URI uri = URI.create("hdfs://bd0701:9000");
        // 1.2 创建配置对象
        Configuration conf = new Configuration();
        // 1.3 当前登陆的用户
        String user = "root";
        FileSystem fs = FileSystem.get(uri, conf, user);

        //2. 获取文件状态列表
        //创建一个容器用来拼接字符串
        StringBuilder sb = new StringBuilder();
        //创建一个日期格式化对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");

//        按照 hdfs dfs -ls 的格式打印文件列表
        //-rw-r--r--   3 root supergroup  218720521 2020-05-22 15:11 /hadoop-2.7.7.tar.gz
        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
        for (FileStatus fileStatus : fileStatuses) {
            sb.append(fileStatus.isFile() ? "-" : "d");
            FsPermission permission = fileStatus.getPermission();
            sb.append(permission.toString()).append("\t");
            sb.append(fileStatus.getReplication()).append("\t");
            sb.append(fileStatus.getOwner()).append("\t");
            sb.append(fileStatus.getGroup()).append("\t");
            sb.append(fileStatus.getLen()).append("\t");
            sb.append(sdf.format(new Date(fileStatus.getModificationTime()))).append("\t");
            sb.append(fileStatus.getPath().getParent().getName())
                    .append(fileStatus.getPath().getName())
                    .append("\n");
        }
        System.out.println(sb.toString());

//        //printf对输出语句进行格式化,前面写格式,后面传对象
//        System.out.printf("%s%s%s%s\t%d\t%s\t%s\t%d\t%s\t%s");

        //3. 文件上传
//        fs.copyFromLocalFile(false,
//                false,
//                new Path("C:/Users/Administrator/Desktop/hive-hbase-handler-1.2.2.jar"),
//                new Path("/"));
        //4. 文件下载

    }

}

2.IO操作

package com.youyong.sevenclass.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URI;

/**
 * Created with IntelliJ IDEA.
 * Author: Amos
 * E-mail: amos@amoscloud.com
 * Date: 2020/5/25
 * Time: 13:44
 * Description:
 */
public class HDFSDemo2 {
    public static void main(String[] args) throws Exception {
        //使用流操作hdfs的上传和下载

        Configuration conf = new Configuration();
        conf.set("dfs.replication", "2");
        FileSystem fs = FileSystem.get(URI.create("hdfs://bd0701:9000"), conf, "root");

        // hdfs上传文件
        //                         input        output
        // 本地文件系统/root/1.txt    -> java程序 ->   hdfs://xxx:xxx/1.txt
        //获取输入流
        FileInputStream fileInputStream = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\1.sql"));
        //获取输出流
        FSDataOutputStream fos = fs.create(new Path("/1.sql"), true);

        IOUtils.copyBytes(fileInputStream,fos,4096);
        fileInputStream.close();
        fos.close();

        // hdfs下载文件
        //                        input         output
        //  hdfs://xxx:xxx/1.txt    -> java程序 ->  本地文件系统/root/1.txt
        FSDataInputStream inputStream = fs.open(new Path("/1.sql"));
        FileOutputStream outputStream = new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\2.sql"));
        IOUtils.copyBytes(inputStream, outputStream, 4096);

        inputStream.close();
        outputStream.close();
    }
}

HDFS读写流程

file

file

nn和snn工作机制

file

  • namenode启动

    1. 第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
    2. 客户端对元数据进行增删改的请求
    3. namenode记录操作日志,更新滚动日志。
    4. namenode在内存中对数据进行增删改
  • Secondary NameNode工作

    1. Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
    2. Secondary NameNode请求执行checkpoint。
    3. namenode滚动正在写的edits日志
    4. 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
    5. Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
    6. 生成新的镜像文件fsimage.chkpoint
    7. 拷贝fsimage.chkpoint到namenode
    8. namenode将fsimage.chkpoint重新命名成fsimage

安全模式

  • Namenode启动时,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件和一个空的编辑日志。此时,namenode开始监听datanode请求。但是此刻,namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的。

  • 系统中的数据块的位置并不是由namenode维护的,而是以块列表的形式存储在datanode中。在系统的正常操作期间,namenode会在内存中保留所有块位置的映射信息。在安全模式下,各个datanode会向namenode发送最新的块列表信息,namenode了解到足够多的块位置信息之后,即可高效运行文件系统。

  • 如果满足“最小复本条件”,namenode会在30秒钟之后就退出安全模式。所谓的最小复本条件指的是在整个文件系统中99.9%的块满足最小复本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以namenode不会进入安全模式。

  • 集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。

hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
hdfs dfsadmin -safemode enter   (功能描述:进入安全模式状态)
hdfs dfsadmin -safemode leave   (功能描述:离开安全模式状态)
hdfs dfsadmin -safemode wait    (功能描述:等待安全模式状态)
模拟等待安全模式
hdfs dfsadmin -safemode enter
hdfs dfsadmin -safemode wait
hdfs dfs -put ~/hello.txt /root/hello.txt
hdfs dfsadmin -safemode leave

脚本查看jps进程

#!/bin/bash
# 指定当前脚本的解析器

# 在一台节点获取所有机器的java进程情况

hosts="bd0701 bd0702 bd0703"

for host in $hosts
do
    echo "--------当前是${host}的jps状态--------"
    ssh $host /opt/jdk1.8/bin/jps
done

You must be logged in to post a comment.