① Hdfs怎麼看副本數
解決方法如下:
hdfs的默認副本數量是3個,配置在/etc/hadoop/conf/hdfs-site.xml中 dfs.replication。
我們也可以通過hdfs dfs -ls /path/to/file 命令查看hdfs上的文件: 文件類型會在第二列顯示副本數量。
hdfs中副本數量沒有達到配置的數量則會自動進行備份,此時datanode節點之間會大量復制文件,集群性能會暫時受到影響。
② 用c++讀取hdfs中的文件,使用libhdfs應該怎麼配置
建立、關閉與HDFS連接:hdfsConnect()、hdfsConnectAsUser()、hdfsDisconnect()。hdfsConnect()實際上是直接調用hdfsConnectAsUser。
打開、關閉HDFS文件:hdfsOpenFile()、hdfsCloseFile()。當用hdfsOpenFile()創建文件時,可以指定replication和blocksize參數。寫打開一個文件時,隱含O_TRUNC標志,文件會被截斷,寫入是從文件頭開始的。
讀HDFS文件:hdfsRead()、hdfsPread()。兩個函數都有可能返回少於用戶要求的位元組數,此時可以再次調用這兩個函數讀入剩下的部分(類似APUE中的readn實現);只有在兩個函數返回零時,我們才能斷定到了文件末尾。
寫HDFS文件:hdfsWrite()。HDFS不支持隨機寫,只能是從文件頭順序寫入。
查詢HDFS文件信息:hdfsGetPathInfo()
查詢和設置HDFS文件讀寫偏移量:hdfsSeek()、hdfsTell()
查詢數據塊所在節點信息:hdfsGetHosts()。返回一個或多個數據塊所在數據節點的信息,一個數據塊可能存在多個數據節點上。
libhdfs中的函數是通過jni調用JAVA虛擬機,在虛擬機中構造對應的HDFS的JAVA類,然後反射調用該類的功能函數。總會發生JVM和程序之間內存拷貝的動作,性能方面值得注意。
HDFS不支持多個客戶端同時寫入的操作,無文件或是記錄鎖的概念。
建議只有超大文件才應該考慮放在HDFS上,而且最好對文件的訪問是寫一次,讀多次。小文件不應該考慮放在HDFS上,得不償失!
③ 如何遠程讀取CDH的hadoop上的HDFS數據
需要在實例化出來的Configuration中加入HDFS的埠路徑即可,其他的除了hadoop的jar包外,任何配置文件都不需要,核心代碼如下:
static Configuration conf=new Configuration();
static FileSystem fs=null;
static{
try {
//默認的hadoop的fs.defaultFS的埠號為8020,這里需要跟集群裡面的配置一致
conf.set("fs.defaultFS","hdfs://dnode1:8020/");
fs=FileSystem.get(conf);
} catch (IOException e) {
log.error("初始化FileSystem失敗!",e);
}
}
OK,只需要這簡單的一行,我們就可以讀取HDFS上的數據了
④ impala可以獲取hdfs目錄下的數據嗎
如果和數據block不在同一個host上,那麼就是使用HDFSDataTransaferProtocol(不是正式的命名,意會即可)來讀,也就是一個二進制協議走TCP鏈接。
如果是在同一個host上,那麼是利用了HDFS中"short-circuit local reads"技術。簡單來說,從DataNode那邊獲取到所需數據的Meta信息,然後直接通過系統調用open/read來讀取。