精华内容
下载资源
问答
  • 分布式文件系统HDFS大数据存储的一个简单介绍。不全的 是其中一部分
  • 大数据技术原理与应用 第三章 分布式文件系统HDFS 学习指南
  • 第2讲_分布式文件系统HDFS.pdf
  • 分布式文件系统HDFS

    2020-02-11 15:45:59
    hdfs相关概念 namenode包括fsimage和editlog组成。...datanode:将数据保存到linux文件系统即可,负责存和取。 至于块被放在哪个地方是由namenode构建清单,与datanode沟通。 如果只有fsimage则运行过...

    一、hdfs相关概念

    namenode包括fsimage和editlog组成。
    fsimage:保存系统文件树,记录块大小及组成文件的块、访问权限、文件的复制等级、修改和访问时间。
    editlog:记录对数据的增删改查等操作。
    datanode:将数据保存到linux文件系统即可,负责存和取。
    至于块被放在哪个地方是由namenode构建清单,与datanode沟通。

    • 如果只有fsimage则运行过慢,所以设置editlog。
    • editlog不断增大怎么解决,secondnamenode冷备份,某个阶段停止使用editlog,使用secondnamenode来操作。
      hdfs运行机制
      secondnamenode

    二、hdfs体系结构

    hdfs体系结构
    基于tcp/ip通信协议名称节点交互,客户端取数据通过RPC协议与数据节点远程交互。
    局限性:所有元数据都保存在名称节点的内存中,内存有上限;性能瓶颈,整个hdfs吞吐量受单个名称节点的限制;隔离问题,只有一个名称节点,一个命名空间,无法对不同应用进行隔离;单点故障,secondnamenode冷备份。在hdfs2.0中解决。

    三、hdfs存储原理

    hdfs存储原

    3.1.冗余保存的问题

    • 加快数据传输速度:当多个客户端同时访问时,可分别访问各节点的数据。
    • 易检查数据错误:参照。
    • 保证数据可靠性:当数据副本数小于设定副本,自动周期性恢复。
      ![hdfs优势](https://img-blog.csdnimg.cn/20200208130325979.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5iZW5nYW5n,size_16,color_FFFFFF,t_70
      hdfs文件副本存放策略
    • 1.集群内部发起请求,谁发起存给谁
    • 2.如果外部某个节点发起写数据请求,随机挑选磁盘不太满,cpu不太忙的节点存放第一个副本,第二个副本放在和第一个副本不同机架上,第三个副本放在第一个副本几机架上的其他节点上。第四个第五个等随机放。hdfs副本存放原则hdfs读取数据策略
    • 1.就近读取:调用API获取所属ji架的ID,从NameNode获取副本存放的位置,调用API获取机架ID,如果发现某个数据副本的机架ID与客户端ID相同,则就近获取,如果没有则随机选取一个副本读取。
    • 2.数据的错误恢复:当NameNode出错后,暂停一段时间,去SecondNameNode中去将相关元数据恢复。hdfs1.0是冷备份需要暂停服务,2.0热备份不存在暂停。如果数据节点宕机,则将其他节点数据复制。
    • 3.数据出现错误:存储时生成的块的校验码判断数据是否出错。

    四、hdfs数据的读写过程

    在这里插入图片描述

    4.1hdfs读取数据原理:

    在这里插入图片描述

    4.2hdfs写数据原理

    在这里插入图片描述

    hdfs编程实践

    在这里插入图片描述
    步骤一:新建java工程,拷贝hadoop-common jar包,将hadoop目录下的core-site.xml和hdfs-site.xml文件拷贝到eclipse工作目录的bin目录下。
    步骤二:判断hdfs文件系统下是否存在input.txt文件。
    在这里插入图片描述

    展开全文
  • 熟悉常用的HDFS操作 (1) 理解HDFS在Hadoop体系结构中的角色; (2) 熟练使用HDFS操作常用的Shell命令; (3) 熟悉HDFS操作常用的Java API。
  • 当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对他进行分区存储到若干台单独的计算机上,管理网络中跨多台计算机存储的文件系统称为分布式文件系统(Distributed FileSystem)。 Educo

    目录

    一、HDFS的基本操作

    1.HDFS的设计

    2.HDFS的常用命令

    二、HDFS-JAVA接口之读取文件

    1.FileSystem对象

    三、HDFS-JAVA接口之上传文件

    四、HDFS-JAVA接口之删除文件


    一、HDFS的基本操作

    1.HDFS的设计

    当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对他进行分区存储到若干台单独的计算机上,管理网络中跨多台计算机存储的文件系统称为分布式文件系统(Distributed FileSystem)。

    Educoder 分布式文件系统HDFS 实验总结 答案

    Hadoop自带一个称为HDFS的分布式文件系统,即(Hadoop Distributed FileSystem)。

    NameNode与DataNode:

    HDFS有两类节点来管理集群的数据,即一个namenode(管理节点)和多个datanode(工作节点)。namenode管理文件系统的命名空间,它维护着系统树及整棵树所有的文件和目录,这些信息以两个形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件,namenode也记录着每个文件中各个块所在的数据节点信息,但他并不永久保存块的位置信息,因为这些信息会在系统启动时根据节点信息重建。

    客户端(client)代表用户通过与namenode和datanode交互来访问整个系统。客户端提供一个类似POSIX(可移植操作系统界面)的文件系统结构,因此用户编程时无需指导namenode和datanode也可以实现功能。

    datanode是文件系统的工作节点,他们根据需要存储并检索数据块(blocks),并且定期向namenode发送他们所存储的数据块的列表。

     

    我们现在将咱们的大数据机房设想成一个大仓库,仓库很大,有一本账单记录着仓库所有货架的商品,每一个货架上都放了很多货物,不过这些货物有一个特点,即大小都一致,并且货架也有一个本货架的清单,记录着本货架的商品,每当货架中的货物有变动,这个清单也会一起变,并且还会记录在主清单中。 在这里,namenode就类似仓库的主账单(保存了所有货物的记录),datanode就像是货架的清单(保存了本货架的物品记录),每个货架上的每一个货物就是数据块,数据块的大小是固定的(默认是128M)。

     

    2.HDFS的常用命令

    新建目录:

    mkdir /develop
    mkdir /develop/input
    mkdir /develop/output

    上传文件至HDFS:

    touch helloworld.txt   #创建要上传的文件
    #上传文件命令格式:hadoop fs -put <上传的文件> <hdfs目录>
    hadoop fs -put helloworld.txt /usr/output

    查看上传到hdfs的文件:

    hadoop fs -cat /usr/output/helloworld.txt

    移动与删除:

    #列出hdfs中的目录和文件:
    hadoop fs -ls /user/hadoop
    hadoop fs -ls /
    #移动
    hadoop fs -mv /usr/output/helloworld.txt /
    #删除
    hadoop fs -rm /helloworld.txt
    #递归删除
    hadoop fs -rm -r /dir1  #hadoop fs -rmr /dir1  也可行

    其他常用命令:

    选项名称

    使用格式

    含义

    -ls

    -ls <路径>

    查看指定路径的当前目录结构

    -lsr

    -lsr <路径>

    递归查看指定路径的目录结构

    -du

    -du <路径>

    统计目录下个文件大小

    -dus

    -dus <路径>

    汇总统计目录下文件(夹)大小

    -count

    -count [-q] <路径>

    统计文件(夹)数量

    -mv

    -mv <源路径> <目的路径>

    移动

    -cp

    -cp <源路径> <目的路径>

    复制

    -rm

    -rm [-skipTrash] <路径>

    删除文件/空白文件夹

    -rmr

    -rmr [-skipTrash] <路径>

    递归删除

    -put

    -put <多个 linux 上的文件> <hdfs 路径>

    上传文件

    -copyFromLocal

    -copyFromLocal <多个 linux 上的文件><hdfs 路径>

    从本地复制

    -moveFromLocal

    -moveFromLocal <多个 linux 上的文件><hdfs 路径>

    从本地移动

    -getmerge

    -getmerge <源路径> <linux 路径>

    合并到本地

    -cat

    -cat <hdfs 路径>

    查看文件内容

    -text

    -text <hdfs 路径>

    查看文件内容

    -copyToLocal

    -copyToLocal [-ignoreCrc] [-crc] [hdfs 源路径] [linux 目的路径]

    从HDFS复制到本地

    -moveToLocal

    -moveToLocal [-crc] <hdfs 源路径> <linux目的路径>

    从HDFS移动到本地

    -mkdir

    -mkdir <hdfs 路径>

    创建空白文件夹

    -setrep

    -setrep [-R] [-w] <副本数> <路径>

    修改副本数量

    -touchz

    -touchz <文件路径>

    创建空白文件

    实验答案:

    start-dfs.sh #启动hadoop
    hadoop fs -mkdir /usr
    hadoop fs -mkdir /usr/output
    vim hello.txt #新建hello.txt后输入“HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。”
    hadoop fs -put hello.txt /usr/output
    hadoop fs -rm -r /user/hadoop
    hadoop fs -copyToLocal /usr/output/hello.txt /usr/local

    二、HDFS-JAVA接口之读取文件

    使用HDFS的Java接口进行文件的读写

     

    1.FileSystem对象

    假设在hdfs文件系统中存在/user/tmp/test.txt文件。然后我们编写读取该文件的代码:

    public sattic void main(String[] args){
        //uri
        URI uri = URI.create("hdfs://localhost:9000/user/tmp/test.txt");
        Configuration config = new Configuration();
        //通过uri和config对象构建fs对象
        FileSystem fs = FileSystem.get(uri, config);
        InputStream in = null;
        try {
            //通过open方法获取FSDataInputStream对象
            in = fs.open(new Path(uri));
            //输出数据
            IOUtils.copyBytes(in, System.out, 2048, false);
        } catch (Exception e) {
            IOUtils.closeStream(in);
        }
    }

    实验要求:

    使用FSDataInputStream获取HDFS的/user/hadoop/目录下的task.txt的文件内容,并输出,其中uri为hdfs://localhost:9000/user/hadoop/task.txt。

    实验答案:

    package step2;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    
    
    public class FileSystemCat {
        
        public static void main(String[] args) throws IOException {
            //请在Begin-End之间添加你的代码,完成任务要求。
            /********* Begin *********/
            URI uri = URI.create("hdfs://localhost:9000/user/hadoop/task.txt");
            Configuration config = new Configuration();
            FileSystem fs = FileSystem.get(uri, config);
            InputStream in = null;
            try{
                in = fs.open(new Path(uri));
                IOUtils.copyBytes(in,System.out, 2048, false);
            }catch(Exception e){
                IOUtils.closeStream(in);
            }
            /********* End *********/
        }
    }

    注意:在点击“测评”之前要先切换到命令行界面,然后输入start-dfs.sh命令启动hadoop。

    三、HDFS-JAVA接口之上传文件

    实验要求:

    • 在/develop/input/目录下创建hello.txt文件,并输入如下数据: 迢迢牵牛星,皎皎河汉女。 纤纤擢素手,札札弄机杼。 终日不成章,泣涕零如雨。 河汉清且浅,相去复几许? 盈盈一水间,脉脉不得语。 《迢迢牵牛星》
    • 使用FSDataOutputStream对象将文件上传至HDFS的/user/tmp/目录下,并打印进度。

    实验答案:

    命令行命令:

    start-dfs.sh
    mkdir -p /develop/input
    cd /develop/input
    vim hello.txt #新建该文件后然后输入题目要求的这首诗。
    hadoop fs -mkdir /user/tmp

    FileSystemUpload.java:

    package step3;
    
    
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    import java.io.File;
    
    import org.apache.hadoop.conf.Configuration;
    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 org.apache.hadoop.util.Progressable;
    
    
    public class FileSystemUpload {
        
        public static void main(String[] args) throws IOException {
            //请在 Begin-End 之间添加代码,完成任务要求。
            /********* Begin *********/
            File localPath = new File("/develop/input/hello.txt");
            String hdfsPath = "hdfs://localhost:9000/user/tmp/hello.txt";
            InputStream in = new BufferedInputStream(new FileInputStream(localPath));
            Configuration config = new Configuration();
            FileSystem fs = FileSystem.get(URI.create(hdfsPath),config);
            long fileSize = localPath.length() > 65535 ? localPath.length() / 65535 : 1;
            FSDataOutputStream out = fs.create(new Path(hdfsPath), new Progressable(){
                long fileCount = 0;
                public void progress(){
                    System.out.println("总进度"+(fileCount / fileSize) * 100 + "%");
                    fileCount++;
                }
            });
            
            IOUtils.copyBytes(in, out, 2048, true);
            
            /********* End *********/
        }
    }

    四、HDFS-JAVA接口之删除文件

    HDFS的API中提供了listStatus()方法来实现目录遍历的功能。

    使用FileSystem的delete()方法删除文件或目录。

    public boolean delete(Path f,boolean recursive)throws IOException

    如果f是一个文件或者空目录,那么recursive的值可忽略。而如果f是一个非空目录时,recursive设置为true时,该目录才能被删除,否则抛出异常。

    实验要求:

    在右侧代码区填充代码,实现如下功能:

    • 删除HDFS的/user/hadoop/目录(空目录);
    • 删除HDFS的/tmp/test/目录(非空目录);
    • 列出HDFS根目录下所有的文件和文件夹;
    • 列出HDFS下/tmp/的所有文件和文件夹。

    实验答案:

    命令行界面:

    start-dfs.sh

    FileSystemDelete.java:

    package step4;
    
    
    import java.io.IOException;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.FileUtil;
    import org.apache.hadoop.fs.Path;
    
    
    
    public class FileSystemDelete {
        
        public static void main(String[] args) throws IOException {
            //请在 Begin-End 之间添加代码,完成本关任务。
            /********* Begin *********/
            String uri = "hdfs://localhost:9000/";
            String path1 = "hdfs://localhost:9000/user/hadoop";
            String path2 = "hdfs://localhost:9000/tmp/test";
            Configuration config = new Configuration();
            FileSystem fs = FileSystem.get(URI.create(uri),config);
            fs.delete(new Path(path1),true);
            fs.delete(new Path(path2),true);
            Path[] paths = {new Path(uri),new Path("hdfs://localhost:9000/tmp")};
            FileStatus[] status = fs.listStatus(paths);
            Path[] listPaths = FileUtil.stat2Paths(status);
    
            for(Path path : listPaths){
                System.out.println(path);
            }
    
            /********* End *********/
        }
    }

    展开全文
  • 实验三 分布式文件系统HDFS第1关:HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNodeHDFS的常用命令编程要求测试说明代码实现第2关:HDFS-JAVA接口之读取文件任务描述相关知识FileSystem...

    第1关:HDFS的基本操作

    任务描述

    本关任务:使用Hadoop命令来操作分布式文件系统。

    相关知识

    为了完成本关任务你需要了解的知识有:1.HDFS的设计,2.HDFS常用命令。

    HDFS的设计

    点点点…题目省略,懒得写了,下同

    分布式文件系统

    NameNode与DataNode

    HDFS的常用命令

    编程要求

    在右侧命令行中启动Hadoop,进行如下操作。

    • 在HDFS中创建/usr/output/文件夹;
    • 在本地创建hello.txt文件并添加内容:“HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。”;
    • 将hello.txt上传至HDFS的/usr/output/目录下;
    • 删除HDFS的/user/hadoop目录;
    • 将Hadoop上的文件hello.txt从HDFS复制到本地/usr/local目录。

    测试说明

    平台会查看你本地的文件和HDFS的文件是否存在,如果存在,则会将其内容输出到控制台。

    预期输出:
    HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。
    HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。

    代码实现

    //一行一步
    start-dfs.sh
    hadoop fs -mkdir -p /usr/output
    mkdir -p /develop/input
    cd /develop/input
    touch hello.txt
    vim hello.txt
    按i键输入以下内容
    
    HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。
    
    hadoop fs -put hello.txt /usr/output/
    hadoop fs -rmr /user/hadoop
    cd
    mkdir -p /usr/local
    hadoop fs -copyToLocal /usr/output/hello.txt /usr/local
    

    第2关:HDFS-JAVA接口之读取文件

    任务描述

    本关任务:使用HDFS的Java接口进行文件的读写,文件uri地址为hdfs://localhost:9000/user/hadoop/task.txt。

    相关知识

    FileSystem对象

    FSDataInputStream对象

    编程要求

    在右侧代码编辑区中编写代码实现如下功能:

    • 使用FSDataInputStream获取HDFS的/user/hadoop/目录下的task.txt的文件内容,并输出,其中uri为hdfs://localhost:9000/user/hadoop/task.txt。

    测试说明

    点击评测,平台会通过脚本创建/user/hadoop/task.txt文件并添加相应内容,无需你自己创建,开启hadoop,编写代码点击评测即可。因为Hadoop环境非常消耗资源,所以你如果一段时间不在线,后台会销毁你的镜像,之前的数据会丢失(你的代码不会丢失),这个时候需要你重新启动Hadoop。

    预期输出:

    WARN [main] - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    怕什么真理无穷,进一寸有一寸的欢喜。
    

    第一行打印出来的是log4j的日志警告,可以忽略。

    代码实现

    1. 代码文件

    package step2;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    
    
    public class FileSystemCat {
    	
    	public static void main(String[] args) throws IOException {
    		//请在Begin-End之间添加你的代码,完成任务要求。
            //请按照左侧的编程要求进行编写代码
    		//文件地址为 "hdfs://localhost:9000/user/hadoop/task.txt"
            /********* Begin *********/
    		URI uri = URI.create("hdfs://localhost:9000/user/hadoop/task.txt");
            Configuration config = new Configuration();
            FileSystem fs = FileSystem.get(uri, config);
            InputStream in = null;
            try {
                 in = fs.open(new Path(uri));
                 IOUtils.copyBytes(in, System.out, 2048, false);
           } catch (Exception e) {
               IOUtils.closeStream(in);
    	   }
    		
    		
    		/********* End *********/
    	}
    }
    
    1. 命令行

    start-all.sh
    

    第3关:HDFS-JAVA接口之上传文件

    任务描述

    本关任务:使用HDFSAPI上传文件至集群。

    相关知识

    为了完成本关任务,你需要掌握:FSDataInputStream对象如何使用。

    FSDataOutputStream对象

    编程要求

    在右侧代码编辑区和命令行中,编写代码与脚本实现如下功能:

    在/develop/input/目录下创建hello.txt文件,并输入如下数据:
    迢迢牵牛星,皎皎河汉女。
    纤纤擢素手,札札弄机杼。
    终日不成章,泣涕零如雨。
    河汉清且浅,相去复几许?
    盈盈一水间,脉脉不得语。
    《迢迢牵牛星》

    使用FSDataOutputStream对象将文件上传至HDFS的/user/tmp/目录下,并打印进度。

    测试说明

    平台会运行你的java程序,并查看集群的文件将文件信息输出到控制台,第一行属于警告信息可以忽略。

    预期输出:
    Alt

    代码实现

    1. 代码文件

    package step3;
    
    
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    import java.io.File;
    
    import org.apache.hadoop.conf.Configuration;
    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 org.apache.hadoop.util.Progressable;
    
    
    public class FileSystemUpload {
    	
    	public static void main(String[] args) throws IOException {
    		//请在 Begin-End 之间添加代码,完成任务要求。
            /********* Begin *********/
    		File localPath = new File("/develop/input/hello.txt");
            String hdfsPath = "hdfs://localhost:9000/user/tmp/hello.txt";
            InputStream in = new BufferedInputStream(new FileInputStream(localPath));
            Configuration config = new Configuration();
            FileSystem fs = FileSystem.get(URI.create(hdfsPath), config);
            long fileSize = localPath.length() > 65536 ? localPath.length() / 65536 : 1; 
            FSDataOutputStream out = fs.create(new Path(hdfsPath), new Progressable() {
                long fileCount = 0;
                public void progress() {
                    System.out.println("总进度" + (fileCount / fileSize) * 100 + "%");
                    fileCount++;
                }
            });
            IOUtils.copyBytes(in, out, 2048, true);
    
    		/********* End *********/
    	}
    }
    
    
    1. 命令行

    //一行一步
    start-all.sh
    hadoop fs -mkdir -p /user/tmp  
    mkdir -p /develop/input
    cd /develop/input
    touch hello.txt
    vim hello.txt
    i
    迢迢牵牛星,皎皎河汉女。
    纤纤擢素手,札札弄机杼。
    终日不成章,泣涕零如雨。
    河汉清且浅,相去复几许?
    盈盈一水间,脉脉不得语。
    《迢迢牵牛星》
    Esc
    shift+:
    wq
    
    hadoop fs -put hello.txt /user/tmp/ 
    
    

    第4关:HDFS-JAVA接口之删除文件

    任务描述

    本关任务:删除HDFS中的文件和文件夹。

    相关知识

    为了完成本关任务,你需要掌握:1.如何使用API来删除文件,2.如何列出指定目录下的文件和文件夹。

    列出文件

    删除文件

    编程要求

    在右侧代码区填充代码,实现如下功能:

    1. 删除HDFS的/user/hadoop/目录(空目录);
    2. 删除HDFS的/tmp/test/目录(非空目录);
    3. 列出HDFS根目录下所有的文件和文件夹;
    4. 列出HDFS下/tmp/的所有文件和文件夹。

    测试说明

    HDFS的文件夹在你点击评测是会通过脚本自动创建,不需要你自己创建哦,依照题意编写代码点击评测即可。

    预期输出:
    Alt

    代码实现

    1. 代码文件

    package step4;
    
    
    import java.io.IOException;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.FileUtil;
    import org.apache.hadoop.fs.Path;
    
    
    
    public class FileSystemDelete {
    	
    	public static void main(String[] args) throws IOException {
    		//请在 Begin-End 之间添加代码,完成本关任务。
            /********* Begin *********/
    		String uri = "hdfs://localhost:9000/";
            String path1 = "hdfs://localhost:9000/tmp";
            String path2 = "hdfs://localhost:9000/user/hadoop"; 
            String path3 = "hdfs://localhost:9000/tmp/test"; 
            String path4 = "hdfs://localhost:9000/usr"; 
            Configuration config = new Configuration(); 
            FileSystem fs = FileSystem.get(URI.create(uri),config); 
            fs.delete(new Path(path2),true);
            fs.delete(new Path(path3),true);
            fs.delete(new Path(path4),true);
            Path[] paths = {new Path(uri),new Path(path1)}; 
            FileStatus[] status = fs.listStatus(paths);
            Path[] listPaths = FileUtil.stat2Paths(status);
            for(Path path: listPaths){
                System.out.println(path);
            }
    		
    		/********* End *********/
    	}
    }
    
    
    1. 命令行

    start-all.sh
    
    展开全文
  • 内容提要:首先介绍分布式文件系统的基本概念、结构和设计需求,然后介绍Hadoop分布式文件系统HDFS,详细阐述它的重要概念、体系结构、存储原理和读写过程,最后,介绍了一些HDFS编程实践方面的知识。
  • 分布式文件系统HDFS 接着前面的文章: (一)Ubuntu18.04,Hadoop3.1.3伪分布式环境搭建, (二)hadoop 分布式文件系统HDFS 这节是HDFS的实践。 实验环境: Ubuntu18.04 Hadoop3.1.3 文章目录分布式文件系统HDFS一...

    分布式文件系统HDFS

    接着前面的文章:
    (一)Ubuntu18.04,Hadoop3.1.3伪分布式环境搭建
    (二)hadoop 分布式文件系统HDFS


    这节是HDFS的实践。
    实验环境:
    Ubuntu18.04
    Hadoop3.1.3

    时间 
    2020-08

    在学习HDFS编程实践前,我们需要启动Hadoop。执行如下命令

    cd /usr/local/hadoop
    ./sbin/start-dfs.sh #启动hadoop
    

    一、利用Shell命令与HDFS进行交互

    Hadoop支持很多Shell命令,其中fs是HDFS最常用的命令,利用fs可以查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。

    1. hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
    2. hadoop dfs只能适用于HDFS文件系统
    3. hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
      在这里插入图片描述

    在终端输入如下命令,可以查看具体某个命令的作用
    例如:我们查看put命令如何使用,可以输入如下命令

    ./bin/hadoop fs -help put
     
    

    在这里插入图片描述

    1.目录操作

    需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。本教程全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:

    cd /usr/local/hadoop
    ./bin/hdfs dfs –mkdir –p /user/hadoop
    

    该命令中表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。
    如果要删除目录:

    hadoop fs -rm -r /user/hadoop
    

    在这里插入图片描述

    “/user/hadoop”目录就成为hadoop用户对应的用户目录,可以使用如下命令显示HDFS中与当前用户hadoop对应的用户目录下的内容:

     ./bin/hdfs dfs –ls .
    

    该命令中,“-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,也就是“/user/hadoop”目录,因此,上面的命令和下面的命令是等价的:

    ./bin/hdfs dfs –ls /user/hadoop
    

    如果要列出HDFS上的所有目录,可以使用如下命令:

    ./bin/hdfs dfs –ls
    

    下面,可以使用如下命令创建一个input目录:

     ./bin/hdfs dfs –mkdir input
    

    在创建个input目录时,采用了相对路径形式,实际上,这个input目录创建成功以后,它在HDFS中的完整路径是“/user/hadoop/input”。如果要在HDFS的根目录下创建一个名称为input的目录,则需要使用如下命令:

    ./bin/hdfs dfs –mkdir /input
    

    可以使用rm命令删除一个目录,比如,可以使用如下命令删除刚才在HDFS中创建的“/input”目录(不是“/user/hadoop/input”目录):

    ./bin/hdfs dfs –rm –r /input
    

    上面命令中,“-r”参数表示如果删除“/input”目录及其子目录下的所有内容,如果要删除的一个目录包含了子目录,则必须使用“-r”参数,否则会执行失败。

    2.文件操作

    在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。
    首先,使用vim编辑器,在本地Linux文件系统的“/home/hadoop/”目录下创建一个文件myLocalFile.txt,里面可以随意输入一些单词。
    然后,可以使用如下命令把本地文件系统的“/home/hadoop/myLocalFile.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop/input/”目录下:

    ./bin/hdfs dfs -put /home/hadoop/myLocalFile.txt  input
    

    可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:

    ./bin/hdfs dfs –ls input
    

    该命令执行后会显示类似如下的信息:

    下面使用如下命令查看HDFS中的myLocalFile.txt这个文件的内容:

    ./bin/hdfs dfs –cat input/myLocalFile.txt
    

    下面把HDFS中的myLocalFile.txt文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下,命令如下:

    ./bin/hdfs dfs -get input/myLocalFile.txt  /home/hadoop/下载
    

    可以使用如下命令,到本地文件系统查看下载下来的文件myLocalFile.txt:

    $ cd ~
    $ cd 下载
    $ ls
    $ cat myLocalFile.txt
    

    最后,了解一下如何把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录。比如,如果要把HDFS的“/user/hadoop/input/myLocalFile.txt”文件,拷贝到HDFS的另外一个目录“/input”中(注意,这个input目录位于HDFS根目录下),可以使用如下命令:

    ./bin/hdfs dfs -cp input/myLocalFile.txt /input
    

    二、利用Web界面管理HDFS

    打开Linux自带的Firefox浏览器,点这个链接HDFS的Web界面,即可看到HDFS的web管理界面,或者在window系统下的浏览器 www.虚拟机ip:9870
    在这里插入图片描述
    点击Utilities->Browse thr file system, 输入/ 点击go即可看到完整的根目录:
    在这里插入图片描述

    三、利用Java API与HDFS进行交互

    Hadoop不同的文件系统之间通过调用Java API进行交互,上面介绍的Shell命令,本质上就是Java API的应用。下面提供了Hadoop官方的Hadoop API文档,想要深入学习Hadoop,可以访问如下网站,查看各个API的功能。
    Hadoop API文档
    利用Java API进行交互,需要利用软件Eclipse编写Java程序。

    (一) 在Ubuntu中安装Eclipse

    Ubuntu(18.04)下安装eclipse

    (二)在Eclipse创建项目

    第一次打开Eclipse,需要填写workspace(工作空间),用来保存程序所在的位置,这里按照默认,不需要改动.
    由于当前是采用hadoop用户登录了Linux系统,因此,默认的工作空间目录位于hadoop用户目录“/home/hadoop”下
    选择“File->New->Java Project”菜单,开始创建一个Java工程
    在这里插入图片描述

    起名,选择next,先不要选finish。

    (三)为项目添加需要用到的JAR包

    进入下一步的设置以后,点击Libraries,会弹出如图所示界面。
    在这里插入图片描述

    需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了可以访问HDFS的Java API。这些JAR包都位于Linux系统的Hadoop安装目录下,对于本教程(如果是按照之前的教程所配置)而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,
    在这里插入图片描述

    在该界面中,上面的一排目录按钮(即“usr”、“local”、“hadoop”、“share”、“hadoop”、“mapreduce”和“lib”),当点击某个目录按钮时,就会在下面列出该目录的内容。
    为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:
    (1)”/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar;
    (2)/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
    (3)“/usr/local/hadoop/share/hadoop/hdfs”目录下的haoop-hdfs-3.1.3.jar和haoop-hdfs-nfs-3.1.3.jar和hadoop-hdfs-client-3.1.1.jar ;
    (4)“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。
    比如,如果要把“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar添加到当前的Java工程中,可以在界面中点击目录按钮,进入到common目录,然后,界面会显示出common目录下的所有内容
    请在界面中用鼠标点击选中hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar,然后点击界面“打开”按钮,就可以把这两个JAR包增加到当前Java工程中,出现的界面如图
    在这里插入图片描述

    从这个界面中可以看出,hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar已经被添加到当前Java工程中。然后,按照类似的操作方法,可以再次点击“Add External JARs…”按钮,把剩余的其他JAR包都添加进来。需要注意的是,当需要选中某个目录下的所有JAR包时,可以使用“Ctrl+A”组合键进行全选操作。全部添加完毕以后,就可以点击界面右下角的“Finish”按钮,完成Java工程HDFSExample的创建。

    (四)编写Java应用程序代码

    下面编写一个Java应用程序,用来检测HDFS中是否存在一个文件。
    请在Eclipse工作界面左侧的“Package Explorer”面板中(如图所示),找到刚才创建好的工程名称“HDFSExample”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New->Class”菜单。
    在这里插入图片描述

    选择“New->Class”菜单以后会出现如图:
    在这里插入图片描述

    在该界面中,只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“HDFSFileIfExist”,其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮:
    在这里插入图片描述

    修改代码为:

    import org.apache.hadoop.conf.Configuration;  
    import org.apache.hadoop.fs.FileSystem;  
    import org.apache.hadoop.fs.Path;  
    public class HDFSFileExist {  
        public static void main(String[] args){  
            try{  
                String fileName = "test";  
                Configuration conf = new Configuration();  
                conf.set("fs.defaultFS", "hdfs://localhost:9000");  
                conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");  
                FileSystem fs = FileSystem.get(conf);  
                if(fs.exists(new Path(fileName))){  
                    System.out.println("文件存在");  
                }else{  
                    System.out.println("文件不存在");  
                }  
       
            }catch (Exception e){  
                e.printStackTrace();  
            }  
        }  
    }  
    

    (五)编译运行程序

    在开始编译运行程序之前,请一定确保Hadoop已经启动运行,如果还没有启动,需要打开一个Linux终端,输入以下命令启动Hadoop:

    cd /usr/local/hadoop
    ./sbin/start-dfs.sh
    

    Shell 命令
    现在就可以编译运行上面编写的代码。
    点击run运行,程序运行结束后,会在底部的“Console”面板中显示运行结果信息(如图所示)。由于目前HDFS的“/user/hadoop”目录下还没有test文件,因此,程序运行结果是“文件不存在”。同时,“Console”面板中还会显示一些类似“log4j:WARN…”的警告信息,可以不用理会。
    在这里插入图片描述

    (六)应用程序的部署

    下面介绍如何把Java应用程序生成JAR包,部署到Hadoop平台上运行。首先,在Hadoop安装目录下新建一个名称为myapp的目录,用来存放我们自己编写的Hadoop应用程序,可以在Linux的终端中执行如下命令:

    cd /usr/local/hadoop
    mkdir myapp
    

    然后,请在Eclipse工作界面左侧的“Package Explorer”面板中,在工程名称“HDFSExample”上点击鼠标右键,在弹出的菜单中选“Export”,如图
    在这里插入图片描述

    在该界面中,选择“Runnable JAR file”,然后,点击“Next>”按钮,弹出如图
    在这里插入图片描述

    在该界面中,“Launch configuration”用于设置生成的JAR包被部署启动时运行的主类,需要在下拉列表中选择刚才配置的类“HDFSFileIfExist-HDFSExample”。在“Export destination”中需要设置JAR包要输出保存到哪个目录,比如,这里设置为“/usr/local/hadoop/myapp/HDFSExample.jar”。在“Library handling”下面选择“Extract required libraries into generated JAR”。然后,点击“Finish”按钮,会出现警告信息,忽略就行。
    打包结束,也会出现一个如图的警告:
    在这里插入图片描述

    可以忽略该界面的信息,直接点击界面右下角的“OK”按钮。至此,已经顺利把HDFSExample工程打包生成了HDFSExample.jar。可以到Linux系统中查看一下生成的HDFSExample.jar文件,可以在Linux的终端中执行如下命令:

    cd /usr/local/hadoop/myapp
    ls
    

    在这里插入图片描述

    可以看到,“/usr/local/hadoop/myapp”目录下已经存在一个HDFSExample.jar文件。现在,就可以在Linux系统中,使用hadoop jar命令运行程序,命令如下:

    cd /usr/local/hadoop
    ./bin/hadoop jar ./myapp/HDFSExample.jar
    

    在这里插入图片描述

    或者也可以使用如下命令运行程序:

    cd /usr/local/hadoop
    java -jar ./myapp/HDFSExample.jar
    

    命令执行结束后,会在屏幕上显示执行结果“文件不存在”。
    至此,检测HDFS文件是否存在的程序,就顺利部署完成了。

    附录:自己练习用的代码文件

    下面给出几个代码文件,供读者自己练习。
    1.写入文件

    import org.apache.hadoop.conf.Configuration;  
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.Path;
    
    public class Chapter3 {    
            public static void main(String[] args) { 
                    try {
                            Configuration conf = new Configuration();  
                            conf.set("fs.defaultFS","hdfs://localhost:9000");
                            conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
                            FileSystem fs = FileSystem.get(conf);
                            byte[] buff = "Hello world".getBytes(); // 要写入的内容
                            String filename = "hello.txt"; //要写入的文件名
                            FSDataOutputStream os = fs.create(new Path(filename));
                            os.write(buff,0,buff.length);
                            System.out.println("Create:"+ filename);
                            os.close();
                            fs.close();
                    } catch (Exception e) {  
                            e.printStackTrace();  
                    }  
            }  
    }
     
    

    在这里插入图片描述

    2.读取文件

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.fs.FSDataInputStream;
    
    public class Chapter3 {
            public static void main(String[] args) {
                    try {
                            Configuration conf = new Configuration();
                            conf.set("fs.defaultFS","hdfs://localhost:9000");
                            conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
                            FileSystem fs = FileSystem.get(conf);
                            Path file = new Path("test"); 
                            FSDataInputStream getIt = fs.open(file);
                            BufferedReader d = new BufferedReader(new InputStreamReader(getIt));
                            String content = d.readLine(); //读取文件一行
                            System.out.println(content);
                            d.close(); //关闭文件
                            fs.close(); //关闭hdfs
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }
    }
    
    展开全文
  • 分布式文件系统把文件分布存储到多个节点(计算机)上,成千上万的计算机节点构成计算机集群。分布式文件系统使用的计算机集群,其配置都是由普通硬件构成的,与用多个处理器和专用高级硬件的并行化处理装置相比,...
  • 第二章 分布式文件系统HDFS+MapReduce(代码实现检查文件是否存在&WordCount统计),课程依赖上一个章节:第一章 大数据安装教程(Virtual&ubuntu&hadoop单机)
  • 1. 分布式文件系统 1.1 计算机集群结构 分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群。 与之前使用多个处理器和专用高级硬件的并行优化处理装置不同的是,目前的分布式文件...
  • HDFS是HadoopDistributeFileSystem的简称,也就是Hadoop分布式文件系统。1、硬件错误是常态错误检测并快速自动恢复是HDFS的最核心设计目标2、存储超大文件HDFS适合大量存储,总存储量可以达到的PB、EB级HDFS适合大...
  • 大数据从入门到实战 - 第2章 分布式文件系统HDFS

    千次阅读 多人点赞 2021-01-13 16:56:03
    大数据从入门到实战 - 第2章 分布式文件系统HDFS 一、关于此次实践1、实战简介2、全部任务二、实践详解1、第1关: HDFS 的基本操作2、第2关:HDFS-JAVA接口之读取文件3、实验三 HDFS-JAVA 接口之上传文件4、实验四 ...
  • 我要开始为大四找工作做准备啦,开始复习关于大数据的知识。...大数据时代必须要解决的就是海量数据的高效存储问题,谷歌就针对这个问题开发出了GFS分布式文件系统,近乎完美地解决了这个问题,而HDFS分布式文件
  • Educoder 分布式文件系统HDFS

    千次阅读 2020-12-27 17:02:30
    在本地创建hello.txt文件并添加内容:HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。(标点符号为中文标点,敲击成英文标点会报错) vim /usr/output/hello.txt 将hello.txt上传至HDFS的/usr/output/目录下; ...
  • Hadoop技术(一)分布式文件系统HDFS

    千次阅读 多人点赞 2019-10-23 19:57:31
    1T 文件,有数字,按行存储 ,每行不是特别长 要求 找出存在的重复行(假设只有两行) 全排序 单词重复数 环境 只有一台计算机 ,要求在 128M,64M,256G的环境下都能够运行 注意 内存不能放下全量数据 ,最大xxMB !!! ...
  • 第3章-分布式文件系统HDFS.docx
  • 3.1 分布式文件系统 3.1.1 计算机集群结构 3.1.2 分布式文件系统的结构 两类节点: 1.主节点(Master Node) 或称为 名称节点(NameNode) ​ 负责文件和目录的创建、删除和重命名等,同时管理着数据节点和文件块...
  • 分布式文件系统HDFS原理篇

    千次阅读 2019-05-26 03:10:01
    所谓分布式文件系统就是通过网络实现文件在多台主机上进行分布式存储的文件系统!它一般采用“客户端/服务器端”的模。 分布式文件系统的结构 如下图所示,分布式文件系统在物理结构上是由计算机集群的多个节点...
  • 分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,这些节点分为两类,一类叫“主节点”(Master Node)或者也被称为“名称结点”(NameNode),另一类叫“从节点”(Slave Node)或者也被称为“数据节点”...
  • 分布式文件系统HDFS——基础篇

    千次阅读 2020-06-05 16:33:21
    学习Hadoop的核心组件HDFS——分布式文件系统,本文主要对HDFS的基础知识进行了讲解和介绍
  • Educoder 分布式文件系统HDFS-通关答案

    千次阅读 多人点赞 2021-03-28 17:55:21
    在本地创建hello.txt文件并添加内容:HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。(标点符号为中文标点,敲击成英文标点会报错) vim /usr/output/hello.txt 将hello.txt上传至HDFS的/usr/output/目录下; ...
  • Hadoop分布式文件系统hdfs代码分析 目录介绍 Datanode-数据块基本结构 主要介绍了HDFS中第二关系块结构,数据块到数据中断的映射关系。 退役-中断退款 主要介绍了数据异步下线取消机制。 INode-文件目录结构 主要...
  • 相对于传统的本地文件系统而言,分布式文件系统(Distributed File System)是一种通过网络实现文件在多台主机上进行分布式存储的文件系统,分布式文件系统的设计一般采用“客户端/服务器”(Client/Server)模式,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,392
精华内容 35,756
关键字:

分布式文件系统hdfs