Hadoop的HDFS命令

本文详细介绍了HDFS的用户命令,包括不同形式的Hadoop命令及其使用场景,深入解析了HDFS的主从结构、数据存储机制及读写流程。同时,提供了Java编程示例,演示如何使用HDFS进行文件操作。

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:    3165845957@qq.com
 * 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);
    }
}


    

### Hadoop HDFS 命令使用教程 #### 文件上传与下载命令 为了将文件从本地文件系统传输至HDFS,可以采用`hadoop fs -put`命令[^3]。此命令不仅能够处理来自本地系统的文件,还能够在一定程度上兼容已经存在于HDFS中的同名文件路径的情况,倾向于优先选取HDFS内的资源作为源文件[^4]。 对于需要严格区分仅从本地文件系统向HDFS上传文件的需求来说,推荐使用`hadoop fs -copyFromLocal`命令来完成这一过程。该指令确保只针对本地文件执行上传动作而不涉及任何已位于HDFS内部的数据对象。 当要获取存储于HDFS上的数据并保存到本地磁盘时,可利用`hadoop fs -get`命令实现相反方向的数据转移操作[^1]。 ```bash # 将本地文件data.txt上传到HDFS指定目录下 $ hadoop fs -put /path/to/local/data.txt /user/hadoop/ # 从HDFS下载文件到当前工作目录 $ hadoop fs -get /user/hadoop/data.txt . ``` #### 文件管理命令HDFS环境中创建新目录可以通过简单的mkdir命令变体——即`hadoop fs -mkdir`—加以实现。这允许用户按照需求构建层次化的文件结构以便更好地管理和分类海量数据集。 移除不再需要的文件或整个目录树的操作可通过`hadoop fs -rm`以及带有递归选项参数形式的`hadoop fs -rmdir`来进行有效清理: ```bash # 删除单个文件 $ hadoop fs -rm /user/hadoop/oldfile.txt # 移除非空目录及其内容 $ hadoop fs -rm -R /user/hadoop/unwanted_directory/ ``` #### 数据迁移命令 要在HDFS的不同位置之间移动现有数据项,应该运用`hadoop fs -mv`命令来改变其所在的位置而无需实际重新传送二进制流[^2]。此外,在同一命名空间内复制文件副本的任务也可以借助类似的语法模式下的`hadoop fs -cp`功能达成目的。 ```bash # 在HDFS内部移动文件 $ hadoop fs -mv /source/path/file.dat /destination/path/ # 复制HDFS文件到另一处 $ hadoop fs -cp /original/location/* /new/copy/location/ ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值