《十小時入門大數據》學習筆記之HDFS

筆記目錄

    1. HDFS概述及設計目標
    1. HDFS架構
    1. HDFS副本機制
    1. HDFS環境搭建
    1. HDFS shell
    1. Java API 操作HDFS
    1. HDFS 文件讀寫流程
    1. HDFS優缺點

1. HDFS概述及設計目標

1.1 什麼是HDFS
  • Hadoop 實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS;
  • 源自於Google的GFS論文
  • 發表於2003年,HDFS是GFS的克隆版
1.2 HDFS的設計目標
  • 非常巨大的分佈式文件系統
  • 運行在普通廉價的硬件上
  • 易擴展、爲用戶提供性能不錯的文件存儲服務
  • 更多的請看官網....

2. HDFS架構

1個Master(NameNode/NN) 帶N個Slaves(DataNode/DN)
一個文件會被拆分成多個Block,blocksize:128M,eg:130M的文件==>2 block(128M和2M)

  • NN:
    1). 負責客戶端的請求響應
    2).負責元數據(文件名稱、副本系數、Block存放的DN)的管理
  • DN:
    1). 存儲用戶的文件對應的數據塊(Block)
    2). 要定期向NN發送信條信息,彙報本身及其所有的block信息,健康狀況
    A typical deployment has a dedicated machine that runs only the NameNode software. Each of the other machines in the cluster runs one instance of the DataNode software. The architecture does not preclude running multiple DataNodes on the same machine but in a real deployment that is rarely the case.
  • 建議:NN和DN部署在不同的節點上

3. HDFS副本機制

Replication factor:副本因子/副本系數 ;處理文件的最後一個block,其他的block大小都相同。
  • HDFS副本存放策略(面試的一個考點)
    如下圖,假設一個集羣有兩個機架,橙色的代表客戶端,假設文件有3個副本,那麼第一個副本存放在客戶端所在的機器上,另外兩個副本存放在與客戶端不在同一個機架上的隨機的兩臺機器上。分機架的好處是:保證容錯性。


4. HDFS環境搭建

  • 簡單步驟:
    1). jdk安裝
    • 解壓: tar -zxvf jdk-8u181-linux-x64.tar.gz -C ~/app
    • 添加到系統環境變量: vim /etc/profile (或 vim ~/.bashrc )
export JAVA_HOME=/home/hadoop/app/jdk1.8.0_181
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
  • 使環境變量生效:source /etc/profile (或 source ~/.bashrc)
  • 驗證java是否配置成功:java -version
    2). 安裝SSH
  • Ubuntu :
    sudo apt-get install ssh
    sudo apt-get install rsync
  • CentOS
    sudo yum install ssh
  • 配置免密碼登錄
ssh-keygen -t rsa  #一路回車就行
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
  • 驗證是否免密碼登錄是否成功:
hadoop@Dell:~$ ssh localhost  # 接下來輸入yes

3). 下載並解壓Hadoop

  • 下載:到cdh官網直接下載
  • 解壓:tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz -C ~/app
    4). Hadoop配置文件的修改(hadoop_home/etc/hadoop/)
  • hadoop-env.sh
/home/hadoop/app/jdk1.8.0_181
  • core-site.xml
<!-- hadoop1.X的端口是9000,2.X以後的是8020-->
 <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:8020</value>
  </property>
<!-- hadoop默認的存儲地址是臨時文件夾,在linux下臨時文件夾每次重啓都會被刪除,所以需要添加一個臨時文件 -->
 <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/app/tmp</value>
  </property>
  • hdfs-site.xml
<!-- 由於是僞分步單節點。因此副本系數設置爲1-->
 <property>
        <name>dfs.replication</name>
        <value>1</value> 
</property>

5). 啓動hdfs

  • 格式化文件系統(僅第一次執行,):bin/hdfs namenode -format
  • 啓動 hdfs:sbin/start-dfs.sh
  • 驗證是否啓動成功:
    jps :多次三個進程:NameNode 、DataNode、SecondaryNameNode
    瀏覽器:http://localhost:50070
    6). 停止hdfs
    sbin/stop-dfs.sh
    至此,HDFS環境搭建完成!
    7). 把hadoop配置到環境變量中: vim ~/.bashrc
    爲了方便後期使用hadoop,需要把hadoop配置到系統環境變量中,後期不管在哪個控制檯目錄下都可以直接使用hadoop shell命令。
export HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

保存之後一定記得執行:source ~/.bashrc 使配置文件生效。

5. HDFS shell

  • HDFS常用的shell命令
    ls mkdir put get mv cp ......
  • shell 例子
    1). 把當前目錄下的hello.txt文件上傳到hdfs的根目錄下中:hadoop fs -put hello.txt / 2). 查看hdfs根目錄下的文件:hadoop fs -ls /
    3). 查看剛剛上傳的hello.txt文件的內容:hadoop fs -text /hello.txt 或 hadoop fs -cat /hello.txt 4). 創建文件夾:hadoop fs -mkdir /test 5). 遞歸創建文件夾: hadoop fs -mkdir -p /test/a/b
    6). 遞歸展示文件:hadoop fs -ls -R /
    7). 從hdfs上下載文件到本地:hadoop fs -get /hello.txt (也可以在瀏覽器中下載文件或查看文件的信息)
    8).如果在使用中遇到不會是用的,可以直接在控制檯上敲:hadoop fs 然後回車,會出現提示信息 ......

6. Java API 操作HDFS

  • 1) IDEA + Maven創建Java工程
    :IDEA和Maven的安裝請看另外一篇筆記:Ubuntu 16.04安裝IDEA和maven
    創建一個新項目(Maven項目),如下圖,注意選上標紅的選項,之後下一步。
    輸入項目名稱,然後點擊下一步 選中標紅的部分選擇maven安裝的路徑(可不選,使用默認的) ,之後一直下一步到結束。 至此,Java項目創建完畢!
    1. 添加HDFS相關依賴
      在pom.xml中,安裝下圖進行添加hadoop的HDFS相關依賴
<!--  cdh版本的hadoop倉庫-->
 <repositories>
    <repository>
      <id>cloudera</id>
      <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
  </repositories>
    1. 開發Java API操作HDFS文件

7. HDFS 文件讀寫流程(面試考點)

這裏詳見 其他簡友的筆記: Hadoop學習筆記(三)漫畫解讀HDFS讀寫原理

8. HDFS優缺點

1)** 優點**

  • 數據冗餘、硬件容錯
  • 處理流式訪問
  • 適合存儲大文件
  • 可構建在廉價的機器上
    2)** 缺點**
  • 低延遲的數據訪問
  • 不適合小文件存儲(因爲太多的小文件會浪費大量的NameNode的資源)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章