1. Hadoop概述
HADOOP是apache旗下的一套開源軟件平臺,利用服務器集群,根據用戶的自定義業(yè)務邏輯,對海量數據進行分布式處理
HADOOP的核心組件有:
HDFS(分布式文件系統(tǒng))
YARN(運算資源調度系統(tǒng))
MAPREDUCE(分布式運算編程框架)
2. HDFS的概念
hdfs是一個文件系統(tǒng),用于存儲文件,通過統(tǒng)一的命名空間–目錄樹來定位文件。它是分布式的,由很多服務器聯(lián)合起來實現其功能,集群中的服務器有各自的角色。主要特性如下
HDFS中的文件在物理上是分塊存儲(block),塊的大小可以通過配置參數( dfs.blocksize)來規(guī)定,默認大小在hadoop2.x版本中是128M,老版本中是64M.
HDFS文件系統(tǒng)會給客戶端提供一個統(tǒng)一的抽象目錄樹,客戶端通過路徑來訪問文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
目錄結構及文件分塊信息(元數據)的管理由namenode節(jié)點承擔
——namenode是HDFS集群主節(jié)點,負責維護整個hdfs文件系統(tǒng)的目錄樹,以及每一個路徑(文件)所對應的block塊信息(block的id,及所在的datanode服務器)
件的各個block的存儲管理由datanode節(jié)點承擔
—- datanode是HDFS集群從節(jié)點,每一個block都可以在多個datanode上存儲多個副本(副本數量也可以通過參數設置dfs.replicaTIon)
HDFS是設計成適應一次寫入,多次讀出的場景,且不支持文件的修改
3. hdfs不適用的場景
低延遲的數據訪問:hdfs的強項在與大量數據傳輸,延遲不適合他,10毫秒一下的訪問可以無視hdfs,不過hbase可以彌補這個缺陷。
太多小文件: namenode節(jié)點在內存中hold住了整個文件系統(tǒng)的元數據,因此文件的數量就會受到限制,每個文件的元數據大約150字節(jié),1百萬個文件,每個文件只占一個block,那么就需要300MB內存。你的服務器可以hold住多少呢?
多處寫和隨機修改:目前還不支持多處寫入以及通過偏量隨機修改。
4. namenodes和datanodes
hdfs集群有兩種類型的節(jié)點,一種為master及namenode,另一種為worker及datanodes。namenode節(jié)點管理文件系統(tǒng)的命名空間。它包含一個文件系統(tǒng)的樹,所有文件和目錄的原數據都在這個樹上,這些信息被存儲在本地磁盤的兩個文件中,image文件和edit log文件。文件相關的塊存在哪個塊中,塊在哪個地方,這些信息都是在系統(tǒng)啟動的時候加載namenode的內存中,并不會存儲在磁盤中。datanode節(jié)點在文件系統(tǒng)中充當的角色就是苦力,按照namenode和client的指令進行存儲或者檢索block,并且周期性的向namenode節(jié)點報告它存了哪些文件的block。
5. secondarynamenode
它是namenode的一個快照,會根據configuraTIon中設置的值來決定多少時間周期性的去cp一下namenode,記錄namenode中的metadata及其它數據。
6. NodeManager(NM)
NodeManager是YARN中每個節(jié)點上的代理,它管理Hadoop集群中單個計算節(jié)點包括與ResourceManger保持通信,監(jiān)督Container的生命周期管理,監(jiān)控每個Container的資源使用(內存、CPU等)情況,追蹤節(jié)點健康狀況。
7. ResourceManager
在YARN中,ResourceManager負責集群中所有資源的統(tǒng)一管理和分配,它接收來自各個節(jié)點(NodeManager)的資源匯報信息,并把這些信息按照一定的策略分配給各個應用程序(實際上是ApplicaTIonManagerRM與每個節(jié)點的NodeManagers (NMs)和每個應用ApplicaTIonMasters (AMs)一起工,b.ApplicationMasters負責與ResourceManager協(xié)商資源與NodeManagers合作啟動容器.
8. hdfs客服端常用命令 hadoop fs-ls///如果提示警告:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...原因:系統(tǒng)預裝的glibc庫是2.12版本,而hadoop期望是2.14版本,所以打印警告信息。 解決方案:在log4j日志中去除告警信息,在/hadoop-2.5.2/etc/hadoop/log4j.properties文件中添加:log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR-ls功能:顯示目錄信息 示例: hadoop fs-lshdfs://localhost:9000/備注:這些參數中,所有的hdfs路徑都可以簡寫-->hadoop fs-ls/等同于上一條命令的效果-mkdir功能:在hdfs上創(chuàng)建目錄 示例:hadoop fs-mkdir-p/aaa/bbb/cc/dd-moveFromLocal功能:從本地剪切粘貼到hdfs 示例:hadoop fs-moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd-moveToLocal功能:從hdfs剪切粘貼到本地 示例:hadoop fs-moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt--appendToFile 功能:追加一個文件到已經存在的文件末尾 示例:hadoop fs-appendToFile./hello.txt hdfs://hadoop-server01:9000/hello.txt可以簡寫為: Hadoop fs-appendToFile./hello.txt /hello.txt-cat功能:顯示文件內容 示例:hadoop fs-cat/hello.txt-chmod功能:linux文件系統(tǒng)中的用法一樣,對文件所屬權限 示例: hadoop fs-chmod666/hello.txt-copyFromLocal功能:從本地文件系統(tǒng)中拷貝文件到hdfs路徑去 示例:hadoop fs-copyFromLocal./jdk.tar.gz /aaa/-copyToLocal功能:從hdfs拷貝到本地 示例:hadoop fs-copyToLocal/aaa/jdk.tar.gz-cp功能:從hdfs的一個路徑拷貝hdfs的另一個路徑 示例: hadoop fs-cp/aaa/jdk.tar.gz /bbb/jdk.tar.gz.2-mv功能:在hdfs目錄中移動文件 示例: hadoop fs-mv/aaa/jdk.tar.gz/-get功能:等同于copyToLocal,就是從hdfs下載文件到本地 示例:hadoop fs-get/aaa/jdk.tar.gz-getmerge功能:合并下載多個文件 示例:比如hdfs的目錄 /aaa/下有多個文件:log.1,log.2,log.3,...hadoop fs-getmerge/aaa/log.*./log.sum-put功能:等同于copyFromLocal 示例:hadoop fs-put/aaa/jdk.tar.gz /bbb/jdk.tar.gz.2-rm功能:刪除文件或文件夾 示例:hadoop fs-rm-r/aaa/bbb/-rmdir功能:刪除空目錄 示例:hadoop fs-rmdir/aaa/bbb/ccc-df功能:統(tǒng)計文件系統(tǒng)的可用空間信息 示例:hadoop fs-df-h/-du功能:統(tǒng)計文件夾的大小信息 示例: hadoop fs-du-s-h/aaa/* -count 功能:統(tǒng)計一個指定目錄下的文件節(jié)點數量 示例:hadoop fs -count /aaa/9. java操作HDFS1.引入依賴org.apache.hadoophadoop-client2.6.12.測試類 publicclassOperationFileTest{FileSystem fs =null; Configuration conf =null;/** * 初始化文件系統(tǒng)操作的客戶端實例對象 */@Beforepublic void init()throwsIOException, URISyntaxException, InterruptedException { conf =newConfiguration();// uri和用戶身份 ---> 一個文件系統(tǒng)操作的客戶端實例對象fs = FileSystem.get(newURI("hdfs://192.168.133.11:9000"),conf,"root"); }/** * 上傳文件 */@Testpublic void testUpload()throwsIOException { fs.copyFromLocalFile(newPath("D:\examProject.rar"),newPath("/examProject.rar")); fs.close(); }/** * 下載文件 */@Testpublic void testDownload()throwsException{ Path remotePath =newPath("/examProject.rar"); Path localPath =newPath("f:/"); fs.copyToLocalFile(remotePath,localPath); fs.close(); }/** * conf加載的內容 */@Testpublic void testConf(){ Iterator