Hadoop學(xué)習(xí)(二)——HDFS實踐

前言:這次學(xué)習(xí)實際操作跟hdfs交互,hadoop fs命令代表著hadoop的file system文件系統(tǒng)。要操作hdfs就需要跟這個前綴命令打交道。

一、往hdfs上傳下載文件

實驗?zāi)康模河^察如何往hdfs上傳文件,并通過網(wǎng)頁界面查看超過128m的文件分塊和存儲情況。
實驗命令:hadoop fs -put 文件路徑
實際操作如下圖:

圖片.png
網(wǎng)頁端看到的結(jié)果如下圖:
圖片.png

對應(yīng)往hdfs上傳文件就會有從hdfs下載文件到本地,命令如下

hadoop fs -get hdfs://host:port/user/hadoop/file localfile        成功返回0,失敗返回-1。

二、hdfs的命令記錄

hadoop fs -mkdir 文件目錄   //創(chuàng)建目錄
hadoop fs -rm 文件名   //刪文件
hadoop fs -rm -r 文件夾  // 刪文件夾,遞歸刪除
hadoop fs -text 文件名   //改
hadoop fs -cat   //查看文件內(nèi)容
hadoop fs -ls 文件路徑   //查,列舉目錄下的文件
hadoop fs -du -s -h /apps/hive/warehouse/test.db/test    //查詢文件大小,這里即對于表容量
hadoop fs -cp [-f選項會覆蓋已經(jīng)存在的目標] 原文件路徑 目標路徑   //復(fù)制文件  
hadoop fs -mv 文件路徑 目標路徑   //移動文件
hadoop fs -count 文件路徑  //統(tǒng)計文件路徑下的目錄、文件、字節(jié)數(shù)

另外:在vim編輯器中,刪除一整行的命令是dd

三、修改hdfs的配置文件hdfs-site.xml

在<configuration>標簽組里添加<property>配置

  • 下面這個標簽屬性是配置文件默認的備份份數(shù)(默認是三份),比如設(shè)置為2這樣文件在hdfs中就備份2份。
<property>
  <name>dfs.replication</name>
  <value>2</value>
</property>
  • 下面這個標簽屬性是設(shè)置hadoop每隔多長時間檢查集群機器中的哪些機器宕機了,默認為300000毫秒(即5分鐘),我們可以設(shè)置短一些(比如10000毫秒,即1分鐘)。注意:集群機器宕機了一兩臺是不會影響集群對外提供服務(wù)的,因為集群本就是多臺機器為同一個任務(wù)服務(wù)。
<property>
  <name>dfs.namenode.heartbeat.recheck-interval</name>
  <value>10000</value>
</property>
  • 下面這個標簽屬性是用來配置hdfs取消用戶權(quán)限檢查的
<property>
        <name>dfs.permissions</name>
        <value>false</value>
</property>

還有許多屬性沒記錄到,需要的時候百度或者查api就足夠了。

  • 注意,在上一篇搭建Hadoop集群環(huán)境的時候,我沒有修改hadoop文件存儲在哪里,所以默認是放在根目錄的/tmp目錄下,而tmp目錄在Linux系統(tǒng)下關(guān)機后是會不定時清除的,所以這會導(dǎo)致一個非常嚴重的問題,就是你的集群會時而啟動正常時而啟動不正常。解決方法:更改hadoop文件的默認存儲位置,通過設(shè)置core-site.xml配置文件,加入如下標簽組屬性,集群內(nèi)的所有機器都要配置,不止是namenode,datanode也要配置這個屬性,然后關(guān)閉集群,格式化下namenode,再重啟集群就可以了。
<property>
  <name>hadoop.tmp.dir</name>
  <value>/var/hadoop</value>
</property>

最后放一個HDFS的理論篇,別人以漫畫的形式寫的。
https://mp.weixin.qq.com/s/8p6R8j2LLmFcaenOtVywVg

hadoop客戶端和hdfs交互的原理是:
比如往hdfs上傳功能,hadoop先訪問namenode,namenode指定文件存放在哪個datanode,然后告訴hadoop客戶端,hadoop再去訪問對應(yīng)的datanode。
比如從hdfs下載功能,hadoop先訪問namenode,namenode查找文件存放在哪個datanode,然后告訴hadoop客戶端,hadoop再去訪問對應(yīng)的datanode。

四、寫Java程序訪問HDFS

寫java程序訪問hdfs之前得先導(dǎo)入hadoop對應(yīng)的包,然后再上傳一個文件到hdfs文件系統(tǒng)內(nèi)作為前提條件。這些jar包在hadoop安裝包目錄下,我直接放在我的網(wǎng)盤中,有需要自行下載然后導(dǎo)入jar包再寫程序。
網(wǎng)盤鏈接:https://pan.baidu.com/s/1EbvHSzcGCkCf8Vgb6KgCyw
提取碼:npk7

