3.3 HDFS实战

3.3.1 HDFS客户端的操作

(1)HDFS的FileSystem Shell(如图3-7所示)

图3-7 HDFS的FileSystem Shell

(2)启动命令

    [root@hadoop11~]# sh /usr/app/hadoop-2.6.0/sbin/start-dfs.sh
    17/03/06 06:10:30 WARN util.NativeCodeLoader: Unable to load native-
    hadoop library for your platform... using builtin-java classes where
    applicable
    Starting namenodes on [hadoop11 hadoop12]
    hadoop11: starting namenode, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-namenode-hadoop11.out
    hadoop12: starting namenode, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-namenode-hadoop12.out
    hadoop11: starting datanode, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-datanode-hadoop11.out
    hadoop12: starting datanode, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-datanode-hadoop12.out
    hadoop13: starting datanode, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-datanode-hadoop13.out
    Starting journal nodes [hadoop11 hadoop12 hadoop13]
    hadoop12: starting journalnode, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-journalnode-hadoop12.out
    hadoop13: starting journalnode, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-journalnode-hadoop13.out
    hadoop11: starting journalnode, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-journalnode-hadoop11.out
    17/03/06 06:10:55 WARN util.NativeCodeLoader: Unable to load native-
    hadoop library for your platform... using builtin-java classes where
    applicable
    Starting ZK Failover Controllers on NN hosts [hadoop11 hadoop12]
    hadoop11: starting zkfc, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-zkfc-hadoop11.out
    hadoop12: starting zkfc, logging to /usr/app/hadoop-
    2.6.0/logs/hadoop-root-zkfc-hadoop12.out

(3)启动进程

    [root@hadoop11~]# jps
    3733 NameNode
    3831 DataNode
    4013 JournalNode
    2682 QuorumPeerMain
    4155 DFSZKFailoverController
    4262 Jps

(4)HDFS的界面

HDFS的界面访问地址为http://hadoop11:50070/dfshealth.html#tab-overview

HDFS的界面如图3-8所示。

图3-8 HDFS的界面

(5)查看目录(HDFS目录结构如图3-9所示)

图3-9 HDFS目录结构

    [root@hadoop11~]# hadoop fs -ls /
    drwxr-xr-x    - root            supergroup            02017-03-05 06:14
    /hbase
    drwx------    - root            supergroup            02017-03-03 05:39 /tmp
    drwxr-xr-x    - Administrator supergroup            02017-03-05 12:06
    /user
    drwxr-xr-x    - root            supergroup            02017-03-03 05:39 /usr

(6)增加目录

    [root@hadoop11~]# hadoop fs -ls /usr
    drwxr-xr-x    - root supergroup            02017-03-05 02:11 /usr/yuhui
    hadoop fs -mkdir /usr/orcale
    [root@hadoop11~]# hadoop fs -ls /usr
    drwxr-xr-x    - root supergroup            02017-03-06 06:22 /usr/orcale
    drwxr-xr-x    - root supergroup            02017-03-05 02:11 /usr/yuhui

(7)删除目录

    hadoop fs -rm /usr/orcale

(8)修改目录

    hadoop fs -mkdir /usr/orcale
@@@
    hadoop fs -mv /usr/orcale /usr/xiaohui

(9)上传文件

    hadoop fs -put hadoop-stop.sh /usr/xiaohui/

(10)查看文件

    hadoop fs -cat /user/xiaohui/hadoop-stop.sh

(11)删除文件

    hadoop fs -rm /usr/xiaohui/hadoop-stop.sh

3.3.2 Java操作HDFS

1.注意事项01

Windows操作HDFS的时候,需要让主机用户Administrator有操作权限。HDFS文件权限如图3-10所示。

图3-10 HDFS文件权限

执行命令如下:

    hadoop fs -chmod 777 /

2.注意事项02

将4个配置文件core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml放入resources中。Java操作HDFS类如图3-11所示。

图3-11 Java操作HDFS类

    package cn.orcale.com.bigdata.hdfs;
