大数据技术原理与应用 第三章 分布式文件系统HDFS 学习指南

大数据技术原理与应用

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

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

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

学习本指南需要在Linux系统安装好Hadoop.如果机器上没有安装Linux和Hadoop,请返回大数据技术原理与应用 第二章 学习指南,根据指南学习并安装。

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

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

一、启动Hadoop

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

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

二、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总共支持了哪些命令

./bin/hadoop fs

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

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

./bin/hadoop fs -help put

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

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

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

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

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

Hadoop API文档

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

  • 在Ubuntu中安装Eclipse
    利用Ubuntu左侧边栏自带的软件中心安装软件,在Ubuntu左侧边栏打开软件中心

打开软件中心后,呈现如下界面

在软件中心搜索栏输入“ec”,软件中心会自动搜索相关的软件

点击如下图中Eclipse,进行安装

安装需要管理员权限,Ubuntu系统需要用户认证,弹出“认证”窗口,请输入当前用户的登录密码

ubuntu便会进入如下图的安装过程中,安装结束后安装进度条便会消失。

点击Ubuntu左侧边栏的搜索工具,输入“ec”,自动搜索已经安装好的相关软件,打开Eclipse

  • 在Eclipse创建项目
    第一次打开Eclipse,需要填写workspace(工作空间),用来保存程序所在的位置,这里按照默认,不需要改动,如下图

点击“OK”按钮,进入Eclipse软件。开始创建项目,选择顶部菜单File--->New--->Java Project,如下图

输入项目名称,本教程输入的项目名称是“Dblab”,其他不用改动,点击“Finish”按钮即可。

  • 项目加载所需要用到的jar包

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


加载上面路径common文件夹下:
lib所有的jar包和hadoop-common-2.7.1.jar
加载上面路径hdfs文件夹下:
lib所有的jar包和hadoop-hdfs-2.7.1.jar
在所在项目中加载jar包,具体操作如下:在所选的Eclipse项目(Dblab)上右键点击--->弹出菜单中选择Properties--->Java Build Path--->Libraries--->Add External JARS

  • 实例:利用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();
                      }
              }
      }
      

      第二步:编译部署
      如果代码编写在Eclipse里面,那么直接点击运行,即可看到运行结果。
      如果还想Hadoop自带的实例那样运行jar包,以上述写入文件的代码为例,还需要做以下操作:
      点击Eclipse顶部菜单选项"File",选择"export"
      1
      选择"Runnable JAR File",然后下一步next
      2
      假定Chapter3.jar存放在用户目录文件下
      3
      在终端输入命令:

      java -jar ~/Chapter3.jar