大數據之 Hadoop-5-HDFS

1、HDFS 簡介

HDFS(Hadoop Distributed File System)是Hadoop 項目的核心子項目,在大數據開發中經過分佈式計算對海量數據進行存儲與管理。java

HDFS 是一個典型的主/從架構的分佈式系統。一個HDFS 集羣由一個元數據節點(NameNode)和一些數據節點(DataNode)組成。linux

舉個例子,咱們能夠把NameNode 想象成一個倉庫管理員,管理倉庫中的商品;DataNode 想象成是一個倉庫,用於存儲商品,而商品就是咱們所說的數據。git

HDFS 命令行操做

命令行接口以下:github

$ bin/hadoop fs -命令 文件 路徑

或者apache

$ bin/hdfs dfs -命令 文件路徑

ls

使用ls命令能夠查看HDFS系統中的目錄和文件。segmentfault

$ hadoop fs -ls /

操做演示:windows

[root@centos01 ~]# hadoop fs -ls /
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2021-07-10 08:58 /input
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp

遞歸列出HDFS 文件系統根目錄下的全部目錄和文件:centos

[root@centos01 ~]# hadoop fs -ls -R /
drwxr-xr-x   - hadoop supergroup          0 2021-07-10 08:58 /input
-rw-r--r--   2 hadoop supergroup         83 2021-07-10 08:58 /input/wc.txt
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn/staging
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn/staging/hadoop
drwx------   - hadoop supergroup          0 2021-07-10 08:49 /tmp/hadoop-yarn/staging/hadoop/.staging

put

使用put 命令能夠將本地文件上傳到HDFS系統中。如將本地文件a.txt 上傳到 HDFS 文件系統根目錄 input 文件夾中,命令以下:api

$ hadoop fs -put a.txt /input/

get

使用get命令能夠將 HDFS 文件系統中的文件下載到本地,注意下載時不能與本地文件名相同,不然會提示文件已存在。安全

$ hadoop fs -get /input/a.txt a.txt

將文件夾下載到本地:

$ hadoop fs -get /input/ ./

經常使用命令

列出 hdfs 下的文件
$ hadoop dfs -ls
列出 hdfs / 路徑下的全部文件,文件夾  
$ hadoop dfs -ls -R /
建立目錄 /input
$ hadoop dfs -mkdir /input
列出 hsfs 名爲 input 的文件夾中的文件
$ hadoop dfs -ls input
將 test.txt 上傳到 hdfs 中
$ hadoop fs -put /home/binguner/Desktop/test.txt /input
將 hsdf 中的 test.txt 文件保存到本地桌面文件夾
$ hadoop dfs -get /input/test.txt /home/binguenr/Desktop
刪除 hdfs 上的 test.txt 文件
$ hadoop dfs -rmr /input/test.txt
查看 hdfs 下 input 文件夾中的內容
$ hadoop fs -cat input/*
進入安全模式
$ hadoop dfsadmin –safemode enter
退出安全模式
$ hadoop dfsadmin -safemode leave
報告 hdfs 的基本統計狀況
$ hadoop dfsadmin -report

2、Java API操做

一、建立

pom.xml 文件中引入Hadoop的Java API 依賴包:

<dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.8.2</version>
        </dependency>

新建 com/homay/hadoopstudy/FileSystemCat.java

package com.homay.hadoopstudy;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import sun.nio.ch.IOUtil;

import java.io.InputStream;

/**
 * @author: kaiyi
 * @Date 2021/7/12 0:25
 */
public class FileSystemCat {

    public static void main(String[] args) throws Exception{

        Configuration conf = new Configuration();
        conf.set("fs.defalut.name", "hdfs://192.168.222.10:9000");
        FileSystem fs = FileSystem.get(conf);

        // 打開文件輸入流
        InputStream in = fs.open(new Path("hdfs:/input/wc.txt"));
        IOUtils.copyBytes(in, System.out, 4096, false);

        // 關閉輸入流
        IOUtils.closeStream(in);


    }
}

