### 2.1 實驗目的
1. 理解HDFS存在的原因;
2. 理解HDFS體系架構;
3. 理解master/slave架構;
4. 理解為何配置文件里只需指定主服務、無需指定從服務;
5. 理解為何需要客戶端節點;
6. 學會逐一啟動HDFS和統一啟動HDFS;
7. 學會在HDFS中上傳文件。
### 2.2 實驗要求
要求實驗結束時,已構建出以下HDFS集群:
1. master上部署主服務NameNode;
2. Slave1、2、3上部署從服務DataNode;
3. client上部署HDFS客戶端。
待集群搭建好后,還需在client上進行下述操作:
1. 在HDFS里新建目錄;
2. 將client上某文件上傳至HDFS里剛才新建的目錄。
### 2.3 實驗原理
#### 2.3.1 分布式文件系統
分布式文件系統(Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網絡與節點相連。該系統架構于網絡之上,勢必會引入網絡編程的復雜性,因此分布式文件系統比普通磁盤文件系統更為復雜。
#### 2.3.2 HDFS
HDFS(Hadoop Distributed File System)為大數據平臺其它所有組件提供了基本的存儲功能。它具有高容錯、高可靠、可擴展、高吞吐率等特征,為大數據存儲和處理提供了強大的底層存儲架構。
HDFS是一個主/從(master/slave)體系結構,從最終用戶的角度來看,它就像傳統的文件系統,可通過目錄路徑對文件執行CRUD操作。由于其分布式存儲的性質,HDFS集群擁有一個NameNode和一些DataNodes,NameNode管理文件系統的元數據,DataNode存儲實際的數據。
HDFS開放文件系統的命名空間以便用戶以文件形式存儲數據,秉承“一次寫入、多次讀取”的原則。客戶端通過NameNode和DataNodes的交互訪問文件系統,聯系NameNode以獲取文件的元數據,而真正的文件I/O操作是直接和DataNode進行交互的。
#### 2.3.3 HDFS基本命令
HDFS基本命令格式如下:
~~~
hadoop fs -cmd args
~~~
其中,cmd為具體的操作,args為參數。
部分HDFS命令示例如下:
~~~
hadoop fs -mkdir /user/trunk #建立目錄/user/trunk
hadoop fs -ls /user #查看/user目錄下的目錄和文件
hadoop fs -lsr /user #遞歸查看/user目錄下的目錄和文件
hadoop fs -put test.txt /user/trunk #上傳test.txt文件至/user/trunk
hadoop fs -get /user/trunk/test.txt #獲取/user/trunk/test.txt文件
hadoop fs -cat /user/trunk/test.txt #查看/user/trunk/test.txt文件內容
hadoop fs -tail /user/trunk/test.txt #查看/user/trunk/test.txt文件的最后1000行
hadoop fs -rm /user/trunk/test.txt #刪除/user/trunk/test.txt文件
hadoop fs -help ls #查看ls命令的幫助文檔
~~~
#### 2.3.4 HDFS適用場景
HDFS 提供高吞吐量應用程序數據訪問功能,適合帶有大型數據集的應用程序,以下是一些常用的應用場景:
數據密集型并行計算:數據量極大,但是計算相對簡單的并行處理,如大規模Web信息搜索;
計算密集型并行計算:數據量相對不是很大,但是計算較為復雜的并行計算,如3D建模與渲染、氣象預報和科學計算;
數據密集與計算密集混合型的并行計算,如3D電影的渲染。
HDFS在使用過程中有以下限制:
HDFS不適合大量小文件的存儲,因NameNode將文件系統的元數據存放在內存中,因此存儲的文件數目受限于NameNode的內存大小;
HDFS適用于高吞吐量,而不適合低時間延遲的訪問;
流式讀取的方式,不適合多用戶寫入一個文件(一個文件同時只能被一個客戶端寫),以及任意位置寫入(不支持隨機寫);
HDFS更加適合寫入一次,讀取多次的應用場景。
### 2.4 實驗步驟
部署HDFS主要步驟如下:
1. 配置Hadoop的安裝環境;
2. 配置Hadoop的配置文件;
3. 啟動HDFS服務;
4. 驗證HDFS服務可用。
#### 2.4.1 在master服務器上確定存在hadoop安裝目錄
~~~
[root@master ~]# ls /usr/cstor/hadoop
~~~
顯示結果如圖2-1所示:

#### 2.4.2 確認集群服務器之間可SSH免密登錄
使用ssh工具登錄到每一臺服務器,執行命令ssh 主機名,確認每臺集群服務器均可SSH免密登錄。若無法SSH免密登錄,請參照實驗一的1.4.4節進行配置。
#### 2.4.3 修改HDFS配置文件
(1)設置JDK安裝目錄
~~~
編輯文件“/usr/cstor/hadoop/etc/hadoop/hadoop-env.sh”,找到如下一行:
export JAVA_HOME=${JAVA_HOME}
將這行內容修改為:
export JAVA_HOME=/usr/local/jdk1.7.0_79/
~~~
這里的“/usr/local/jdk1.7.0_79/”就是JDK安裝位置,如果不同,請根據實際情況更改。
(2)指定HDFS主節點
編輯文件“/usr/cstor/hadoop/etc/hadoop/core-site.xml”,將如下內容嵌入此文件里最后兩行的\<configuration>\\\</configuration>標簽之間:
~~~
<property><name>hadoop.tmp.dir</name><value>/usr/cstor/hadoop/cloud</value></property>
<property><name>fs.defaultFS</name><value>hdfs://master:8020</value></property>
~~~
(3)拷貝集群配置至其它服務器
在master機上執行下列命令,將配置好的hadoop拷貝至slaveX、client。
~~~
[root@master ~]# cat ~/data/2/machines
slave1
salve2
slave3
client
[root@master ~]# for x in `cat ~/data/2/machines` ; do echo $x ; scp -r /usr/cstor/hadoop/etc $x:/usr/cstor/hadoop ; done;
~~~
#### 2.4.4 啟動HDFS
在master服務器上格式化主節點:
~~~
[root@master ~]# hdfs namenode -format
~~~
配置slaves文件,將localhost修改為slave1~3:
~~~
[root@master ~]# vi /usr/cstor/hadoop/etc/hadoop/slaves
slave1
slave2
slave3
統一啟動HDFS:
[root@master ~]#cd /usr/cstor/hadoop
[root@master hadoop]# sbin/start-dfs.sh
~~~
#### 2.4.5 通過查看進程的方式驗證HDFS啟動成功
分別在master、slave1~3四臺機器上執行如下命令,查看HDFS服務是否已啟動。
~~~
[root@master sbin]# jps #jps查看java進程
~~~
若啟動成功,在master上會看到類似的如下信息:
~~~
6208 NameNode
6862 Jps
6462 SecondaryNameNode
~~~
而在slave1、slave2、slave3上會看到類似的如下信息:
~~~
6208 DataNode
6862 Jps
~~~
#### 2.4.6 使用client上傳文件
從client服務器向HDFS上傳文件。
~~~
[root@client ~]# hadoop fs -put ~/data/2/machines /
~~~
執行命令:hadoop fs -ls /,查看文件是否上傳成功。
如圖2-2所示:

- GitHub---資源收集
- 【GitHub】收錄總榜單
- 【Office & Markdown & PDF】資源收集
- 【前端】資源收集
- 【開源項目】資源收集
- 【代碼備份】資源收集
- 【代碼加密】資源收集
- 【好文章推薦】資源收集
- GitHub---實踐方案
- 【Laradock】實踐方案
- 【開發規范】實踐方案
- 【laravel-snappy】實踐方案
- 【隊列---Laravel-Horizon 】實踐方案
- 【檢索---Elasticsearch】實踐方案---簡單了解
- 【Laravel-admin】實踐方案
- 技術選型
- 技術選型結果
- PHP開發流程
- Laravel自帶異常
- 技術選型問題 & 解決方法
- 修改(Admin)文件夾路徑
- 兩個用戶表合并
- 創建Token,獲取接口數據
- CreateFreshApiToken中間件使用
- Generator從表生成文件,不包括遷移文件
- 添加用戶的同時生產令牌
- 其它參考文章
- Laravel-admin常見問題
- form(),show()獲取對象數據
- Form右上角按鈕重寫
- form回調中的錯誤提醒,回調傳參
- 【小工具類】實踐方案
- 字符串
- 數組
- 無限級分類遞歸
- 時間
- 正則表達式
- 文件
- 經緯度、時區
- DataEdit快捷操作類庫
- 數據庫表結構管理
- 【Guzzle】實踐方案---工具類
- Java---大數據在線實驗
- 基礎實驗操作
- 【一】基礎操作實驗
- HDFS
- 【二】部署HDFS
- 【三】讀寫HDFS文件
- YARN
- 【四】部署YARN集群
- MapReduce
- 【五】單詞計數
- Hive
- 【十】部署Hive
- 【十一】新建Hive表
- 【十二】Hive分區
- ZooKeeper
- 【二十】部署ZooKeeper
- 【二十一】進程協作
- HBase
- 【二十二】部署HBase
- 【二十三】新建HBase表
- Storm
- 【二十四】部署Storm
- 【二十五】實時WordCountTopology
- Kafka
- 【二十七】Kafka訂閱推送示例
- Redis
- 【二十九】Redis部署與簡單使用
- 【三十】MapReduce與Spark讀寫Redis
- MongoDB
- 【三十一】讀寫MongoDB
- MySQL
- 關于最重要的參數選項調整建議
- 索引,Explain優化工具
- 事務級別
- sql好的書寫習慣
- limit(分頁)
- 趕集網Mysql36條軍規
- 分庫分表技術演進&最佳實踐
- MariaDB 和 MySQL 全面對比
- 永遠不要在 MySQL 中使用“utf8”
- 看云--推薦的Mysql優化
- 完整、詳細的MySQL規范
- 慢查詢日志
- pt-query-digest結果分析
- Redis
- 看云-推薦的redis學習
- Memcache和Redis不同
- 阿里云Redis開發規范
- Centos7
- 虛擬機配置網絡
- 硬盤掛載、分區、文件大小
- 防火墻(firewalld、firewalld-cmd、systemctl、iptables)
- 兩個機器互相拷貝文件
- 查進程、查端口
- 壓縮、解壓
- 查看物理CPU個數、CPU內核數、線程數
- apt-get源--阿里
- RAID磁盤陣列
- Docker
- Dockerfile制作常用命令
- registry私有倉庫
- PHP_7.2
- Dockerfile
- php.ini
- 使用說明
- Nginx_1.15
- Dockerfile
- nginx.conf
- prod_nginx.conf
- 使用說明
- MySql_5.7
- Dockerfile
- my.cnf
- 使用說明
- redmine_3.4
- Dockerfile
- 使用說明
- gitlab-ce_11.9.6-ce.0
- 使用說明
- Redis_5.0
- Dockerfile
- redis.conf
- 使用說明
- Jenkins
- Dockerfile
- 使用說明
- webssh--python3.7
- Dockerfile
- 使用說明
- 進階使用
- 高階使用
- minio
- 使用說明
- aws_cloud9_ide
- 使用說明
- VNC
- 使用說明
- jdk1.8——yum安裝
- tomcat9——安裝
- guacamole——0.9.13
- libreoffice
- Dockerfile
- 使用說明
- Kubernetes
- kubectl常用命令
- 環境搭建(1.9.6)
- kubernetes1.9.6墻內離線部署
- kubernetes1.9.6單機器部署
- helm安裝
- helm常用命令
- Swoole
- 環境的搭建
- swoole的簡單實例
- 服務端的cli方式運行
- 客戶端的運行方式
- 定時任務的入門
- 刪除定時任務
- 初始化定時任務
- 日志管理
- 具體任務的異常捕獲
- 手動重啟shell腳本
- 閱讀感受
- 【讀書】登天的感覺——岳曉東
- 【讀書】為何家會傷人——武志紅
- 【感受】箭扣,一次就好
- 【讀書】思考與致富——拿破侖-希爾
- 【感受】做事講方法
- 【感受】未來暢想
- 【素材】智力問答
- 【百家】曾國藩家訓
- 【百家】正說和珅
- 【感受】談判小技巧
- 【讀書】股票作手回憶錄——利弗莫爾
- 【感受】最幸福的人——工匠
- 【收藏】土味情話大合集
- 【讀書】解憂雜貨店——東野圭吾
- 【收藏】家鄉名人
- 【讀書】把時間當作朋友——李笑來
- 【感受】輿論和八卦
- 【讀書】老人與海——海明威
- 【讀書】必然——凱文凱利
- 【經典】逍遙游——莊周
- Git+PHPStorm+Composer
- Git命令
- .gitignore忽略規則
- PHPStorm第一次使用
- PHPStorm關聯gitlab
- Composer修改鏡像源
- Xdebug
- PHP進階
- 緩存在高并發場景下的常見問題
- 一、緩存一致性問題
- 二、緩存并發問題
- 三、緩存穿透問題
- 四、緩存顛簸問題
- 五、緩存的雪崩現象
- 六、緩存無底洞現象
- Laravel源碼解析(知識點)
- 閉包、IOC容器服務綁定延遲加載
- 延遲靜態綁定基類
- 反射,依賴注入
- __callStatic 魔術方法,Facade 工作原理
- array_reduce,中間件解析
- Eloquent核心
- Laravel框架加載流程
- 線程、進程、協程
- Linux進程、線程、協程
- poll、epoll
- epoll原理
- Liunx線程調度算法
- 紅黑樹
- 同步/異步、阻塞/非阻塞
- PHP-FPM
- Nginx
- Swoole
- Go
- 驚群問題
- 線程模型比較
- 并發模型比較
- Lua
- OpenResty
- 數據一致性
- 悲觀鎖--VS--樂觀鎖
- 事務--mysql VS redis
- 事務嵌套--Doctrine VS Laravel
- 單體應用中執行順序問題
- 數據一致性問題描述
- 分布式理論
- 數據一致性---接口冪等性
- 分布式事務---2PC VS 3PC
- 分布式事務---TCC
- 分布式事務---基于消息
- 接口安全性
- PHP & Nginx
- 請求超時問題
- 兩者之間的通信原理
- TCP三次握手
- Nginx常用優化
- PHP數組底層原理
- PHP排序函數sort底層原理
- PHP函數---trim()
- 樹形數據在關系型庫中存儲
- 標簽(Tag)的各種設計