1. 程式人生 > >大資料之hdfs詳解之三:put許可權剖析與常用命令

大資料之hdfs詳解之三:put許可權剖析與常用命令

–無論是對於hdfs的讀和寫,對於使用者來說都是無感知的、透明的操作,使用者並不關心資料如何讀出來如何寫進去的,只要返回一個結果告訴使用者資料讀出來了或寫進去了,至於怎麼讀怎麼寫,使用者並不關心
補充:
讀:hdfs dfs -ls / = hdfs dfs -ls hdfs://hadoop001:9000/
hdfs dfs -ls / /是hdfs檔案系統的根目錄 而不是Linux磁碟

hdfs dfs -ls hdfs://hadoop001:9000/ 其中hdfs://hadoop001:9000是一個引數,來自core-site.xml檔案的配置

hdfs dfs -ls 讀取當前命令操作的使用者的路徑:/user/使用者/
hdfs dfs -ls = hdfs dfs -ls /user/hadoop

Hadoop put許可權剖析

上傳檔案:將windows上的檔案存放到linux上:hdfs dfs -put 目標檔案 目標路徑
如果檔案事先存在或由於許可權問題上傳不了就會拋錯。
→ 如果是檔案已存在就丟擲檔案exists錯誤
→ 如果是許可權問題,丟擲這樣的錯誤:
put: Permission denied: user=root, access=WRITE, inode="/":hadoop:supergroup:drwxr-xr-x
在這種情況下:
建議:
1.切換目錄所需的使用者 su - hadoop
2.強行修改對應的使用者和使用者組:要麼是生產管控不嚴格 或者 是測試學習用

生產上一般不會改根目錄的許可權,而是將檔案上傳到一個新建的資料夾裡面,修改該檔案的使用者和使用者組許可權
在這裡插入圖片描述


在root使用者下將檔案上傳到hadoop使用者新建的資料夾裡面:
在這裡插入圖片描述
[[email protected] hadoop-2.6.0-cdh5.7.0]# bin/hdfs dfs -put NOTICE.txt /hahadata
18/10/13 11:12:06 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
沒有拋錯!
再返回hadoop使用者檢視這個新建的資料夾裡面有沒有上傳的檔案:是有的
這樣就解決了檔案上傳沒有許可權的問題了,但是生產上一般都不會這樣做的!
在這裡插入圖片描述

HDFS常用命令:

命令幫助:hdfs dfs (回車)
[[email protected] hadoop-2.6.0-cdh5.7.0]$ hdfs dfs
Usage: hadoop fs [generic options]
[-appendToFile … ]
[-cat [-ignoreCrc] …]
[-checksum …]
[-chgrp [-R] GROUP PATH…]
[-chmod [-R] <MODE[,MODE]… | OCTALMODE> PATH…]
[-chown [-R] [OWNER][:[GROUP]] PATH…]
[-copyFromLocal [-f] [-p] [-l] … ]
[-copyToLocal [-p] [-ignoreCrc] [-crc] … ]
[-count [-q] [-h] [-v] …]
[-cp [-f] [-p | -p[topax]] … ]
[-createSnapshot []]
[-deleteSnapshot ]
[-df [-h] [ …]]
[-du [-s] [-h] …]
[-expunge]
[-find … …]
[-get [-p] [-ignoreCrc] [-crc] … ]
[-getfacl [-R] ]
[-getfattr [-R] {-n name | -d} [-e en] ]
[-getmerge [-nl] ]
[-help [cmd …]]
[-ls [-d] [-h] [-R] [ …]]
[-mkdir [-p] …]
[-moveFromLocal … ]
[-moveToLocal ]
[-mv … ]
[-put [-f] [-p] [-l] … ]
[-renameSnapshot ]
[-rm [-f] [-r|-R] [-skipTrash] …]
[-rmdir [–ignore-fail-on-non-empty]

…]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} ]|[–set <acl_spec> ]]
[-setfattr {-n name [-v value] | -x name} ]
[-setrep [-R] [-w] …]
[-stat [format] …]
[-tail [-f] ]
[-test -[defsz] ]
[-text [-ignoreCrc] …]
[-touchz …]
[-usage [cmd …]]

Generic options supported are
-conf 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 specify comma separated files to be copied to the map reduce cluster
-libjars specify comma separated jar files to include in the classpath.
-archives specify comma separated archives to be unarchived on the compute machines.

The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]