查看Hadoop 文件:

[hadoop@centos01 sbin]$ hadoop dfs -ls -R /
WARNING: Use of this script to execute dfs is deprecated.
WARNING: Attempting to execute replacement "hdfs dfs" instead.

drwxr-xr-x   - hadoop supergroup          0 2021-07-10 08:58 /input
-rw-r--r--   2 hadoop supergroup         83 2021-07-10 08:58 /input/wc.txt
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn/staging
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn/staging/hadoo
drwx------   - hadoop supergroup          0 2021-07-10 08:49 /tmp/hadoop-yarn/staging/hadoo
[hadoop@centos01 sbin]$ hadoop -v

運行

運行該文件,報這樣的錯誤:
java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset

本地遠程鏈接 Hadoop 集羣異常,日誌以下:

22:27:56.703 [main] DEBUG org.apache.hadoop.util.Shell - Failed to detect a valid hadoop home directory
java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset.
    at org.apache.hadoop.util.Shell.checkHadoopHomeInner(Shell.java:448)
    at org.apache.hadoop.util.Shell.checkHadoopHome(Shell.java:419)
    at org.apache.hadoop.util.Shell.<clinit>(Shell.java:496)

日誌描述內容很清楚,沒有設置 HADOOP_HOME 和 hadoop.home.dir 兩項。這兩項主要是幹嗎的呢?是配置在本地環境變量中的 Hadoop 地址,那麼須要下載Windows版本的Hadoop來設置麼?若是是遠程鏈接Linux上的Hadoop集羣,則徹底不須要再下載安裝Windows版本的Hadoop!!!

本地遠程鏈接Hadoop系統時須要在本地配置相關的Hadoop變量,主要包括hadoop.dll 與 winutils.exe 等。

winutils:因爲hadoop主要基於linux編寫,winutil.exe主要用於模擬linux下的目錄環境。當Hadoop在windows下運行或調用遠程Hadoop集羣的時候,須要該輔助程序才能運行。winutils是Windows中的二進制文件,適用於不一樣版本的Hadoop系統並構建在Windows VM上,該VM用以在Windows系統中測試Hadoop相關的應用程序。

解決方法

瞭解到緣由以後,能夠根據安裝Hadoop集羣的版本,下載相應的winutils。

下載地址:https://github.com/stevelough...

注:若無相同的版本,可選擇就近的版本下載使用。如集羣中使用的版本是2.8.5,能夠下載使用2.8.3的版本文件。

將環境變量%HADOOP_HOME%設置爲指向包含WINUTILS.EXEBIN目錄上方的目錄。即:

  1. 新增系統變量
    image.png
  2. 複製2.8.3文件夾中的bin文件夾,存放地址以下:
    image.png
  3. 重啓idea後重生,問題解決。

注:不須要下載安裝windows版本的Hadoop,只須要引入winutils.exe便可

從新啓動後,上邊的問題解決了,又出現了這樣的問題:Wrong FS: hdfs:/input/wc.txt, expected: file:///

詳細錯誤信息:

23:51:26.466 [main] DEBUG org.apache.hadoop.fs.FileSystem - FS for file is class org.apache.hadoop.fs.LocalFileSystem
Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs:/input/wc.txt, expected: file:///
    at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:730)

解決方案:

hadoop須要把集羣上的 core-site.xmlhdfs-site.xml 放到當前工程下。

1)hdfs-site.xml

2)core-site.xml

3)mapred-site.xml

上面三個文件,都是你linux環境安裝hadoop 的配置的xml 文件, 把hadoop集羣上的core-site.xml和hdfs-site.xml放到工程的src目錄下 /resource

image.png

而後再執行該文件,能夠看到 java 調用 Hadoop api 成功了 ^_^
image.png

相關文章
相關標籤/搜索