@@@
    import java.io.IOException;
    import java.io.InputStream;
@@@
    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;
@@@
    public class HdfsTest {
@@@
        FileSystem fs = null;
@@@
        // 创建新文件
        public static void createFile(String dst, byte[] contents)
                  throws IOException {
              Configuration conf = new Configuration();
              FileSystem fs = FileSystem.get(conf);
              Path dstPath = new Path(dst); // 目标路径
              // 打开一个输出流
              FSDataOutputStream outputStream = fs.create(dstPath);
              outputStream.write(contents);
              outputStream.close();
              fs.close();
              System.out.println("文件创建成功!");
          }
@@@
          // 上传本地文件
          public static void uploadFile(String src, String dst) throws
        IOException {
              Configuration conf = new Configuration();
              FileSystem fs = FileSystem.get(conf);
              Path srcPath = new Path(src); // 原路径
              Path dstPath = new Path(dst); // 目标路径
              // 调用文件系统的文件复制函数,前面参数是指是否删除原文件,true为删除,默
        认为false
              fs.copyFromLocalFile(false, srcPath, dstPath);
@@@
              // 打印文件路径
              System.out.println("Upload to " +
        conf.get("fs.default.name"));
              System.out.println("------------list files------------" +
        "\n");
              FileStatus[] fileStatus = fs.listStatus(dstPath);
              for (FileStatus file : fileStatus) {
                  System.out.println(file.getPath());
              }
              fs.close();
          }
@@@
          // 文件重命名
          public static void rename(String oldName, String newName)
                  throws IOException {
              Configuration conf = new Configuration();
              FileSystem fs = FileSystem.get(conf);
              Path oldPath = new Path(oldName);
              Path newPath = new Path(newName);
              boolean isok = fs.rename(oldPath, newPath);
              if (isok) {
                  System.out.println("rename ok! ");
              } else {
                  System.out.println("rename failure");
              }
              fs.close();
          }
@@@
          // 删除文件
          public static void delete(String filePath) throws IOException {
              Configuration conf = new Configuration();
              FileSystem fs = FileSystem.get(conf);
              Path path = new Path(filePath);
              boolean isok = fs.deleteOnExit(path);
              if (isok) {
                  System.out.println("delete ok! ");
              } else {
                  System.out.println("delete failure");
              }
              fs.close();
          }
@@@
          // 创建目录
          public static void mkdir(String path) throws IOException {
              Configuration conf = new Configuration();
              FileSystem fs = FileSystem.get(conf);
              Path srcPath = new Path(path);
              boolean isok = fs.mkdirs(srcPath);
              if (isok) {
                  System.out.println("create dir ok! ");
              } else {
                  System.out.println("create dir failure");
              }
              fs.close();
          }
@@@
          // 读取文件的内容
          public static void readFile(String filePath) throws IOException {
              Configuration conf = new Configuration();
              FileSystem fs = FileSystem.get(conf);
              Path srcPath = new Path(filePath);
              InputStream in = null;
              try {
                  in = fs.open(srcPath);
                  IOUtils.copyBytes(in, System.out, 4096, false); // 复制到标
      准输出流
              } finally {
                  IOUtils.closeStream(in);
              }
          }
@@@
          public static void main(String[] args) throws IOException {
@@@
              /***
               * 本地操作HDFS的时候,需要让主机用户Administrator有操作权限hadoop
      fs -chmod 777 /
               */
              //
@@@
              // 测试新建目录
              // mkdir("/test1");
@@@
              // 测试上传文件
              // uploadFile("D:\\aaa.txt", "/test1");
@@@
              // 测试创建文件
              // byte[] contents = "hello world世界你好\n".getBytes();
              // createFile("/test1/d.txt", contents);
@@@
              // 测试重命名
              // rename("/test1/d.txt", "/test1/dd.txt");
@@@
              // 测试读取文件
              // readFile("/test1/aaa.txt");
@@@
              // 测试删除文件
              // delete("/test1/dd.txt"); //使用相对路径
            // delete("/test1"); //删除目录
@@@
        }
@@@
    }