下面的java程序是一些基礎(chǔ)的訪問hdfs的方法,要了解更多還是得去看API文檔。

import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;

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.FsUrlStreamHandlerFactory;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class HelloHDFS {
    
    public static void main(String[] args) throws Exception{
        boolean success;
        //不加這一行設(shè)置,默認url只識別http協(xié)議
        //所以必須通過這一行設(shè)置一個專門用來處理hdfs協(xié)議的FsUrlStreamHandlerFactory工廠
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
        URL url = new URL("hdfs://10.14.28.100:9000/test.txt");
        InputStream in = url.openStream();
        //把輸入流的內(nèi)容轉(zhuǎn)到輸出流,true是完成后自動關(guān)閉流,4096是緩沖區(qū)大小
        IOUtils.copyBytes(in,System.out,4096,true);
        
        //相當于在命令行中配置core-site.xml的屬性
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://10.14.28.100:9000");
        //根據(jù)配置獲得一個文件系統(tǒng)
        FileSystem fs = FileSystem.get(conf);
        
        //新建一個文件目錄
        success = fs.mkdirs(new Path("/xiaojiang"));
        System.out.println(success);
        //判斷文件是否存在
        success = fs.exists(new Path("/test.txt"));
        System.out.println(success);
        //刪除文件目錄
        success = fs.delete(new Path("/xiaojiang"));
        System.out.println(success);
        //驗證是否還存在被刪除的文件目錄
        success = fs.exists(new Path("/xiaojiang"));
        System.out.println(success);
        
        
        FSDataOutputStream out = fs.create(new Path("/test.data"),true);
        //把window的文件傳到hdfs中
        FileInputStream fin = new FileInputStream("D:/Hive編程指南 PDF 中文高清版.pdf");
        IOUtils.copyBytes(fin,out,4096,true);
        
        //獲得指定目錄下的每個文件的信息
        FileStatus[] statues = fs.listStatus(new Path("/"));
        for(FileStatus statu:statues) {
            System.out.println(statu.getPath());
            System.out.println(statu.getPermission());
            System.out.println(statu.getReplication());
        }
    }
}

五、小結(jié)

文章是根據(jù)馬士兵老師的hadoop入門視頻教程所學(xué)整理,視頻講得挺好的,期間遇到一些錯誤就百度自行解決。
HDFS我們可以理解為是一個分冗展的大硬盤,即分塊且多份存儲、冗余存儲、橫向擴展。

image.png

答:
1、Hadoop分為HDFS、MapReduce、YARN主要三個邏輯組件。
2、HDFS的典型架構(gòu)是主從架構(gòu),即一臺master機器啟動namenode進程,管理著多臺slave啟動著datanode的機器。
3、當空間不夠了,可以通過加機器擴充datanode,配置好datanode,然后設(shè)置core-site.xml配置文件告訴master機器擴充了datanode,并交由namenode管理,這就是橫向擴展,很方便很具有健壯性。
4、HDFS典型應(yīng)用有百度網(wǎng)盤這種。
5、不會復(fù)制一份數(shù)據(jù)到我的網(wǎng)盤,只是存放一個鏈接到其他datanode,訪問時通過鏈接訪問對方的網(wǎng)盤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 首先,我們在使用前先看看HDFS是什麼?這將有助于我們是以后的運維使用和故障排除思路的獲得。 HDFS采用mast...
    W_Bousquet閱讀 4,437評論 0 2
  • HDFS入門 hadoop架構(gòu) Hadoop 1.0中的資源管理方案 Hadoop 1.0指的是版本為Apache...
    依天立業(yè)閱讀 1,257評論 0 1
  • HDFS的設(shè)計目標 通過上一篇文章的介紹我們已經(jīng)了解到HDFS到底是怎樣的東西,以及它是怎樣通過多副本機制來提供高...
    陌上疏影涼閱讀 1,529評論 0 3
  • 三天的培訓(xùn)結(jié)束了,王鵬老師以自己的酸辣粉+雞排故事結(jié)尾,瞬間在我們賦予他的幽默、智慧、專業(yè)、帥之外,多了一道暖陽,...
    智慧成長說閱讀 473評論 0 3
  • 所謂“心流”,就是當你特別專注地做一-件 目標明確而又有挑戰(zhàn)的事情,而你的能力 恰好能接住這個挑戰(zhàn),你可能會進入的...
    333aaa閱讀 176評論 0 0

友情鏈接更多精彩內(nèi)容