一、pyhdfs.HdfsClient
pyhdfs.HdfsClient(hosts: Union[str, Iterable[str]] = 'localhost',
randomize_hosts: bool = True,
user_name: Optional[str] = None,
timeout: float = 20,
max_tries: int = 2,
retry_delay: float = 5,
requests_session: Optional[requests.sessions.Session] = None,
requests_kwargs: Optional[Dict[str, Any]] = None)
參數:
- hosts(list 或str)– NameNode HTTP host:port字符串的列表,可以list是逗號分隔的字符串。如果未指定,則端口默認為50070。請注意,在Hadoop 3中,默認的NameNode HTTP端口已更改為9870。舊版本的默認值50070保持向后兼容。
- randomize_hosts(bool)–默認情況下,隨機選擇主機。
- user_name –以什么Hadoop用戶身份運行。默認為HADOOP_USER_NAME環境變量(如果存在),否則為getpass.getuser()。
- timeout(float)–等待一個NameNode持續多長時間(以秒為單位)。在某些情況下,備用NameNode可能無響應(例如,加載fsimage或檢查點),因此我們不想對其進行阻止。
- max_tries(int)–對每個NameNode重試請求的次數。如果NN1處於待機狀態,而NN2處於活動狀態,則我們可能首先聯系NN1,然后在聯系NN2時觀察到故障轉移到NN1。在這種情況下,我們要針對NN1重試。
- retry_delay(float)–再次經歷NameNodes之前要等待的時間(以秒為單位)
- requests_session –一個requests.Session高級用法的對象。如果不存在,則此類將使用默認請求行為,即每個HTTP請求進行新會話。呼叫者負責關閉會話。
- request_kwargs – **kwargs傳遞給請求的附加項
使用pyhdfs連接hdfs,需要注意連接時需要修改本機hosts文件中的IP地址與主機名的映射,不然會報錯。
文件路徑:C:\WINDOWS\system32\drivers\etc 下的hosts文件中添加hadoop集群主機的映射關系
例如 添加一下主機映射:
192.168.160.100 hdp-100
import pyhdfs
fs = pyhdfs.HdfsClient(hosts="192.168.130.163,50070", user_name="root") # 這兩種連接方式都可以
fs = pyhdfs.HdfsClient(hosts="192.168.130.163,9000", user_name="root")
二、返回用戶的根目錄
print(fs.get_home_directory())
>> /user/root
三、返回可用的namenode節點
print(fs.get_active_namenode())
>> 192.168.160.100:50070
四、返回指定目錄下的所有文件
print(fs.listdir("/")) # 目錄下的文件夾
>> ['image', 'mp4', 'tmp']
五、從本地上傳文件至集群、從集群上copy到本地
fs.copy_to_local("D:\PYTHNON/hadoop/3.mp4", '/mp4/3.mp4') # 從hadoop下載到本地
fs.copy_from_local("D:\PYTHNON/hadoop/3.mp4", '/mp4/3.mp4') # 從本地上傳到hadoop上
六、判斷目錄、文件是否存在
fs.exists('/mp4') # 存在返回True,不存在返回False
print(fs.exists("/mp4/3.mp4")) # 文件是否存,在存在返回True,不存在返回False
七、返回目錄下的所有目錄,路徑,文件名
print(list(fs.walk('/mp4')))
>> [('/mp4', [], ['3.mp4'])]
八、刪除目錄、文件
fs.delete("/mp4", recursive=True) # 刪除目錄 recursive=True
fs.delete("/mp4/3.mp4 ") # 刪除文件