先决条件: Hadoop安装,HDFS
Python Snakebite是一个非常流行的Python库,我们可以使用它与 HDFS 进行通信。使用 Snakebite 包提供的Python客户端库,我们可以轻松编写适用于 HDFS 的Python代码。它使用protobuf消息直接与 NameNode 通信。 Python客户端库直接与 HDFS 配合使用,无需对 hdfs dfs 进行系统调用。 Snakebite 不支持 python3 。
删除文件和目录
在Python Snakebite 中有一个名为 delete() 的方法,通过它我们可以轻松删除 HDFS 中可用的多个文件或目录。我们将使用Python客户端库来执行删除。所以,让我们从动手练习开始。
所有的 Hadoop 守护进程都应该运行。您可以在以下命令的帮助下启动 Hadoop 守护进程。
start-dfs.sh // start your namenode datanode and secondary namenode
start-yarn.sh // start resourcemanager and nodemanager
任务:递归删除 HDFS 上可用的文件和目录(在我的情况下,我正在删除 ‘/demo/demo1’ 和 ‘/demo2’ 目录)。
步骤 1:让我们借助以下命令查看 HDFS 中可用的文件和目录。
hdfs dfs -ls /
在上面的命令中, hdfs dfs用于与 Hadoop 分布式文件系统进行通信。 ‘ -ls / ‘用于列出根目录中存在的文件。我们还可以手动检查 HDFS 中可用的文件。
第 2 步:在本地目录中的所需位置创建一个名为remove_directory.py的文件。
cd Documents/ # Changing directory to Documents(You can choose as per your requirement)
touch remove_directory.py # touch command is used to create file in linux enviournment.
第 3 步:在remove_directory.py Python文件中编写以下代码。
Python
# importing the package
from snakebite.client import Client
# the below line create client connection to the HDFS NameNode
client = Client('localhost', 9000)
# The /demo/demo1 and /demo2 directory's will be removed from HDFS
for p in client.delete(['/demo', '/demo2'], recurse=True):
print p
在上面的程序中recurse=True说明目录将被递归删除意味着如果目录不为空并且它包含一些子目录,那么这些子目录也将被删除。在我们的例子中/demo1将首先被删除,然后/demo目录将被删除。
Client() 方法说明:
Client() 方法可以接受下面列出的所有参数:
- host(字符串): NameNode的IP地址。
- port(int): Namenode的RPC端口。
- hadoop_version (int): Hadoop协议版本(默认为:9)
- use_trash (boolean):删除文件时使用垃圾桶。
- Effective_use (字符串): HDFS 操作的有效用户(默认用户是当前用户)。
如果找不到我们指定的文件名,则 delete() 方法将抛出FileNotFoundException 。如果目录包含一些子目录并且没有提到recurse=True ,delete() 方法将抛出DirectoryException 。
第四步:运行remove_directory.py文件,观察结果。
python remove_directory.py // this will remove directory's recursively as mentioned in delete() argument
在上图中‘result’ :True表示我们已成功删除目录。
第 5 步:我们可以手动或使用以下命令检查目录是否已删除或未访问。
hdfs dfs -ls /
现在我们可以看到 /demo 和 /demo2 在 HDFS 上不再可用。