hdfs dfs -ls / :檢視/路徑下的檔案和資料夾
hdfs dfs -put a.txt / :上傳a.txt檔案到 / 目錄路徑下
hdfs dfs -get /a.txt ./ :下載a.txt檔案到 ./ 當前目錄路徑下
hdfs dfs -copyFromLocal a.txt / :上傳a.txt檔案到 / 目錄路徑下
hdfs dfs -copyToLocal /a.txt ./ :下載a.txt檔案到 ./ 當前目錄路徑下
hdfs dfs -cat /a.txt :檢視檔案內容
hdfs dfs -rm /a.txt :刪除檔案
hdfs dfs -rmr /filename :刪除資料夾

注意:hadoop fs等價於 hdfs dfs,因為兩者呼叫同一個程式碼結構
[[email protected] hadoop-2.6.0-cdh5.7.0]$ cat bin/hadoop | grep fs
if [ ‘’$ COMMAND" = “fs” ] ; then
CLASS=org.apache.hadoop.fs.FsShell
[[email protected] hadoop-2.6.0-cdh5.7.0]$ cat bin/hdfs
elif [ “$COMMAND” = “dfs” ] ; then
CLASS=org.apache.hadoop.fs.FsShell

注意2個命令:

(1)dfsadmin
dfsadmin run a DFS admin client
報告hdfs的叢集健康狀況 (-report)
[[email protected] hadoop-2.6.0-cdh5.7.0]$ hdfs dfsadmin
Usage: hdfs dfsadmin
Note: Administrative commands can only be run as the HDFS superuser.
[-report [-live] [-dead] [-decommissioning]]
[-safemode <enter | leave | get | wait>]
[-saveNamespace]
[-rollEdits]
[-restoreFailedStorage true|false|check]
[-refreshNodes]
[-setQuota …]
[-clrQuota …]
[-setSpaceQuota …]
[-clrSpaceQuota …]
[-finalizeUpgrade]
[-rollingUpgrade [<query|prepare|finalize>]]
[-refreshServiceAcl]
[-refreshUserToGroupsMappings]
[-refreshSuperUserGroupsConfiguration]
[-refreshCallQueue]
[-refresh host:ipc_port [arg1…argn]
[-reconfig <datanode|…> host:ipc_port <start|status|properties>]
[-printTopology]
[-refreshNamenodes datanode_host:ipc_port]
[-deleteBlockPool datanode_host:ipc_port blockpoolId [force]]
[-setBalancerBandwidth ]
[-fetchImage ]
[-allowSnapshot ]
[-disallowSnapshot ]
[-shutdownDatanode <datanode_host:ipc_port> [upgrade]]
[-getDatanodeInfo <datanode_host:ipc_port>]
[-metasave filename]
[-triggerBlockReport [-incremental] <datanode_host:ipc_port>]
[-help [cmd]]

[[email protected] ~]$ hdfs dfsadmin -report
18/10/13 11:46:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
Configured Capacity: 42139451392 (39.25 GB)
Present Capacity: 33108271104 (30.83 GB)
DFS Remaining: 33107415040 (30.83 GB)
DFS Used: 856064 (836 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0

Live datanodes (1):

Name: 172.31.95.246:50010 (hadoop001)
Hostname: hadoop001
Decommission Status : Normal
Configured Capacity: 42139451392 (39.25 GB)
DFS Used: 856064 (836 KB)
Non DFS Used: 9031180288 (8.41 GB)
DFS Remaining: 33107415040 (30.83 GB)
DFS Used%: 0.00%
DFS Remaining%: 78.57%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Sat Oct 13 11:46:35 CST 2018
這些資訊都可以在客戶端50070的web介面可以看到,以顯示hdfs的叢集健康狀況

(2)安全模式:一種保護功能
hdfs dfsadmin -safemode <enter | leave | get | wait>
log日誌說了一句話 NN節點處於 safemode, 只讀的,就要離開:hdfs dfsadmin -safemode leave
1、如果是手工讓它進入安全模式,代表叢集只讀,可以做維護,做完維護,hdfs dfsadmin -safemode leave
2、如果是異常情況,比如hdfs損壞(或部署有問題),NN節點自動進入安全模式
a.手工嘗試的去hdfs dfsadmin -safemode leave是成功的,進入正常的 -put正常操作
b.手工嘗試的去hdfs dfsadmin -safemode leave不成功,那麼仔細去看NN節點的log日誌,去分析問題出在哪裡
→可能是block塊損壞