❶ hadoop常用shell命令怎麼用
一、常用的hadoop命令
1、hadoop的fs命令
#查看hadoop所有的fs命令
1
hadoop fs
#上傳文件(put與FromLocal都是上傳命令)
1
2
hadoop fs -put jdk-7u55-linux-i586.tar.gz hdfs://hucc01:9000/jdk
hadoop fs -FromLocal jdk-7u55-linux-i586.tar.gz hdfs://hucc01:9000/jdk
#下載命令(get與ToLocal都是下載命令)
1
2
hadoop fs -get hdfs://hucc01:9000/jdk jdk1.7
hadoop fs -ToLocal hdfs://hucc01:9000/jdk jdk1.7
#將本地一個或者多個文件追加到hdfs文件中(appendToFile)
1
hadoop fs -appendToFile install.log /words
#查詢hdfs的所有文件(ls)
1
hadoop fs -ls /
#幫助命令(help)
1
hadoop fs -help fs
#查看hdfs文件的內容(cat和text)
1
2
hadoop fs -cat /words
hadoop fs -text /words
#刪除hdfs文件(rm)
1
hadoop fs -rm -r /words
#統計hdfs文件和文件夾的數量(count)
1
hadoop fs -count -r /
#合並hdfs某個文件夾的文件,並且下載到本地(getmerge)
1
hadoop fs -getmerge / merge
#將本地文件剪切到hdfs,相當於對本地文件上傳後再刪除(moveFormLocal)
1
hadoop fs -moveFromLocal words /
#查看當前文件系統的使用狀態(df)
1
hadoop fs -df
二、常用的hdfs命令(這個用的比較多)
用法跟hadoop命令一樣,推薦2.0之後使用hdfs命令
1
hdfs dfs
❷ HDFS操作命令
HDFS命令基本格式:hadoop fs -cmd < args >
表格:
注意:以上表格中路徑包括hdfs中的路徑和linux中的路徑。對於容易產生歧義的地方,會特別指出「linux路徑」或者「hdfs路徑」。如果沒有明確指出,意味著是hdfs路徑。
HDFS有一個默認的工作目錄/user/$USER,其中$USER是用戶的登錄用戶名。不過目錄不會自動建立,需要mkdir建立它
命令格式:hadoop fs -mkdir
注意:支持級聯創建新目錄,Hadoop的mkdir命令會自動創建父目錄,類似於帶-p的linux命令
put命令從本地文件系統中 復制單個或多個 源路徑到目標文件系統,也支持從標准輸入設備中讀取輸入並寫入目標文件系統。分為本地上傳和上傳到HDFS中。
命令格式:hadoop fs -put filename
最後一個參數是句點,相當於放入了默認的工作目錄,等價於 hadoop fs -put example.txt /user/chen
上傳文件時,文件首先復制到DataNode上,只有所有的DataNode都成功接收完數據,文件上傳才是成功的。
命令格式:hadoop dfs put filename newfilename
從本地文件系統中復制單個或多個源路徑到目標文件系統。也支持從 標准輸入 中讀取輸入寫入目標文件系統。
採用-ls命令列出HDFS上的文件。在HDFS中未帶參數的-ls命令沒有返回任何值,它默認返回HDFS的home目錄下
的內容。在HDFS中,沒有當前工作目錄這樣一個概念,也沒有cmd這樣的命令。
命令格式:user@NameNode:hadoop$ bin/hadoop dfs -ls
如:
通過「-ls 文件夾名」 命令瀏覽HDFS下文件夾中的文件
命令格式:hadoop dfs -ls 文件夾名
通過該命令可以查看in文件夾中的所有文檔文件
通過「-cat 文件名」命令查看HDFS下文件夾中某個文件的內容
命令格式:hadoop$ bin/hadoop dfs -cat 文件名
通過這個命令可以查看in文件夾中所有文件的內容
通過「-get 文件按1 文件2」命令將HDFS中某目錄下的文件復制到本地系統的某文件中,並對該文件重新命名。
命令格式:hadoop dfs -get 文件名 新文件名
-get 命令與-put命令一樣,既可以操作目錄,也可以操作文件
通過「-rmr 文件」命令刪除HDFS下的文件
命令格式:hadoop$ bin/hadoop dfs -rmr 文件
-rmr 刪除文檔命令相當於delete的遞歸版本。
通過-format命令實現HDFS格式化
命令格式:user@NameNode:hadoop$ bin/hadoop NameNode -format
通過運行start-dfs.sh,就可以啟動HDFS了
命令格式:user@NameNode:hadoop$ bin/ start-dfs.sh
當需要退出HDFS時,通過stop-dfs.sh 就可以關閉HDFS
命令格式:user@NameNode:hadoop$ bin/ stop-dfs.sh
HDFS的命令遠不止這些,對於其他操作,可以通過-help commandName 命令列出清單。下面列舉一些命令進行說明。
(1)chgrp改變文件所屬的組命令
chgrp命令的用途是:更改文件或目錄的組所有權。
語法格式:hadoop fs -charg [-R] GROUP URL .....
使用-R將使改變在目錄結構下遞歸進行。命令的使用者必須是文件的所有者或者超級用戶。
(2)chmod改變文件的許可權
chmod用於改變文件或目錄的訪問許可權,這個Linux系統管理員最常用的命令之一。
使用方法:hadoop fs -chmod [-R] ...
使用-R將使改變在目錄結構下遞歸進行。命令的使用者必須是文件的所有者或者是超級用戶
(3)chown改變文件的擁有者
chown命令改變文件的擁有者。
使用方法:hadoop fs -chown [-R]....
使用-R將使改變在目錄結構下遞歸進行。命令的使用者必須是超級用戶。
(4)FromLocal命令
除了限定 源路徑 是只能是一個 本地文件 外,其他方面和put命令相似。
使用方法:hadoop fs -FromLocal <localsrc> URI
(5)ToLocal命令
除了限定 目標路徑 是一個 本地文件 外,其他方面和get命令類似。
使用方法:hadoop fs -ToLocal {-ignorecrc} {-crc} URI <localdst>
(6)cp命令
cp命令是將文件從源路徑復制到目標路徑。這個命令允許有多個源路徑,此時目標路徑必須是一個目錄。
使用方法:hadoop fs -cp URI [URI....] <dest>
返回值:成功返回0 ,失敗返回-1
(7)命令
命令顯示目錄中 所有文件的大小 ,或者當只指定一個文件時,顯示此文件的大小
使用方法:hadoop fs - URI [URI........]
返回值
成功返回0,失敗返回-1
(8)s命令
s是顯示 文件大小 的命令。
使用方法:hadoop fs -s <args>
(9)expunge命令
expunge是清空回收站的命令
使用方法:hadoop fs -expunge
(10)get命令
get是復制文件到本地文件系統的命令
使用方法:hadoop fs -get [-ignorecrc] [-crc] <localdst>
可用-ignorecrc選項復制CRC校驗失敗的文件:使用-CRC選項復制文件以及CRC信息。
返回值
成功返回0,失敗返回-1
(11)getmerge命令
getmerge命令用於接受一個源目錄和一個目標文件作為輸入,並且將源目錄中所有的文件合並成本地目標文件。
使用方法:hadoop fs -getmerge <src> <localdst> [addnl]
參數說明:addl是可選的,用於指定在每個文件結尾添加一個換行符;
假設在你的hdfs集群上有一個/user/hadoop/output目錄
裡面有作業執行的結果(多個文件組成)part-000000,part-000001,part-000002
然後就可以在本地使用vi local_file查看內容了
(12)ls命令
ls命令查看當前目錄下的信息
使用方法:hadoop fs -ls <args>
如果是 文件 ,則按照如下格式返迴文件信息:
文件名 <副本數>文件大小 修改日期 修改時間 許可權 用戶ID 組ID
如果是 目錄 ,則返回它直接子文件的一個列表,就像在UNIX中一樣。目錄返回i額表的信息如下:
目錄名<dir>修改日期 修改時間 許可權 用戶ID 組ID
返回值
成功返回0,失敗返回-1
(13)lsr命令
lsr命令是-ls命令的遞歸版,類似於UNIX中的ls-r。
使用方法:hadoop fs -lsr <args>
(14)movefromLocal命令
復制一份本地文件到hdfs,當成功後,刪除本地文件
使用方法:dfs -moveFromLocal <src> <dst>
(14.5)moveToLocal命令
類似於-get,但是當復制完成後,會刪除hdfs上的文件
使用方法:moveToLocal <src> <localDest>
(15)mv命令
將文件從源路徑移動到目標路徑。這個命令允許有多個源路徑,此時目標路徑必須是一個目錄
使用方法:hadoop fs -mv URI [URI.....] <dest>
備註:不允許在不同的文件系統間移動文件。
返回值
成功返回0,失敗返回-1
(16)put 命令
put命令從本地文件系統中復制單個或多個源路徑到目標文件系統,也支持從標准輸入中讀取輸入寫入目標文件系統
使用方法:hadoop fs -put <localsrc> .... <dst>
(17)rm命令
rm命令刪除指定的文件,只刪除非空目錄和文件。
使用方法:hadoop fs -rm URI [URI......]
請參考rmr命令了解遞歸刪除。
(18)rmr命令
rmr命令是delete命令的遞歸版本
使用方法:hadoop fs -rmr URI [URI.......]
返回值
成功返回0,失敗返回-1
(19)setrep命令
setrep命令可以改變一個文件的副本系數。
使用方法:hadoop fs -setrep [-R] <path>
參數說明:-R 選項用於遞歸改變目錄下所有文件的副本系數
返回值
成功返回0,失敗返回-1
(20)stat命令
stat命令用於返回指定路徑的統計信息
使用方法:hadoop fs -stat URI [URI......]
返回值
成功返回0,失敗返回-1
(21)tail命令
tail命令將文件尾部1KB的內容輸出到stdout。支持-f選項,行為和UNIX中一致
使用方法:hadoop fs -tail [-f] URI
返回值
成功返回0,失敗返回-1
(22)test命令
test命令是檢查命令,可以檢查文件是否存在、文件的大小等。
使用方法:hadoop fs -test -[ezd] URI
(23)text命令
text命令用於將源文件輸出問文本格式
使用方法:hadoop fs -text <src>
允許的格式是zip和TextRecordInputStream。
(24)touchz 命令
touchz命令用於創建一個0位元組的空文件。
使用方法: hadoop fs -touchz URI [URI....]
返回值
成功返回0,失敗返回-1
❸ [譯]HDFS 滾動升級和降級
原文
HDFS滾動升級可以升級單獨的HDFS守護進程. 例如, datanode們可以獨立於namenode來升級. 一個namenode也可以獨立於其他的namenode們來升級. namenode們也可以獨立於datanode們和journal node們升級.
在Hadoop版本2中, HDFS支持高可用(HA)namenode服務並結合兼容性. 這兩項能力使其可以在避免停機時間的情況升級HDFS. 要無停機地升級一個HDFS集群, 這個集群就必須是配置為高可用的.
如果升級後, 在新版中有任何在舊版本中不能使用的新特性晌叢, 那麼這次升級就必須按以下步驟進行:
在一個高可用集群中, 有至少2個namenodes(NNS), 多個datanodes(DNs), 少數JournalNodes(JNs)和少數Zookeeper節點(ZKNs). JNs相當穩定,在多數情況下, 升級HDFS時不需要升級. 在本文描述的滾動升級中, 只考慮升級NNs(namenodes)和DNs(datanodes), 但是JNs和ZKNs不考慮. 升級JNs和ZKNs可能會導致集群停機.(按: Zookeeper其實也可以進行滾動升級)
假設集群有兩個namenodes: NN1和NN2, 各種處於活動和待機狀態. 按以下步驟進行高可用集群升級:
在一個聯盟集群中, 有多個命名空間, 每個命名空間都有各自的活動和待機NNs. 升級一個聯盟集群的過程類似於升級非聯盟集群, 區別在於第一步和第四步在每一個命名空間上都執行, 而第二步在每一對活動和待機namenodes上執行. 例如:
對於非高可用的集群, 是不可能升級HDFS且避免停機, 因為要重啟namenodes. 不過, datanodes還是可以滾動升級的.
在一個非高可用集群中, 有一個Namenode(NN),一個SecondaryNameNode(SNN)和多個datanodes(DNs). 升級一個非高可用集群的過程類似於升級一個高可用集群, 除了第二步"升級活動和待機節點"要改成以下步驟:
當升級的版本不是需要的版本,或者在某些不太可能的情況下, 升級失敗了(因為新版本中的某些bug), 管理員可以選擇降級HDFS到升級之前的版本, 或者回滾到升級前的版本和狀態.
請注意, 降級可以用滾動方式進行, 但是回滾不行. 回滾時就要停機.
請注意, 降級和回滾只能在一個滾動升級開始後, 和升級終止之間進行. 一個升級過程可以被"結束", 降級或者回滾 其中之一操作終止. 所以慎謹塵, 結束升級,或者降級之後,或無法回滾, 或者結束後無法降級.
降級把系統恢復到升級前版本,且保持用戶數據. 假設在時間點T, 滾動升級開始, 這個升級被降級所終止的話, 在時間點T之前或者之後創建的文件都保持在HDFS上, 在時間點T之前或之後刪除的文件也是在HDFS里被刪除的.
在新版本和舊版本之間, 只有當兩邊的namenode版本和datanode版本還沒在這兩個版本之間改變時, 新版本才能降級到舊版本.(不清楚, 請賜教,謝謝. A newer release is downgradable to the pre-upgrade release only if both the namenode layout version and the datanode layout version are not changed between these two releases.)
在一個高可用集群, 當滾動升級從舊版本到寬禪新版本在進行中時, 是可以滾動方式降級的, 升級的機器回到舊版本. 同前例, 假設NN1和NN2各自在活動和待機狀態. 以下是無停機滾動降級的步驟:
請注意, datanodes必須在namenode降級之前降級, 因為通訊協議是向下兼容的而不是向上兼容的. 例如老版本的datanode可以和新版本的namenode通訊,但是新版本的datanode未必能和老版本的namenode通訊.
回滾把系統恢復到升級前版本, 還把用戶的數據恢復到升級前狀態. 假設在時間點T, 滾動升級開始, 這個升級被回滾所終止的話, 在時間點T之前創建的文件都保持在HDFS上, 時間點T之後創建的文件就不存在了. 在時間點T之前的文件在HDFS里被刪除的, 在時間點T之後刪除的文件就被恢復了.
從新版本回滾到舊版本是一直支持的. 但是, 回滾操作不能滾動執行. 這需要停機時間. 設NN1和NN2分別處於活動和待機狀態. 以下是回滾步驟:
執行一個滾動升級操作
提交一個關閉請求到指定的datanode. 如果upgrade選項指定了, 訪問這個datanode的客戶端都會被指示要等這個datanode重啟, 同時快速啟動模式也要被激活. 當重啟不夠及時, 客戶端就超市,並忽略這個datanode. 在這種情況下, 快速啟動模式就被關閉.
請注意, 這個命令並不會等到datanode完全關閉. "hdfs dfsadmin -getDatanodeInfo"命令可以檢查datanode是否被完成了關閉.
當一個滾動升級在進行中, -rollingUpgrade 啟動選項可以指定不同滾動升級行為
❹ HDFS糾刪碼
副本是昂貴的--在HDFS中默認的3副本機制有200%的存儲空間和其它的資源(比如:網路帶寬)開銷。然而,相對於低 I/O 活動的暖數據集和冷數據集,在正常的操作期間對其額外的副本很少訪問,但是仍然消耗與第一副本相同數量的資源。
因此,一個自然的改進是使用糾刪碼(Erasure Coding)替代副本機肢滑沒制,它使用更少的存儲空間提供相同的容錯級別,一個典型的糾刪碼設置,會使得存儲空間的開銷不超過50%;一個EC文件的副本因子是無意義的,它一直保持為1,並且不能通過命令 -setrep修改EC的副本因子的值。
磁碟陣列(RAID)是在存儲系統中,使用EC最出名的。RAID使用條 帶的方式實現的EC,它提讓寬供邏輯上序列的數據(比如文件)到更小的單元(比如比特、位元組、或塊),並存儲連續的單元到不同的磁碟上。在本指南的其餘部分,這種條帶分布單元被稱為條帶單元(或者單元),對於每一個條帶原始數據單元,計算並存儲一定數量的奇偶校驗單元,這個過程叫做編碼。通過對剩餘的數據和奇偶校驗單元解碼計算,可以恢復任意條帶單元的錯誤。
將EC和HDFS集成可以提高存儲效率,然而同樣提供傳統的基於副本機制的HDFS持久化部署,例如:3副本的文件有6個塊,將會消耗 6*3 = 18個塊的磁碟空間,但是使用EC(6個數據,3個校驗)部署,他將只消耗9個塊的磁碟空間。
在EC的環境中,條帶有若干主要的優點,首先,它能在線EC(使用EC的格式直接寫數據),避免轉換階段,直接節省存儲空間。在線EC通過並行利用多磁碟主軸增強I/O性能;這在高性能的網路的集群中尤其需要。其次,它自然的分發小文件到多個DataNodes,消除了將多個文件綁定到一個編碼組的需要,這會很大的簡化文件的操作,比如刪除、配額匯報和在聯邦集群中不同的Namespace之間遷移數據等。在典型的HDFS集群中,小文件占總存儲空間3/4以上的消耗,為了更好的支持小文件,在第一階段工作中,HDFS支持條帶的EC。在未來,HDFS也會支持連續的EC布局,查看設計文檔,更多的信息在issue HDFS-7285 中討論。
條帶的HDFS文件是由邏輯上的塊組構成,每個塊組包含一定數量的內部塊,為了減少額外的塊對NameNode內存消耗,提出了新的分層塊命名協議,塊組的ID可以從它的內部塊的任意 ID 中推斷出來,這允許塊組級別的管理,而不是塊級別的。
客戶端讀寫路徑被增強,可以並行處理一個塊組的多個內部塊;在輸出/寫入路徑, DFSStripedOutputStream 用於管理一組數據流,每個數據流對應一個DataNode,該DataNode在當前塊組中存儲一個內部塊,這些數據流大多是非同步工作;協調器負責操作整個塊組,包括結束當前的塊組、分配新的塊組等等。在輸入 / 讀路徑, DFSStripedInputStream 將請求的邏輯位元組范圍的數據轉換為存儲在DataNodes上的內部塊的范圍,然後並行的發布讀請求,在出現故障時,它發出額外的讀請求用於解碼。
DataNode會運行一個額外的 ErasureCodingWorker (ECWorker) 任務用於後台恢復失敗的EC塊,當NameNode檢歷納測到一個失敗的EC塊,它會選擇一個DataNode去做恢復的工作,恢復任務通過心跳響應傳遞至DataNode,這個過程類似於副本塊重新復制失敗的數據塊,重建失敗的塊有3個主要的任務:
使用專用的線程池並行的讀取輸入數據,基於EC策略,它將所有的讀請求調度到所有的源節點,並且只讀取最小數據量的輸入塊數用於重構。
從輸入數據中解碼出新的數據塊和奇偶校驗塊,所有丟失的數據塊和校驗塊一起解碼。
解碼完成後,恢復的數據塊被傳輸到目標DataNode節點。
為了使糾刪碼策略適合異構的工作方式,我們允許HDFS集群上的文件和目錄具有不同的副本和糾刪碼策略,糾刪碼策略封裝了如何編碼/解碼文件,每一個策略由以下信息部分定義:
這個包括在EC組(比如:6+3)中數據塊和校驗塊的數量,以及編解碼器演算法(比如: Reed-Solomon, XOR )
這決定了條帶讀寫的粒度,包括緩沖區大小和編碼工作。
策略被命名為數據塊數量-校驗塊數量-塊單元的大小,當前支持6種內置策略:RS-3-2-1024k, RS-6-3-1024k, RS-10-4-1024k, RS-LEGACY-6-3-1024k, XOR-2-1-1024k 和REPLICATION。
REPLICATION是一種特殊的策略,它只能被設置在目錄上,強制目錄採用3副本策略,而不是繼承它的祖先的糾刪碼策略,該策略使3副本目錄與糾刪碼目錄交叉成為可能。
REPLICATION 策略是一直啟用的,而其它的內置策略在默認的情況下是禁用的。
類似於HDFS存儲策略,糾刪碼策略是設置在目錄上的,當一個文件被創建,它繼承離它最近的祖先目錄的EC策略。
目錄級別的EC策略隻影響在該目錄下創建的新文件,一旦一個文件已經被創建,它的糾刪碼策略可以被查詢,但是不能改變,如果一個糾刪碼文件被重命名到一個不同的EC策略的目錄中,該文件會保留它之前存在的EC策略,轉換一個文件到不同的EC策略需要重寫它的數據,重寫數據是通過拷貝文件(比如:通過distcp)而不是重命名文件。
我們允許用戶通過XML文件的方式去定義它們自己的EC策略,該XML文件必須要有下面的3部分:
1) layoutversion: 表示EC策略文件格式的版本。
2) schemas: 這個包括所有用戶定義的EC約束
3) policies: 這個包括所有用戶定義的EC策略,每個策略由schema id和條帶單元的大小(cellsize)構成,
在hadoop conf目錄中有一個名稱叫 user_ec_policies.xml.template的樣本EC策略的XML文件。
因特爾 ISA-L 代表因特爾智能存儲加速庫, ISA-L 是為存儲應用程序優化的底層函數開源的集合,它包括在 AVX 和 AVX2 指令集上快速的塊 Reed-Solomon 類型的糾刪碼優化,HDFS糾刪碼可以利用ISA-L去加速編解碼計算,ISA-L支持大多數開源的操作系統,包括linux和windows,ISA-L默認是不啟動的,有關如何啟動ISA-L,請看下面的說明。
糾刪碼在集群的CPU和網路方面提出了額外的要求。
編碼和解碼工作會消耗HDFS客戶端和DataNodes上額外的CPU。
糾刪碼文件也分布在機架之間,用於機架容錯,這意味著當讀取和寫入條帶文件,大多數操作是在機架外的,因此,網路對分帶寬非常重要的。
對於機架容錯來說,至少擁有與配置的EC條帶寬度相同的機架數量也是很重要的,對於EC策略RS (6,3),這意味著至少要有9個機架,理想的情況下要有10或者11個機架用於處理計劃內和計劃外的停機。對於機架數量少於條帶寬度的集群,HDFS不能維護機架容錯,但是仍然會分散條帶文件到多個節點為了節點級別的容錯。
默認情況下,所有內置的糾刪碼策略是被禁用的,但是定義在參數dfs.namenode.ec.system.default.policy中的除外,該策略在默認情況下是啟用的。集群管理員可以根據集群的大小和希望的容錯屬性使用命令hdfs ec [-enablePolicy -policy <policyName>]啟用一組策略;例如,對於一個擁有9個機架的集群,類似RS-10-4-1024k 這樣的策略不能達到機架級別的容錯,而策略RS-6-3-1024k 或者RS-3-2-1024k更適合。如果管理員只關心節點級別的容錯,在至少有14個DataNodes的集群中策略RS-10-4-1024k也是適合的。
系統默認的EC策略可以通過參數『dfs.namenode.ec.system.default.policy』 來配置,在這種配置下,當命令 『-setPolicy』沒有指定策略名稱的參數時,默認的策略將會被使用。
默認情況下,參數 『dfs.namenode.ec.system.default.policy』 的值為「RS-6-3-1024k」,使用Reed-Solomon和XOR實現的編解碼器可以使用客戶端和DataNode節點指定如下的關鍵字配置:io.erasurecode.codec.rs.rawcoders用來指定默認的RS編解碼器,io.erasurecode.codec.rs-legacy.rawcoders用於指定legacy RS編解碼器,io.erasurecode.codec.xor.rawcoders用於指定XOR編解碼器;用戶也可以使用類似關鍵字io.erasurecode.codec.self-defined-codec.rawcoders來配置自定義的編解碼器。這些關鍵字的值是帶有回退機制的編碼器名稱的列表。這些編解碼器工廠以指定的配置的值有序的被載入,直到一個編解碼器被成功的載入,默認的RS和XOR編解碼器配置更喜歡本地實現,而不是純java實現;RS-LEGACY沒有本地編解碼器實現,因此默認的只能是純java的實現;所有這些編解碼器都有純java的實現;對於默認的RS編解碼器,它也有一個本地實現,利用英特爾 ISA-L庫提高編解碼器性能;對於XOR編解碼器,也支持利用英特爾 ISA-L庫提升編解碼的性能的本地實現;請參閱「Enable Intel ISA-L」獲取更詳細的信息。默認的RSLegacy的實現是純java的,默認的RS和XOR是使用了因特爾ISA-L庫本地實現的,在DataNodes上的糾刪碼後台恢復工作也可以使用下面的參數被調優:
1) dfs.datanode.ec.reconstruction.stripedread.timeout.millis --條帶讀取超時時間,默認值 5000 ms
2) dfs.datanode.ec.reconstruction.stripedread.buffer.size --讀取服務的緩存大小,默認值 64K
3) dfs.datanode.ec.reconstruction.threads -- DataNode用於後台重構工作的線程數量,默認值 8 個線程
4) dfs.datanode.ec.reconstruction.xmits.weight -- 與副本塊恢復 相比,EC後台恢復任務使用的xmits 的相對權重,默認值0.5,設置它的值為0去禁用計算EC恢復任務的權重,也就是說,EC任務總是1 xmits。通過計算出讀數據流的數量和寫數據流的數量的最大值來計算出糾刪碼恢復任務的xmits。例如,如果一個EC恢復任務需要從6個節點讀取數據,往2個節點寫入數據,它擁有的 xmits 是max(6, 2) * 0.5 = 3,復制文件的恢復任務總是計算為1xmit,NameNode利用dfs.namenode.replication.max-streams減去DataNode上總的xmitsInProgress(合並來自副本文件和EC文件的xmits) ,以便調度恢復任務到這個DataNode。
HDFS利用因特爾ISA-L庫去提高默認的RS本地實現的編解碼器的編解碼計算速度,開啟並使用英特爾ISA-L庫,需要3步:
1)構建ISA-L庫,請參閱官方的網站 「 https://github.com/01org/isa-l/ 」 獲取詳情信息。
2)構建帶有ISA-L支持的Hadoop,請參閱源碼中BUILDING.txt文件中的 「Build instructions for Hadoop」中的「Intel ISA-L build options」部分。
3)使用-Dbundle.isal拷貝 isal.lib 目錄中的內容到最終的tar文件中。
使用該tar文件部署Hadoop,確保ISA-L是在HDFS客戶端和DataNodes端是可用的。為了驗證ISA-L能夠被Hadoop正確的檢測到,運行命令 hadoop checknative來驗證。
HDFS提供了EC的子命令用於執行糾刪碼相關的管理命令。
hdfs ec [generic options] [-setPolicy -path <path> [-policy <policyName>] [-replicate]] [-getPolicy -path <path>] [-unsetPolicy -path <path>] [-listPolicies] [-addPolicies -policyFile <file>] [-listCodecs] [-enablePolicy -policy <policyName>] [-disablePolicy -policy <policyName>] [-help [cmd ...]]
下面是關於每個命令的詳情:
[-setPolicy -path <path> [-policy <policyName>] [-replicate]]
在指定的目錄的路徑上設置糾刪碼策略。
path:HDFS中的目錄,這是一個強制的參數,設置一個策略隻影響新創建的文件,不影響已經存在的文件。
policyName:在這個目錄下的文件上使用的糾刪碼策略,如果配置了參數『dfs.namenode.ec.system.default.policy』,這個參數可以被省略,這時路徑的EC策略將會被設置成配置文件中的默認值。
-replicate:在目錄上應用指定的REPLICATION策略,強制目錄採用3副本復制方案。
-replicate 和-policy <policyName>是可選的參數,它們不能同時被指定。
[-getPolicy -path <path>]
獲取在指定路徑上目錄或者文件的糾刪碼策略的詳情。
[-unsetPolicy -path <path>]
取消之前使用setPolicy 在目錄上設置的糾刪碼策略。如果目錄是從祖先中繼承的糾刪碼策略,unsetPolicy 是一個空操作,即在沒有明確設置策略的目錄上取消策略將不會返回錯誤。
[-listPolicies ]
列出所有在HDFS中注冊的糾刪碼策略,只有啟用的策略才能使用setPolicy 命令。
[-addPolicies -policyFile <file>]
添加一個糾刪碼策略的列表,請參閱模板策略文件etc/hadoop/user_ec_policies.xml.template,最大的條帶單元大小被定義在屬性 『dfs.namenode.ec.policies.max.cellsize』 中,默認值是4MB,當前的HDFS中總共允許用戶添加64個策略,被添加的策略ID的范圍是64~127,如果已經有64個策略被添加,再添加策略將會失敗。
[-listCodecs]
獲取系統中支持的糾刪碼編解碼器和coder列表。一個coder是一個編解碼器的實現,一個編解碼器可以有不同的實現,因此會有不同的coder,編解碼器的coders採用後備的順序被列出。
[-removePolicy -policy <policyName>]
移除一個糾刪碼策略。
[-enablePolicy -policy <policyName>]
啟用一個糾刪碼策略
[-disablePolicy -policy <policyName>]
禁用一個糾刪碼策略。
由於大量的技術挑戰,在糾刪碼文件上不支持某些HDFS的寫操作,比如hflush, hsync 和append操作。
在糾刪碼文件上使用append()將會拋出IOException。
在DFSStripedOutputStream 上執行hflush() 和hsync()是空操作,因此,在糾刪碼文件上調用hflush() 或者hsync()不能保證數據被持久化。
客戶端可以使用 StreamCapabilities 提供的API去查詢一個OutputStream 是否支持hflush() 和hsync(),如果客戶端渴望數據通過hflush() 和hsync()持久化,當前的補救措施是在非糾刪碼目錄中創建3副本文件,或則使用FSDataOutputStreamBuilder#replicate()提供的API在糾刪碼目錄中創建3副本文件。
❺ 如何判斷hdfs(hadoop)上的路徑是文件還是目錄。
先用hdfsGetPathInfo 得到一個hdfsFileInfo類型者襲答的結構體,
get_real_path(dsh, s, real_path);
hdfsFileInfo * pt_hdfs_file_info = hdfsGetPathInfo(hdfs,real_path);//
這個結構體中有個kind屬性,就是來區分是文件還是目錄
typedef struct {
tObjectKind mKind; /* file or directory */
char *mName; /* the name of the file */禪譽
tTime mLastMod; /* the last modification time for the file in seconds */
tOffset mSize; /首慧* the size of the file in bytes */
short mReplication; /* the count of replicas */
tOffset mBlockSize; /* the block size for the file */
char *mOwner; /* the owner of the file */
char *mGroup; /* the group associated with the file */
short mPermissions; /* the permissions associated with the file */
tTime mLastAccess; /* the last access time for the file in seconds */
} hdfsFileInfo;
❻ spark、hive、impala、hdfs的常用命令
對spark、hive、impala、hdfs的常用命令作了如下總結,歡迎大家補充!
1. Spark的使用:
以通過SecureCRT訪問IP地址:10.10.234.198 為例進行說明:
先輸入:ll //查詢集群是否裝有spark
>su - mr
>/home/mr/spark/bin/beeline -u "jdbc:hive2:/bigdata198:18000/" -n mr -p ""
>show databases; //顯示其中資料庫,例如
>use bigmax; //使用資料庫bigmax
>show tables; //查詢目錄中所有的表
>desc formatted TableName; //顯示表的詳細信息,包括分區、欄位、地址等信息
>desc TableName; //顯示表中的欄位和分區信息
>select count(*) from TableName; //顯示表中數據數量,可以用來判斷表是否為空
>drop table TableName; //刪除表的信息
>drop bigmax //刪除資料庫bigmax
>describe database zxvmax //查詢資料庫zxvmax信息
創建一個表
第一步:
>create external table if not exists lte_Amaze //創建一個叫lte_Amaze的表
( //括弧中每一行為表中的各個欄位的名稱和其所屬的數據類型,並用空格隔開
DateTime String,
MilliSec int,
Network int,
eNodeBID int,
CID int,
IMSI String,
DataType int,
AoA int,
ServerRsrp int,
ServerRsrq int,
TA int,
Cqi0 Tinyint,
Cqi1 Tinyint //注意,最後一個欄位結束後,沒有逗號
)
partitioned by (p_date string, p_hour INT) //以p_date和p_hour作為分區
row format delimited fields terminated by ',' /*/*表中行結構是以逗號作為分隔符,與上邊的表中欄位以逗號結尾相一致*/
stored as textfile; //以文本格式進行保存
第二步:添加分區,指定分區的位置
>alter table lte_Amaze add partition (p_date='2015-01-27',p_hour=0) location'/lte/nds/mr/lte_nds_cdt_uedetail/p_date=2015-01-27/p_hour=0';
//添加lte_Amaze表中分區信息,進行賦值。
//並制定分區對應目錄/lte/nds/mr下表lte_nds_cdt_uedetail中對應分區信息
第三步:察看添加的結果
>show partitions lte_Amaze; //顯示表的分區信息
2. hdfs使用:
#su - hdfs //切換到hdfs用戶下 、
#hadoop fs –ls ///查看進程
# cd /hdfs/bin //進入hdfs安裝bin目錄
>hadoop fs -ls /umtsd/cdt/ //查詢/umtsd/cdt/文件目錄
>hadoop fs -mkdir /umtsd/test //在/umtsd目錄下創建test目錄
>hadoop fs -put /home/data/u1002.csv /impala/data/u5002 //將home/data/u1002.csv這個文件put到hdfs文件目錄上。put到hdfs上的數據文件以逗號「,」分隔符文件(csv),數據不論類型,直接是數據,沒有雙引號和單引號
>hadoop fs -rm /umtsd/test/test.txt //刪除umtsd/test目錄下的test.txt文件
>hadoop fs -cat /umtsd/test/test.txt //查看umtsd/test目錄下的test.txt文件內容
3hive操作使用:
#su - mr //切換到mr用戶下
#hive //進入hive查詢操作界面
hive>show tables; //查詢當前創建的所有表
hive>show databases; //查詢當前創建的資料庫
hive>describe table_name; {或者desc table_name}//查看錶的欄位的定義和分區信息,有明確區分(impala下該命令把分區信息以欄位的形式顯示出來,不怎麼好區分)
hive> show partitions table_name; //查看錶對應數據現有的分區信息,impala下沒有該命令
hive> quit;//退出hive操作界面
hive>desc formatted table_name; 查看錶結構,分隔符等信息
hive> alter table ceshi change id id int; 修改表的列數據類型 //將id數據類型修改為int 注意是兩個id
hive> SHOW TABLES '.*s'; 按正條件(正則表達式)顯示表,
[mr@aico ~]$ exit; 退出mr用戶操作界面,到[root@aico]界面
impala操作使用:
#su - mr //切換到mr用戶下
#cd impala/bin //進入impala安裝bin目錄
#/impala/bin> impala-shell.sh -i 10.10.234.166/localhost //進入impala查詢操作界面
[10.10.234.166:21000] >show databases; //查詢當前創建的資料庫
[10.10.234.166:21000] >use database_name; //選擇使用資料庫,默認情況下是使用default資料庫
[10.10.234.166:21000] > show tables; //查詢當前資料庫下創建的所有表
[10.10.234.166:21000] >describe table_name; //查看錶的欄位的定義,包括分區信息,沒有明確區分
[10.10.234.166:21000] > describe formatted table_name; //查看錶對應格式化信息,包括分區,所屬資料庫,創建用戶,創建時間等詳細信息。
[10.10.234.166:21000] >refresh table_name; //刷新一下,保證元數據是最新的
[10.10.234.166:21000] > alter TABLE U107 ADD PARTITION(reportDate="2013-09-27",rncid=487)LOCATION '/umts/cdt/
MREMITABLE/20130927/rncid=487' //添加分區信息,具體的表和數據的對應關系
[10.10.234.166:21000] > alter TABLE U100 drop PARTITION(reportDate="2013-09-25",rncid=487); //刪除現有的分區,數據與表的關聯
[10.10.234.166:21000] >quit; //退出impala操作界面
[mr@aicod bin]$ impala-shell; 得到welcome impala的信息,進入impala 查詢操作界面
[aicod:21000] > 按兩次tab鍵,查看可以用的命令
alter describe help profile shell values
connect drop history quit show version
create exit insert select unset with
desc explain load set use
❼ hdfs命令查找文件所在路徑
指令
hadoop fsck /user/hadoop/filename -files -blocks -locations -racks
-files 文件分塊信息,
-blocks 在帶-files參數後才顯示block信息
-locations 在帶-blocks參數後才顯示block塊所在datanode的具體IP位置,
-racks 在帶-files參數後顯示機架位置
注意:此命令只能在namenode里輸入,在datanode里輸入會報錯的
❽ 大數據雲計算好不好學習
說一下大數據的四個典型的特徵:
數據量大;
數據類型繁多,(結構化、非結構化文本、日誌、視頻、圖片、地理位置等);
商業價值高,但需要在海量數據之上,通過數據分析與機器學習快速的挖掘出來;
處理時效性高,海量數據的處理需求不再局限在離線計算當中。
第一章:Hadoop
在大數據存儲和計算中Hadoop可以算是開山鼻祖,現在大多開源的大數據框架都依賴Hadoop或者與它能很好的兼容。
關於Hadoop,你至少需要搞清楚這些是什麼:
自己學會如何搭建Hadoop,先讓它跑起來。建議先使用安裝包命令行安裝,不要使用管理工具安裝。現在都用Hadoop 2.0。
目錄操作命令;上傳、下載文件命令;提交運行MapRece示常式序;打開Hadoop WEB界面,查看Job運行狀態,查看Job運行日誌。知道Hadoop的系統日誌在哪裡。
以上完成之後,就應該去了解他們的原理了:
MapRece:如何分而治之;HDFS:數據到底在哪裡,究竟什麼才是副本;
Yarn到底是什麼,它能幹什麼;NameNode到底在幹些什麼;Resource Manager到底在幹些什麼;
如果有合適的學習網站,視頻就去聽課,如果沒有或者比較喜歡書籍,也可以啃書。當然最好的方法是先去搜索出來這些是干什麼的,大概有了概念之後,然後再去聽視頻。
第二章:更高效的WordCount
在這里,一定要學習SQL,它會對你的工作有很大的幫助。
就像是你寫(或者抄)的WordCount一共有幾行代碼?但是你用SQL就非常簡單了,例如:
SELECT word,COUNT(1) FROM wordcount GROUP BY word;
這便是SQL的魅力,編程需要幾十行,甚至上百行代碼,而SQL一行搞定;使用SQL處理分析Hadoop上的數據,方便、高效、易上手、更是趨勢。不論是離線計算還是實時計算,越來越多的大數據處理框架都在積極提供SQL介面。
另外就是SQL On Hadoop之Hive於大數據而言一定要學習的。
什麼是Hive?
官方解釋如下:The Apache Hive data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage and queried using SQL syntax。
為什麼說Hive是數據倉庫工具,而不是資料庫工具呢?
有的朋友可能不知道數據倉庫,數據倉庫是邏輯上的概念,底層使用的是資料庫,數據倉庫中的數據有這兩個特點:最全的歷史數據(海量)、相對穩定的;所謂相對穩定,指的是數據倉庫不同於業務系統資料庫,數據經常會被更新,數據一旦進入數據倉庫,很少會被更新和刪除,只會被大量查詢。而Hive,也是具備這兩個特點,因此,Hive適合做海量數據的數據倉庫工具,而不是資料庫工具。
了解了它的作用之後,就是安裝配置Hive的環節,當可以正常進入Hive命令行是,就是安裝配置成功了。
了解Hive是怎麼工作的
學會Hive的基本命令:
創建、刪除表;載入數據到表;下載Hive表的數據;
MapRece的原理(還是那個經典的題目,一個10G大小的文件,給定1G大小的內存,如何使用Java程序統計出現次數最多的10個單詞及次數);
HDS讀寫數據的流程;向HDFS中PUT數據;從HDFS中下載數據;
自己會寫簡單的MapRece程序,運行出現問題,知道在哪裡查看日誌;
會寫簡單的Select、Where、group by等SQL語句;
Hive SQL轉換成MapRece的大致流程;
Hive中常見的語句:創建表、刪除表、往表中載入數據、分區、將表中數據下載到本地;
從上面的學習,你已經了解到,HDFS是Hadoop提供的分布式存儲框架,它可以用來存儲海量數據,MapRece是Hadoop提供的分布式計算框架,它可以用來統計和分析HDFS上的海量數據,而Hive則是SQL On Hadoop,Hive提供了SQL介面,開發人員只需要編寫簡單易上手的SQL語句,Hive負責把SQL翻譯成MapRece,提交運行。
此時,你的」大數據平台」是這樣的:那麼問題來了,海量數據如何到HDFS上呢?
第三章:數據採集
把各個數據源的數據採集到Hadoop上。
3.1 HDFS PUT命令
這個在前面你應該已經使用過了。put命令在實際環境中也比較常用,通常配合shell、python等腳本語言來使用。建議熟練掌握。
3.2 HDFS API
HDFS提供了寫數據的API,自己用編程語言將數據寫入HDFS,put命令本身也是使用API。
實際環境中一般自己較少編寫程序使用API來寫數據到HDFS,通常都是使用其他框架封裝好的方法。比如:Hive中的INSERT語句,Spark中的saveAsTextfile等。建議了解原理,會寫Demo。
3.3 Sqoop
Sqoop是一個主要用於Hadoop/Hive與傳統關系型資料庫,Oracle、MySQL、SQLServer等之間進行數據交換的開源框架。就像Hive把SQL翻譯成MapRece一樣,Sqoop把你指定的參數翻譯成MapRece,提交到Hadoop運行,完成Hadoop與其他資料庫之間的數據交換。
自己下載和配置Sqoop(建議先使用Sqoop1,Sqoop2比較復雜)。了解Sqoop常用的配置參數和方法。
使用Sqoop完成從MySQL同步數據到HDFS;使用Sqoop完成從MySQL同步數據到Hive表;如果後續選型確定使用Sqoop作為數據交換工具,那麼建議熟練掌握,否則,了解和會用Demo即可。
3.4 Flume
Flume是一個分布式的海量日誌採集和傳輸框架,因為「採集和傳輸框架」,所以它並不適合關系型資料庫的數據採集和傳輸。Flume可以實時的從網路協議、消息系統、文件系統採集日誌,並傳輸到HDFS上。
因此,如果你的業務有這些數據源的數據,並且需要實時的採集,那麼就應該考慮使用Flume。
下載和配置Flume。使用Flume監控一個不斷追加數據的文件,並將數據傳輸到HDFS;Flume的配置和使用較為復雜,如果你沒有足夠的興趣和耐心,可以先跳過Flume。
3.5 阿里開源的DataX
現在DataX已經是3.0版本,支持很多數據源。
第四章:把Hadoop上的數據搞到別處去
Hive和MapRece進行分析了。那麼接下來的問題是,分析完的結果如何從Hadoop上同步到其他系統和應用中去呢?其實,此處的方法和第三章基本一致的。
HDFS GET命令:把HDFS上的文件GET到本地。需要熟練掌握。
HDFS API:同3.2.
Sqoop:同3.3.使用Sqoop完成將HDFS上的文件同步到MySQL;使用Sqoop完成將Hive表中的數據同步到MySQL。
如果你已經按照流程認真完整的走了一遍,那麼你應該已經具備以下技能和知識點:
知道如何把已有的數據採集到HDFS上,包括離線採集和實時採集;
知道sqoop是HDFS和其他數據源之間的數據交換工具;
知道flume可以用作實時的日誌採集。
從前面的學習,對於大數據平台,你已經掌握的不少的知識和技能,搭建Hadoop集群,把數據採集到Hadoop上,使用Hive和MapRece來分析數據,把分析結果同步到其他數據源。
接下來的問題來了,Hive使用的越來越多,你會發現很多不爽的地方,特別是速度慢,大多情況下,明明我的數據量很小,它都要申請資源,啟動MapRece來執行。
第五章:SQL
其實大家都已經發現Hive後台使用MapRece作為執行引擎,實在是有點慢。因此SQL On Hadoop的框架越來越多,按我的了解,最常用的按照流行度依次為SparkSQL、Impala和Presto.這三種框架基於半內存或者全內存,提供了SQL介面來快速查詢分析Hadoop上的數據。
我們目前使用的是SparkSQL,至於為什麼用SparkSQL,原因大概有以下吧:使用Spark還做了其他事情,不想引入過多的框架;Impala對內存的需求太大,沒有過多資源部署。
5.1 關於Spark和SparkSQL
什麼是Spark,什麼是SparkSQL。
Spark有的核心概念及名詞解釋。
SparkSQL和Spark是什麼關系,SparkSQL和Hive是什麼關系。
SparkSQL為什麼比Hive跑的快。
5.2 如何部署和運行SparkSQL
Spark有哪些部署模式?
如何在Yarn上運行SparkSQL?
使用SparkSQL查詢Hive中的表。Spark不是一門短時間內就能掌握的技術,因此建議在了解了Spark之後,可以先從SparkSQL入手,循序漸進。
關於Spark和SparkSQL,如果你認真完成了上面的學習和實踐,此時,你的」大數據平台」應該是這樣的。
第六章:數據多次利用
請不要被這個名字所誘惑。其實我想說的是數據的一次採集、多次消費。
在實際業務場景下,特別是對於一些監控日誌,想即時的從日誌中了解一些指標(關於實時計算,後面章節會有介紹),這時候,從HDFS上分析就太慢了,盡管是通過Flume採集的,但Flume也不能間隔很短就往HDFS上滾動文件,這樣會導致小文件特別多。
為了滿足數據的一次採集、多次消費的需求,這里要說的便是Kafka。
關於Kafka:什麼是Kafka?Kafka的核心概念及名詞解釋。
如何部署和使用Kafka:使用單機部署Kafka,並成功運行自帶的生產者和消費者例子。使用Java程序自己編寫並運行生產者和消費者程序。Flume和Kafka的集成,使用Flume監控日誌,並將日誌數據實時發送至Kafka。
如果你認真完成了上面的學習和實踐,此時,你的」大數據平台」應該是這樣的。
這時,使用Flume採集的數據,不是直接到HDFS上,而是先到Kafka,Kafka中的數據可以由多個消費者同時消費,其中一個消費者,就是將數據同步到HDFS。
如果你已經認真完整的學習了以上的內容,那麼你應該已經具備以下技能和知識點:
為什麼Spark比MapRece快。
使用SparkSQL代替Hive,更快的運行SQL。
使用Kafka完成數據的一次收集,多次消費架構。
自己可以寫程序完成Kafka的生產者和消費者。
從前面的學習,你已經掌握了大數據平台中的數據採集、數據存儲和計算、數據交換等大部分技能,而這其中的每一步,都需要一個任務(程序)來完成,各個任務之間又存在一定的依賴性,比如,必須等數據採集任務成功完成後,數據計算任務才能開始運行。如果一個任務執行失敗,需要給開發運維人員發送告警,同時需要提供完整的日誌來方便查錯。
第七章:越來越多的分析任務
不僅僅是分析任務,數據採集、數據交換同樣是一個個的任務。這些任務中,有的是定時觸發,有點則需要依賴其他任務來觸發。當平台中有幾百上千個任務需要維護和運行時候,僅僅靠crontab遠遠不夠了,這時便需要一個調度監控系統來完成這件事。調度監控系統是整個數據平台的中樞系統,類似於AppMaster,負責分配和監控任務。
7.1 Apache Oozie
Oozie是什麼?有哪些功能?
Oozie可以調度哪些類型的任務(程序)?
Oozie可以支持哪些任務觸發方式?
安裝配置Oozie。
7.2 其他開源的任務調度系統
Azkaban,light-task-scheler,Zeus,等等。另外,我這邊是之前單獨開發的任務調度與監控系統,具體請參考《大數據平台任務調度與監控系統》。
第八章:我的數據要實時
在第六章介紹Kafka的時候提到了一些需要實時指標的業務場景,實時基本可以分為絕對實時和准實時,絕對實時的延遲要求一般在毫秒級,准實時的延遲要求一般在秒、分鍾級。對於需要絕對實時的業務場景,用的比較多的是Storm,對於其他准實時的業務場景,可以是Storm,也可以是Spark Streaming。當然,如果可以的話,也可以自己寫程序來做。
8.1 Storm
什麼是Storm?有哪些可能的應用場景?
Storm由哪些核心組件構成,各自擔任什麼角色?
Storm的簡單安裝和部署。
自己編寫Demo程序,使用Storm完成實時數據流計算。
8.2 Spark Streaming
什麼是Spark Streaming,它和Spark是什麼關系?
Spark Streaming和Storm比較,各有什麼優缺點?
使用Kafka + Spark Streaming,完成實時計算的Demo程序。
至此,你的大數據平台底層架構已經成型了,其中包括了數據採集、數據存儲與計算(離線和實時)、數據同步、任務調度與監控這幾大模塊。接下來是時候考慮如何更好的對外提供數據了。
第九章:數據要對外
通常對外(業務)提供數據訪問,大體上包含以下方面。
離線:比如,每天將前一天的數據提供到指定的數據源(DB、FILE、FTP)等;離線數據的提供可以採用Sqoop、DataX等離線數據交換工具。
實時:比如,在線網站的推薦系統,需要實時從數據平台中獲取給用戶的推薦數據,這種要求延時非常低(50毫秒以內)。根據延時要求和實時數據的查詢需要,可能的方案有:HBase、Redis、MongoDB、ElasticSearch等。
OLAP分析:OLAP除了要求底層的數據模型比較規范,另外,對查詢的響應速度要求也越來越高,可能的方案有:Impala、Presto、SparkSQL、Kylin。如果你的數據模型比較規模,那麼Kylin是最好的選擇。
即席查詢:即席查詢的數據比較隨意,一般很難建立通用的數據模型,因此可能的方案有:Impala、Presto、SparkSQL。
這么多比較成熟的框架和方案,需要結合自己的業務需求及數據平台技術架構,選擇合適的。原則只有一個:越簡單越穩定的,就是最好的。
❾ 在hadoop中什麼命令的功能是將一個或多個
1、啟動hadoop所有進程
start-all.sh等價於start-dfs.sh + start-yarn.sh
但是一般不推薦使用start-all.sh(因為開源框架中內部命令啟動有很多問題)。
2、單進程啟動。
sbin/start-dfs.sh
---------------
sbin/hadoop-daemons.sh --config .. --hostname .. start namenode ...
sbin/hadoop-daemons.sh --config .. --hostname .. start datanode ...
sbin/hadoop-daemons.sh --config .. --hostname .. start sescondarynamenode ...
sbin/hadoop-daemons.sh --config .. --hostname .. start zkfc ... //
sbin/start-yarn.sh
--------------
libexec/yarn-config.sh
sbin/yarn-daemon.sh --config $YARN_CONF_DIR start resourcemanager
sbin/yarn-daemons.sh --config $YARN_CONF_DIR start nodemanager
3、常用命令
1、查看指定目錄下內容
hdfs dfs –ls [文件目錄]
hdfs dfs -ls -R / //顯式目錄結構
eg: hdfs dfs –ls /user/wangkai.pt
2、打開某個已存在文件
hdfs dfs –cat [file_path]
eg:hdfs dfs -cat /user/wangkai.pt/data.txt
3、將本地文件存儲至hadoop
hdfs dfs –put [本地地址] [hadoop目錄]
hdfs dfs –put /home/t/file.txt /user/t
4、將本地文件夾存儲至hadoop
hdfs dfs –put [本地目錄] [hadoop目錄]
hdfs dfs –put /home/t/dir_name /user/t
(dir_name是文件夾名)
5、將hadoop上某個文件down至本地已有目錄下
hadoop dfs -get [文件目錄] [本地目錄]
hadoop dfs –get /user/t/ok.txt /home/t
6、刪除hadoop上指定文件
hdfs dfs –rm [文件地址]
hdfs dfs –rm /user/t/ok.txt
7、刪除hadoop上指定文件夾(包含子目錄等)
hdfs dfs –rm [目錄地址]
hdfs dfs –rmr /user/t
8、在hadoop指定目錄內創建新目錄
hdfs dfs –mkdir /user/t
hdfs dfs -mkdir - p /user/centos/hadoop
9、在hadoop指定目錄下新建一個空文件
使用touchz命令:
hdfs dfs -touchz /user/new.txt
10、將hadoop上某個文件重命名
使用mv命令:
hdfs dfs –mv /user/test.txt /user/ok.txt (將test.txt重命名為ok.txt)
11、將hadoop指定目錄下所有內容保存為一個文件,同時down至本地
hdfs dfs –getmerge /user /home/t
12、將正在運行的hadoop作業kill掉
hadoop job –kill [job-id]
13.查看幫助
hdfs dfs -help
4、安全模式
(1)退出安全模式
NameNode在啟動時會自動進入安全模式。安全模式是NameNode的一種狀態,在這個階段,文件系統不允許有任何修改。
系統顯示Name node in safe mode,說明系統正處於安全模式,這時只需要等待十幾秒即可,也可通過下面的命令退出安全模式:/usr/local/hadoop$bin/hadoop dfsadmin -safemode leave
(2) 進入安全模式
在必要情況下,可以通過以下命令把HDFS置於安全模式:/usr/local/hadoop$bin/hadoop dfsadmin -safemode enter
5、節點添加
添加一個新的DataNode節點,先在新加節點上安裝好Hadoop,要和NameNode使用相同的配置(可以直接從NameNode復制),修改HADOOPHOME/conf/master文件,加入NameNode主機名。然後在NameNode節點上修改HADOOPHOME/conf/master文件,加入NameNode主機名。然後在NameNode節點上修改HADOOP_HOME/conf/slaves文件,加入新節點名,再建立新加節點無密碼的SSH連接,運行啟動命令為:/usr/local/hadoop$bin/start-all.sh
6、負載均衡
HDFS的數據在各個DataNode中的分布可能很不均勻,尤其是在DataNode節點出現故障或新增DataNode節點時。新增數據塊時NameNode對DataNode節點的選擇策略也有可能導致數據塊分布不均勻。用戶可以使用命令重新平衡DataNode上的數據塊的分布:/usr/local/hadoop$bin/start-balancer.sh
7、補充
1.對hdfs操作的命令格式是hdfs dfs
1.1 -ls 表示對hdfs下一級目錄的查看
1.2 -lsr 表示對hdfs目錄的遞歸查看
1.3 -mkdir 創建目錄
1.4 -put 從Linux上傳文件到hdfs
1.5 -get 從hdfs下載文件到linux
1.6 -text 查看文件內容
1.7 -rm 表示刪除文件
1.7 -rmr 表示遞歸刪除文件
2.hdfs在對數據存儲進行block劃分時,如果文件大小超過block,那麼按照block大小進行劃分;不如block size的,劃分為一個塊,是實際數據大小。
*****PermissionDenyException 許可權不足**********
hadoop常用命令:
hdfs dfs 查看Hadoop HDFS支持的所有命令
hdfs dfs –ls 列出目錄及文件信息
hdfs dfs –lsr 循環列出目錄、子目錄及文件信息
hdfs dfs –put test.txt /user/sunlightcs 將本地文件系統的test.txt復制到HDFS文件系統的/user/sunlightcs目錄下
hdfs dfs –get /user/sunlightcs/test.txt . 將HDFS中的test.txt復制到本地文件系統中,與-put命令相反
hdfs dfs –cat /user/sunlightcs/test.txt 查看HDFS文件系統里test.txt的內容
hdfs dfs –tail /user/sunlightcs/test.txt 查看最後1KB的內容
hdfs dfs –rm /user/sunlightcs/test.txt 從HDFS文件系統刪除test.txt文件,rm命令也可以刪除空目錄
hdfs dfs –rmr /user/sunlightcs 刪除/user/sunlightcs目錄以及所有子目錄
hdfs dfs –FromLocal test.txt /user/sunlightcs/test.txt 從本地文件系統復制文件到HDFS文件系統,等同於put命令
hdfs dfs –ToLocal /user/sunlightcs/test.txt test.txt 從HDFS文件系統復制文件到本地文件系統,等同於get命令
hdfs dfs –chgrp [-R] /user/sunlightcs 修改HDFS系統中/user/sunlightcs目錄所屬群組,選項-R遞歸執行,跟linux命令一樣
hdfs dfs –chown [-R] /user/sunlightcs 修改HDFS系統中/user/sunlightcs目錄擁有者,選項-R遞歸執行
hdfs dfs –chmod [-R] MODE /user/sunlightcs 修改HDFS系統中/user/sunlightcs目錄許可權,MODE可以為相應許可權的3位數或+/-{rwx},選項-R遞歸執行
hdfs dfs –count [-q] PATH 查看PATH目錄下,子目錄數、文件數、文件大小、文件名/目錄名
hdfs dfs –cp SRC [SRC …] DST 將文件從SRC復制到DST,如果指定了多個SRC,則DST必須為一個目錄
hdfs dfs – PATH 顯示該目錄中每個文件或目錄的大小
hdfs dfs –s PATH 類似於,PATH為目錄時,會顯示該目錄的總大小
hdfs dfs –expunge 清空回收站,文件被刪除時,它首先會移到臨時目錄.Trash/中,當超過延遲時間之後,文件才會被永久刪除
hdfs dfs –getmerge SRC [SRC …] LOCALDST [addnl] 獲取由SRC指定的所有文件,將它們合並為單個文件,並寫入本地文件系統中的LOCALDST,選項addnl將在每個文件的末尾處加上一個換行符
hdfs dfs –touchz PATH 創建長度為0的空文件
hdfs dfs –test –[ezd] PATH 對PATH進行如下類型的檢查: -e PATH是否存在,如果PATH存在,返回0,否則返回1 -z 文件是否為空,如果長度為0,返回0,否則返回1 -d 是否為目錄,如果PATH為目錄,返回0,否則返回1
hdfs dfs –text PATH 顯示文件的內容,當文件為文本文件時,等同於cat,文件為壓縮格式(gzip以及hadoop的二進制序列文件格式)時,會先解壓縮 hdfs dfs –help ls 查看某個[ls]命令的幫助文檔
本文轉自 https://www.cnblogs.com/LHWorldBlog/p/8514994.html
❿ 如何將hdfs上的文件存儲到db2
HDFS是一種文件系統,存儲著Hadoop應用將要處理的數據,類似於普通的Unix和linux文件系統,不同的是他是實現了google的GFS文件系統的思想,是適用於大規模分布式數據處理相關應用的、可擴展的分布式文件系統。它有以下優點:
1、在分布式存儲中,經常會出現節點失效的情況,HDFS可以持續監視,錯誤檢查,容錯處理,自動恢復;
2、分布式存儲的文件都是非常巨大的,HDFS重新規定了每次I/O的塊的大小;
3、對於搜索引擎的業務,大部分都只會在文件尾添加新數據,很少修改已有數據。HDFS做了優化;
4、與應用一起設計的文件系統API對整個系統的彈性和適用性有很大好處;
5、有效的支持多個客戶端並行添加同一個文件。
雖然HDFS實現了這么多的功能,但是因為它已經實現為一個開源框架,所以對於程序開發者來說,並不需要了解其底層的文件操作,我們可以通過其提供的一套與linux文件命令類似的命令行工具來進行文件操作。
基本文件命令:
格式為:hadoop fs -cmd <args>
cmd的命名通常與unix對應的命令名相同。例如,文件列表命令: hadoop fs -ls
1、添加目錄和文件
HDFS有一個默認的工作目錄 /user/$USER,其中$USER是你的登錄用戶名。不過目錄不會自動建立,我們現在用mkdir建立它,我使用的是chen作為用戶名。
hadoop fs -mkdir /user/chen
(hadoop的mkdir命令會自動創建父目錄,類似於帶-p的unix命令)
我們現在放本地文件系統的一個文件進去。
hadoop fs -put example.txt .
最後一個參數是句點,相當於放入了默認的工作目錄,等價於 hadoop fs -put example.txt /user/chen
當你把文件放入HDFS上後,你就可以運行Hadoop程序來處理它。
2、檢索文件
get命令與put命令相反,它從HDFS復制文件回到本地文件系統。
hadoop fs -get example.txt .
復制到本地的當前工作目錄中。
另一種是顯示數據,用cat
hadoop fs -cat example.txt
3、刪除文件
rm命令
hadoop fs -rm example.txt
也可以用來刪除空目錄
編程讀寫HDFS
利用HDFS給我們提供的API,我們同樣可以訪問它。
在Hadoop中用作文件操作的主類位於org.apache.hadoop.fs軟體包中。包括常見的open、read、write、close。Hadoop文件的API起點是FileSystem類,這是一個與文件系統交互的抽象類,我們通過調用factory的方法FileSystem.get(Configuration conf)來取得所需的FileSystem實例,如下我們可以獲得與HDFS介面的FileSystem對象:
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);//獲得HDFS的FileSystem對象
如果我們要實現HDFS與本地文件系統的交互,我們還需要獲取本地文件系統的FileSystem對象
FileSystem local = FileSystem.getLocal(conf);//獲得本地文件系統的FileSystem對象
以下代碼講解了一個例子,我們開發一個PutMerge程序,用於合並本地文件後放入HDFS,因為大文件HDFS處理起來比較容易,所以這個程序經常會在以後的開發中用到
[java] view plain
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class PutMerge {
public static void main(String[] args) throws IOException {
[java] view plain
Configuration conf = new Configuration();
FileSystem hdfs =FileSystem.get(conf); //獲得HDFS文件系統的對象
FileSystem local = FileSystem.getLocal(conf);//獲得本地文件系統的對象
[java] view plain
Path inputDir = new Path(args[0]);//設定輸入目錄
Path hdfsFile = new Path(args[1]);//設定輸出目錄
try{
FileStatus[] inputFiles = local.listStatus(inputDir);//FileStatus的listStatus()方法獲得一個目錄中的文件列表
FSDataOutputStream out = hdfs.create(hdfsFile);//生成HDFS輸出流
for(int i = 0; i < inputFiles.length; i ++){
System.out.println(inputFiles[i].getPath().getName());
[java] view plain
FSDataInputStream in = local.open(inputFiles[i].getPath());//打開本地輸入流
byte[] buffer = new byte[256];
int bytesRead = 0;
while((bytesRead = in.read(buffer))>0){
out.write(buffer,0,bytesRead);//通過一個循環來寫入
}
in.close();
}
out.close();
}catch (IOException e) {
e.printStackTrace();
}
}