macOS 分布式文件系统HDFS 学习指南

大数据学习路线图

【版权声明:本指南为厦门大学林子雨编著的《大数据技术原理与应用》教材配套学习资料,版权所有,转载请注明出处,请勿用于商业用途】

本指南介绍Hadoop分布式文件系统HDFS,并详细指引读者对HDFS文件系统的操作实践。请务必仔细阅读完厦门大学林子雨编著的《大数据技术原理与应用》第3章节,再结合本指南进行学习。

Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是Hadoop核心组件之一,如果已经安装了Hadoop,其中就已经包含了HDFS组件,不需要另外安装。

学习本指南需要在macOS系统安装好Hadoop.如果读者没有安装Hadoop,请返回macOS 安装Hadoop教程-单机-伪分布式配置,根据指南学习并安装。

第3章涉及到很多的理论知识点,主要的理论知识点包括:分布式文件系统、HDFS简介、HDFS的相关概念、HDFS体系结构、HDFS的存储原理、HDFS的数据读写过程。这些理论知识点,请自己依靠厦门大学林子雨编著的《大数据技术原理与应用》第3章节进行学习,本指南不再重复表述。

接下来介绍Linux操作系统中关于HDFS文件操作的常用Shell命令,利用Web界面查看和管理Hadoop文件系统,以及利用Hadoop提供的Java API进行基本的文件操作。

一、启动Hadoop

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

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

注意笔者当然macOS系统的hadoop版本是2.7.1 ,读者的路径请自行切换到Homebrew安装的版本路径。

二、HDFS编程

(一)、利用Shell命令操作

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

注意: 教材《大数据技术原理与应用》的命令是以"./bin/hadoop dfs"开头的Shell命令方式,实际上有三种shell命令方式。
1. hadoop fs
2. hadoop dfs
3. hdfs dfs

hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于HDFS文件系统
hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统

我们可以在终端输入如下命令,查看fs总共支持了哪些命令

hadoop fs

在终端输入如下命令,可以查看具体某个命令的作用

例如:我们查看put命令如何使用,可以输入如下命令

hadoop fs -help put

由于Hadoop支持的命令众多,想更多了解Hadoop命令,请参照《大数据技术原理与应用》3.7小节学习。

(二)、利用HDFS的Web界面管理

打开macOS自带的Safari浏览器或Chrome浏览器,点击此链接HDFS的Web界面,即可看到HDFS的web管理界面

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

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

Hadoop API文档

利用Java API进行交互,需要利用软件Intellij IDEA编写Java程序。

在macOS系统中,推荐使用Intellij IDEA编写Java程序,请读者自行到官网下载Intellij IDEA: The Java IDE for Professional Developers by JetBrains

在Intellij IDEA创建一个Java项目,并加载所依赖的jar包。

如何获取Java API: API所在的jar包都在已经安装好的hadoop文件夹里,路径:/usr/local/Cellar/hadoop/2.7.1/libexec/share/hadoop(如果您安装的hadoop不在此目录,请找到jar包所在的文件夹)

加载上面路径common文件夹下:
lib所有的jar包和hadoop-common-2.7.1.jar
加载上面路径hdfs文件夹下:
lib所有的jar包和hadoop-hdfs-2.7.1.jar

  • 实例:利用hadoop 的java api检测伪分布式文件系统HDFS上是否存在某个文件,写入文件,读取文件。
    第一步:编写代码

    • 写入文件
      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 = "test"; //要写入的文件名
                              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();  
                      }  
              }  
      }
      
    • 判断文件是否存在
      import org.apache.hadoop.conf.Configuration;
      import org.apache.hadoop.fs.FileSystem;
      import org.apache.hadoop.fs.Path;
      
      public class Chapter3 {
              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("文件不存在");
                                  }
                                  fs.close();
                      } catch (Exception e) {
                              e.printStackTrace();
                      }
              }
      } 
      
    • 读取文件
      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();
                      }
              }
      }
      

      第二步:编译部署
      如果代码编写在Intellij IDEA里面,那么直接点击运行,即可看到运行结果。
      如果还想Hadoop自带的实例那样运行jar包,以上述写入文件的代码为例,还需要做以下操作:
      点击Intellij IDEA顶部菜单选项"File",选择"Project Structure",选择左侧菜单“Artifacts”
      1
      然后填入所要运行的主类

      选择输出的jar包地址,点击OK按钮即可。

      点击Intellij IDEA顶部菜单选项"Build",选择"Build Artifacts"
      在终端输入命令:

      cd ~/Desktop
      java -jar ./Test.jar