Hadoop的HDFS命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/someby/article/details/82945672

HDFS用户命令指南

HDFS文件系统Shell命令

   Hadoop的三种命令形式

    hadoop fs ---适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
    hadoop dfs---只能适用于HDFS文件系统
    hdfs dfs---跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
    
    1.HDFS上存储的文件是以Block的方式存在的,一个文件的不同的Block具体存储在哪些Block机器上没有任何关系;
    2.主从结构
        主节点,只有一个:nameNode(HA下会有多个nameNode)
        从节点,有多个:dataNode
    nameNode负责:
        接受用户操作的请求
        维护文件系统的目录结构
        管理文件与Block之间的关系,Block与   DataNode之间的关系
    dataNode负责:
        存储文件
        文件被分成Block存储到磁盘上
        为保证数据安全,文件会有多个副本
    3.HDFS本身只是一套分布式数据存储的逻辑管理软件,时间上数据是分布式存储在具体的Linux机器的磁盘上且被HDFS管理;
    4.HDFS提供了分布式文件管理的众多的工具,例如hdfs fsck / 
    5.HDFS读取数据:Client向nameNode发起读数据的请求,nameNode会检索Client读取数据的元数据信息来决定第一个Block具体在哪些太机器上,并根据hadoop的机架感知策略等决定把哪个副本返回给Client读取,其实nameNode是返回了该副本的URL,接下来就是Client通过该URL建立InputStream进行数据的读取;后续Block按照同样的方式读取,以此类推;
    6.HDFS写入数据:此时客户端向nameNode发起写数据的请求,nameNode会决定第一个第一个Block及副本些在哪些台机器上,一般而言如果有三个副本,如果两个副本在同一个Rack,另外一个副本在其他机架上,但是实际上写入数据的时候Client只写入每个Block的第一个副本给HDFS,Client写入每个Block的第一个副本后,后续该Block的副本是在nameNode的管理下基于第一个副本的数据进行pipeline方式写入;

Java编程示例:

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

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

/**
 * FileName: HelloHDFS
 * Author:   hadoop
 * Email:    [email protected]
 * Date:     18-10-4 上午11:51
 * Description:
 */
public class HelloHDFS {
    public static void main(String[] args) throws IOException {
        String uri = "hdfs://Master:9000";
        Configuration config = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri),config);
        //列出hdfs上/usr/spark目录下的所有文件和目录
        FileStatus[] statuses = fs.listStatus(new Path("/"));
        for ( FileStatus status : statuses){
            System.out.println(status);
        }
        //在hdfs的/usr/spark目录中写入一个文件,并写入一个文本行
        FSDataOutputStream os = fs.create(new Path("/user/hadoop/test.log"));
        os.write("Hello World!".getBytes());
        os.flush();
        os.close();
        //显示在hdfs的//home/hadoop/test/test.log下的内容
        InputStream is = fs.open(new Path("/user/hadoop/test.log"));
        IOUtils.copyBytes(is,System.out,1024,true);
    }
}


    

猜你喜欢

转载自blog.csdn.net/someby/article/details/82945672