hdfs上傳本地文件
❶ 大數據之HDFS
在現代的企業環境中,單機容量往往無法存儲大量數據,需要跨機器存儲。統一管理分布在集群上的文件系統稱為 分布式文件系統 。
HDFS (Hadoop Distributed File System)是 Hadoop 的核心組件之一, 非常適於存儲大型數據 (比如 TB 和 PB), HDFS 使用多台計算機存儲文件,並且提供統一的訪問介面,像是訪問一個普通文件系統一樣使用分布式文件系統。
HDFS是分布式計算中數據存儲管理的基礎,是基於流數據模式訪問和處理超大文件的需求而開發的,可以運行於廉價的商用伺服器上。它所具有的 高容錯、高可靠性、高可擴展性、高獲得性、高吞吐率 等特徵為海量數據提供了不怕故障的存儲,為超大數據集的應用處理帶來了很多便利。
HDFS 具有以下 優點 :
當然 HDFS 也有它的 劣勢 ,並不適合以下場合:
HDFS 採用Master/Slave的架構來存儲數據,這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。
Namenode是整個文件系統的管理節點,負責接收用戶的操作請求。它維護著整個文件系統的目錄樹,文件的元數據信息以及文件到塊的對應關系和塊到節點的對應關系。
Namenode保存了兩個核心的數據結構:
在NameNode啟動的時候,先將fsimage中的文件系統元數據信息載入到內存,然後根據edits中的記錄將內存中的元數據同步到最新狀態;所以,這兩個文件一旦損壞或丟失,將導致整個HDFS文件系統不可用。
為了避免edits文件過大, SecondaryNameNode會按照時間閾值或者大小閾值,周期性的將fsimage和edits合並 ,然後將最新的fsimage推送給NameNode。
並非 NameNode 的熱備。當NameNode 掛掉的時候,它並不能馬上替換 NameNode 並提供服務。其主要任務是輔助 NameNode,定期合並 fsimage和fsedits。
Datanode是實際存儲數據塊的地方,負責執行數據塊的讀/寫操作。
一個數據塊在DataNode以文件存儲在磁碟上,包括兩個文件,一個是數據本身,一個是元數據,包括數據塊的長度,塊數據的校驗和,以及時間戳。
文件劃分成塊,默認大小128M,以快為單位,每個塊有多個副本(默認3個)存儲不同的機器上。
Hadoop2.X默認128M, 小於一個塊的文件,並不會占據整個塊的空間 。Block數據塊大小設置較大的原因:
文件上傳 HDFS 的時候,Client 將文件切分成 一個一個的Block,然後進行存儲。
Client 還提供一些命令來管理 HDFS,比如啟動或者關閉HDFS。
Namenode始終在內存中保存metedata,用於處理「讀請求」,到有「寫請求」到來時,namenode會首 先寫editlog到磁碟,即向edits文件中寫日誌,成功返回後,才會修改內存 ,並且向客戶端返回,Hadoop會維護一個fsimage文件,也就是namenode中metedata的鏡像,但是fsimage不會隨時與namenode內存中的metedata保持一致,而是每隔一段時間通過合並edits文件來更新內容。
HDFS HA(High Availability)是為了解決單點故障問題。
HA集群設置兩個名稱節點,「活躍( Active )」和「待命( Standby )」,兩種名稱節點的狀態同步,可以藉助於一個共享存儲系統來實現,一旦活躍名稱節點出現故障,就可以立即切換到待命名稱節點。
為了保證讀寫數據一致性,HDFS集群設計為只能有一個狀態為Active的NameNode,但這種設計存在單點故障問題,官方提供了兩種解決方案:
通過增加一個Secondary NameNode節點,處於Standby的狀態,與Active的NameNode同時運行。當Active的節點出現故障時,切換到Secondary節點。
為了保證Secondary節點能夠隨時頂替上去,Standby節點需要定時同步Active節點的事務日誌來更新本地的文件系統目錄樹信息,同時DataNode需要配置所有NameNode的位置,並向所有狀態的NameNode發送塊列表信息和心跳。
同步事務日誌來更新目錄樹由JournalNode的守護進程來完成,簡稱為QJM,一個NameNode對應一個QJM進程,當Active節點執行任何命名空間文件目錄樹修改時,它會將修改記錄持久化到大多數QJM中,Standby節點從QJM中監聽並讀取編輯事務日誌內容,並將編輯日誌應用到自己的命名空間。發生故障轉移時,Standby節點將確保在將自身提升為Active狀態之前,從QJM讀取所有編輯內容。
注意,QJM只是實現了數據的備份,當Active節點發送故障時,需要手工提升Standby節點為Active節點。如果要實現NameNode故障自動轉移,則需要配套ZKFC組件來實現,ZKFC也是獨立運行的一個守護進程,基於zookeeper來實現選舉和自動故障轉移。
雖然HDFS HA解決了「單點故障」問題,但是在系統擴展性、整體性能和隔離性方面仍然存在問題:
HDFS HA本質上還是單名稱節點。HDFS聯邦可以解決以上三個方面問題。
在HDFS聯邦中,設計了多個相互獨立的NN,使得HDFS的命名服務能夠水平擴展,這些NN分別進行各自命名空間和塊的管理,不需要彼此協調。每個DN要向集群中所有的NN注冊,並周期性的發送心跳信息和塊信息,報告自己的狀態。
HDFS聯邦擁有多個獨立的命名空間,其中,每一個命名空間管理屬於自己的一組塊,這些屬於同一個命名空間的塊組成一個「塊池」。每個DN會為多個塊池提供塊的存儲,塊池中的各個塊實際上是存儲在不同DN中的。
❷ hadoop的幾個問題 1.將本地文件復制到hdfs中,那麼在hdfs中這個文件是存放在namenode還是分開放在datanode
試著回答:
先說明一下:
1. namenode負責管理目錄和文件信息,真正的文件塊是存放在datanode上。
2. 每個map和rece(即task)都是java進程,默認是有單獨的jvm的,所以不可能同一個類的對象會在不同節點上。
看你的描述是把namenode,datanode和jobtracker,tasktracker有點混了。
所以:
問題1. 分塊存放在datanode上
問題2.inputformat是在datanode上,確切的說是在tasktracker中。每個map和rece都會有自己的對象,當多個map讀入一個文件時,實際上不同的map是讀的文件不同的塊,rece也是一樣,各個任務讀入的數據是不相交的。
問題3.rece輸出肯定是在hdfs上,和普通文件一樣在datanode上。
問題4.每個recer會有自己的outputformat對象,與前面inputformat原因一樣。
❸ Hive四種數據導入方式
Hive提供了多種數據導入方式,以下是其中幾種常見的方法:
1、從本地系統導入數據至Hive表:Hive通過Hadoop的HDFS介面,可以從本地文件系統導入數據。首先將數據文件上傳至HDFS,然後在Hive中使用命令`LOAD DATA INPATH '本地文件路徑' INTO TABLE 表名;`實現數據導入。
2、從HDFS導入數據至Hive表:數據存儲在HDFS中時,可以使用`LOAD DATA INPATH 'HDFS文件路徑' INTO TABLE 表名;`命令將數據導入Hive表。這種方式適用於數據已經在HDFS上的場景。
3、從一個Hive表導入到另一個Hive表:使用`INSERT INTO TABLE 目標表 SELECT * FROM 源表`語句可以將源表的數據導入至目標表。確保目標表結構與源表結構相匹配,包括列名、類型和數量。
4、創建表時從其他表導入數據:在創建表的過程中,可以使用`PARTITIONED BY`子句和`SELECT * FROM`子句將其他表的數據作為新表的一部分。例如`CREATE TABLE 新表 (LIKE 源表 INCLUDING ALL);`命令創建的新表結構與源表相同,包括所有列和分區。
這些導入方式在大數據處理中非常實用,能夠根據實際需求靈活選擇和使用。通過Hive的導入功能,數據分析師可以快速將各種來源的數據整合到Hive中,便於進行進一步的查詢、分析和管理。
❹ hadoop中在HDFS中創建一個input目錄,然後hadoop fs -ls命令
從fs -ls從列出來的文件看,這個文件夾/user/root/input是通過root用戶創建的。說明你在從本地文件系統拷貝input目錄到hdfs系統的時候,不是採用的hadoop用戶,而是用root用戶執行的拷貝命令,你可能忘記切換用戶了,可以刪除現在的input目錄(採用root用戶運行hadoop的刪除命令,或者不刪除也沒關系),重新使用hadoop用戶把input導入到hdfs系統中試試看。
另外,實際上應用的時候是需要關注hdfs中文件的目錄結構的。你現在採用的是默認的方式,預設會放/user/${user.name}目錄下。
在把本地文件導入到hdfs的時候,是可以指定傳到什麼目錄的,比如:
#創建input目錄
sh bin/hadoop fs -mkdir /user/hadoop/input
#把myfile.txt導入到hdfs的input目錄下
sh bin/hadoop fs –put /usr/hadoop/mydata/myfile.txt /user/hadoop/input