手把手教你HDFS基礎配置安裝及命令使用!
HDFS是基於Java的檔案系統,可在Hadoop生態系統中提供可擴充套件且可靠的資料儲存。因此,我們需要了解基本的HDFS配置和命令才能正常使用它。在使用之前,我們首先討論如何配置安裝HDFS。Hadoop以及HDFS都執行在java環境中,因此我們都需要安裝JDK:
yum -y install jdk(或手動安裝)
設定namenode節點到datanode節點的免密登陸
1、本地免密登入
# ssh localhost #檢測能否在本機上實現免密碼登陸 # ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa #建立登陸的公鑰和私鑰,公鑰放在id_dsa.pub中,私鑰放在id_dsa中
# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys #將公鑰追加到已認證資訊中 # ssh localhost #實現免密碼登陸
2、跨主機免密登陸
# scp ~/.ssh/id_dsa.pub root@node2:~/.ssh/ #在namenode上執行 # cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys #將公鑰追加到已認證資訊中,在datanode上執行該操作
3、對所有datanode執行上述操作
設定域名解析(在所有節點增加)
# vi /etc/hosts # 增加節點對應節點,如果不加入節點則需要在配置檔案中寫節點IP 192.168.150.128 node1 192.168.150.129 node2 192.168.150.130 node3 192.168.150.131 node4
由於Hadoop有bin包,所以下載後只需解壓即可使用。如果我們使用的是版本hadoop-1.2.1,那就將軟體解壓到/root/hadoop-1.2.1資料夾中。
注意:namenode和datanode軟體包的放置位置要完全相同,否則在叢集啟動服務時會出現找不到檔案的情況。
配置
#vi /root/hadoop-1.2.1/conf/core-site.xml <configuration> <property> <name>fs.default.name</name> # namenode節點名 <value>hdfs://node1:9000</value> #namenode域名(或IP)和埠 </property> <property> <name>hadoop.tmp.dir</name> #檔案儲存目錄 <value>/opt/hadoop-1.2</value> #fs的放置位置 </property> </configuration> 其它具體配置可以檢視./hadoop-1.2.1/docs的文件。 #vi /root/hadoop-1.2.1/conf/hdfs-site.xml <configuration> <name>dfs.replication</name> #block的副本數,不能超過datanode的數目 <value>2</value> </configuration> #vi /root/hadoop-1.2.1/conf/slaves #該檔案設定datanode節點的域名(IP) node2 node3 #vi /root/hadoop-1.2.1/conf/masters #該檔案設定secondarynamenode節點的域名(IP) node2 # 只要跟namenode不在同一臺機器上即可 #vi /root/hadoop-1.2.1/conf/hadoop-env.sh #設定執行環境 export JAVA_HOME=/usr/java/jdk1.7.0_79 # 只要設定jdk的目錄即可 在所有的節點上進行上述的相同配置。
HDFS本地Golang客戶端實踐
基於上述基礎配置,我們也可以嘗試配置HDFS的本地golang客戶端,它使用協議緩衝區API直接連線namenode,使用stdlib os包並實現相應介面,包括os.FileInfo和os.PathError。
這是它在action中的狀態:
client, _ := hdfs.New("namenode:8020")file, _ := client.Open("/mobydick.txt")buf := make([]byte, 59) file.ReadAt(buf, 48847) fmt.Println(string(buf))// => Abominable are the tumblers into which he pours his poison.
HDFS二進位制檔案
與庫類似,此repo包含HDFS命令列客戶端,主要目標是啟用unix動詞實現:
$ hdfs --help Usage: hdfs COMMAND The flags available are a subset of the POSIX ones, but should behave similarly. Valid commands: ls [-lah] [FILE]... rm [-rf] FILE... mv [-fT] SOURCE... DEST mkdir [-p] FILE... touch [-amc] FILE... chmod [-R] OCTAL-MODE FILE... chown [-R] OWNER[:GROUP] FILE... cat SOURCE... head [-n LINES | -c BYTES] SOURCE... tail [-n LINES | -c BYTES] SOURCE... du [-sh] FILE... checksum FILE... get SOURCE [DEST] getmerge SOURCE DEST put SOURCE DEST
由於它不必等待JVM啟動,所以hadoop -fs要快得多:
$ time hadoop fs -ls / > /dev/null real 0m2.218s user 0m2.500s sys 0m0.376s $ time hdfs ls / > /dev/null real 0m0.015s user 0m0.004s sys 0m0.004s
安裝命令列客戶端
從釋出頁面抓取tarball並將其解壓縮到任意位置。
要配置客戶端,請確保其中一個或兩個環境變數指向Hadoop配置(core-site.xml和hdfs-site.xml)。在安裝了Hadoop的系統上,應該已經設定過上述變數。
$ export HADOOP_HOME="/etc/hadoop" $ export HADOOP_CONF_DIR="/etc/hadoop/conf"
要在linux上完成選項卡安裝,請將tarball附帶的bash_completion檔案複製或連結到正確位置:
$ ln -sT bash_completion /etc/bash_completion.d/gohdfs
預設情況下,在非kerberized叢集上,HDFS使用者可設定為當前登入使用者,也可以使用另一個環境變數覆蓋它:
$ export HADOOP_USER_NAME=username
使用帶有Kerberos身份驗證的命令列客戶端
與hadoop fs一樣,命令列客戶端需要在預設位置使用ccache檔案:/ tmp / krb5cc_ <uid>。 這意味著它必須“正常工作”才能使用kinit:
$ kinit bob@EXAMPLE.com $ hdfs ls /
如果不起作用,請嘗試將KRB5CCNAME環境變數設定為儲存ccache的位置。
相容性
該庫使用HDFS協議的“Version 9”,這意味著它應該使用基於2.2.x及更高版本的Hadoop發行版,測試針對CDH 5.x和HDP 2.x執行。
檢查機器是否能與HDFS通訊
如果想檢查一臺機器是否可以與另一臺機器上執行的HDFS伺服器通訊,並從Hadoop wiki中修改一些程式碼,如下所示:
package org.playground; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.IOException; public class HadoopDFSFileReadWrite { static void printAndExit(String str) { System.err.println( str ); System.exit(1); } public static void main (String[] argv) throws IOException { Configuration conf = new Configuration(); conf.addResource(new Path("/Users/markneedham/Downloads/core-site.xml")); FileSystem fs = FileSystem.get(conf); Path inFile = new Path("hdfs://192.168.0.11/user/markneedham/explore.R"); Path outFile = new Path("hdfs://192.168.0.11/user/markneedham/output-" + System.currentTimeMillis()); // Check if input/output are valid if (!fs.exists(inFile)) printAndExit("Input file not found"); if (!fs.isFile(inFile)) printAndExit("Input should be a file"); if (fs.exists(outFile)) printAndExit("Output already exists"); // Read from and write to new file byte buffer[] = new byte[256]; try ( FSDataInputStream in = fs.open( inFile ); FSDataOutputStream out = fs.create( outFile ) ) { int bytesRead = 0; while ( (bytesRead = in.read( buffer )) > 0 ) { out.write( buffer, 0, bytesRead ); } } catch ( IOException e ) { System.out.println( "Error while copying file" ); } } }
我最初以為POM檔案中只有以下內容:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.0</version> </dependency>
但執行指令碼時,我得到了以下結果:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.fs.FSOutputSummer.<init>(Ljava/util/zip/Checksum;II)V at org.apache.hadoop.hdfs.DFSOutputStream.<init>(DFSOutputStream.java:1553) at org.apache.hadoop.hdfs.DFSOutputStream.<init>(DFSOutputStream.java:1582) at org.apache.hadoop.hdfs.DFSOutputStream.newStreamForCreate(DFSOutputStream.java:1614) at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1465) at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1390) at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:394) at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:390) at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81) at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:390) at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:334) at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:909) at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:890) at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:787) at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:776) at org.playground.HadoopDFSFileReadWrite.main(HadoopDFSFileReadWrite.java:37) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
透過跟蹤堆疊跟蹤,我意識到犯了一個錯誤,即對hadoop-hdfs 2.4.1進行了依賴。如果沒有hadoop-hdfs依賴,我們會看到如下錯誤:
Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2644) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2651) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:92) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2687) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2669) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:371) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:170) at org.playground.HadoopDFSFileReadWrite.main(HadoopDFSFileReadWrite.java:22) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
現在,讓我們新增正確的依賴項版本,並確保可以按照預期工作:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.0</version> <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency>
執行時,它會在另一臺機器上用當前時間戳在HDFS中建立一個新檔案:
$ date +%s000 1446336801000 $ hdfs dfs -ls ... -rw-r--r-- 3 markneedham supergroup 9249 2015-11-01 00:13 output-1446337098257 ...
(該專案開源地址:)
基礎HDFS命令
完成安裝配置後,我們需要了解HDFS基礎命令,需要知道每個命令的詳細語法。一般語法如下:
hadoop dfs [COMMAND [COMMAND_OPTIONS]]
這將在Hadoop(HDFS)支援的檔案系統上執行filesystem命令,其餘Command選項如下所示:
1、put命令
'put'命令將資料輸入HDFS。
語法:hadoop dfs -put </ source path> </ destination path>
2、List命令
'list'命令顯示特定路徑中的所有可用檔案。
語法:hadoop dfs -ls </ source path>
3、Get命令
'get'命令將上述檔案的全部內容複製到本地驅動器。
語法:hadoop dfs -get </ source path> </ destination path>
4、Make Directory命令
'mkdir'命令在指定位置建立一個新目錄。
語法:hadoop dfs -mkdir </ source path>
5、檢視特定檔案的內容
'cat'命令用於顯示檔案的所有內容。
語法:hadoop dfs -cat </ path [filename]>
6、複製HDFS內的完整檔案
'copyfromlocal'命令將檔案從本地檔案系統複製到HDFS。
語法:hadoop dfs -copyFromLocal </ source path> </ destination path>
7、將檔案從HDFS複製到本地檔案系統。
'copytolocal'命令將檔案從HDFS複製到本地檔案系統。
語法:hadoop dfs -copyToLocal </ source path> </ destination path>
8、刪除檔案
命令'rm'將刪除儲存在HDFS中的檔案。
語法:hadoop dfs -rm </ path [filename]>
9、執行DFS檔案系統以檢查實用程式
命令'fsck'用於檢查檔案系統的一致性
語法:hadoop fsck </ file path>
10、叢集負載均衡程式
'balancer'命令將檢查叢集中節點的工作負載並進行平衡。
語法:hadoop balancer
11、檢查HDFS中的目錄空間
該命令將顯示叢集內檔案佔用的大小。
語法:hadoop dfs -du -s -h </ file path>
12、列出所有Hadoop檔案系統Shell命令
'fs'命令列出了Hadoop檔案系統的所有shell命令。
語法:hadoop fs [options]
[hadoop@acadgild ~]$ hadoop fs Usage: hadoop fs [generic options] [-appendToFile <localsrc> ... <dst>] [-cat [-ignoreCrc] <src> ...] [-checksum <src> ...] [-chgrp [-R] GROUP PATH...] [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] [-chown [-R] [OWNER][:[GROUP]] PATH...] [-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>] [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-count [-q] [-h] <path> ...] [-cp [-f] [-p | -p[topax]] <src> ... <dst>] [-createSnapshot <snapshotDir> [<snapshotName>]] [-deleteSnapshot <snapshotDir> <snapshotName>] [-df [-h] [<path> ...]] [-du [-s] [-h] <path> ...] [-expunge] [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-getfacl [-R] <path>] [-getfattr [-R] {-n name | -d} [-e en] <path>] [-getmerge [-nl] <src> <localdst>] [-help [cmd ...]] [-ls [-d] [-h] [-R] [<path> ...]] [-mkdir [-p] <path> ...] [-moveFromLocal <localsrc> ... <dst>] [-moveToLocal <src> <localdst>] [-mv <src> ... <dst>] [-put [-f] [-p] [-l] <localsrc> ... <dst>] [-renameSnapshot <snapshotDir> <oldName> <newName>] [-rm [-f] [-r|-R] [-skipTrash] <src> ...] [-rmdir [--ignore-fail-on-non-empty] <dir> ...] [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]] [-setfattr {-n name [-v value] | -x name} <path>] [-setrep [-R] [-w] <rep> <path> ...] [-stat [format] <path> ...] [-tail [-f] <file>] [-test -[defsz] <path>] [-text [-ignoreCrc] <src> ...] [-touchz <path> ...] [-usage [cmd ...]] Generic options supported are -conf <configuration file> specify an application configuration file -D <property=value> use value for given property -fs <local|namenode:port> specify a namenode -jt <local|resourcemanager:port> specify a ResourceManager -files <comma separated list of files> specify comma separated files to be copied to the map reduce cluster -libjars <comma separated list of jars> specify comma separated jar files to include in the classpath. -archives <comma separated list of archives> specify comma separated archives to be unarchived on the compute machines. The general command line syntax is bin/hadoop command [genericOptions] [commandOptions] [hadoop@acadgild ~]$
結論
在Hadoop和HDFS的實際配置中,我們可能會遇到很多問題,好在其龐大的社群支援讓我們可以很輕鬆得找到各類解決方案,如果你對HDFS的概念並不熟悉,你也可以考慮閱讀本系列的第一篇文章:《掃盲:Hadoop分散式檔案系統(HDFS)基礎概念講解!》(連結:http://blog.itpub.net/31077337/viewspace-2199558/)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31077337/viewspace-2199793/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CentOS 7 安裝、配置、使用 PostgreSQL 10 安裝及基礎配置CentOSSQL
- Mysql安裝及基礎配置MySql
- sysbench工具手把手安裝配置及使用案例
- 【Mac】Docker安裝及基礎使用MacDocker
- SharePlexForOracle_安裝配置_基礎使用Oracle
- 【mac】ansible安裝及基礎使用Mac
- Java基礎:Java簡介及安裝配置(1)Java
- 手把手教你SonarQube入門安裝與使用
- maven安裝與基礎配置Maven
- 手把手教你安裝Data Guard
- 手把手教你MongoDB的安裝與詳細使用(二)MongoDB
- 手把手教你安裝Faiss(Linux)AILinux
- mySQL的安裝和基礎使用及語法教程MySql
- 手把手教你在本機安裝sparkSpark
- 手把手教你編譯安裝MPlayer(轉)編譯
- 基於docker的mysql安裝及配置DockerMySql
- 【保姆級教程】手把手教你進行Go語言環境安裝及相關VSCode配置GoVSCode
- Oracleasm下載地址、安裝順序及配置命令OracleASM
- Zookeeper(1)-安裝與基礎使用
- PostgreSQL_11.1_安裝和基礎配置SQL
- 手把手教你安裝Lotus Domino7.0 (二)
- 手把手教你安裝Lotus Domino7.0 (一)
- 手把手教你安裝Lotus Domino7.0 (三)
- 手把手教你安裝Lotus Domino7.0 (四)
- Emacs基礎使用教程及常見命令整理Mac
- NeurophStudio安裝及基礎應用
- asm命令及安裝ASM
- Docker的安裝配置及使用詳解Docker
- GRUB安裝,配置及使用匯總(轉)
- MyCat資料庫的基礎配置及使用資料庫
- Redis資料庫的安裝與基礎命令Redis資料庫
- 手把手教你使用nodejs編寫cli(命令列)NodeJS命令列
- Flume監聽Nginx日誌流向HDFS安裝配置Nginx
- yii 安裝及配置
- nginx安裝及配置Nginx
- helm安裝及配置
- mysql安裝及配置MySql
- 手把手教你在各大平臺上安裝SQLiteSQLite