背景是这样的,同事有个需求,将自己本地的80多个文件上传到hdfs上,找了hadoop命令没有直接上传文件夹的,所以自己写了个python脚本实现了这个需求,刚开始想着是用shell脚本,但是文件得上传到hdfs集群上,这个比较麻烦,想着本地有python环境,就有了下面的代码。
# -*- coding : utf-8 -*-
import os
from hdfs import InsecureClient
#hdfs 目标路径
base_path = "/hdfs/workspace"
#本地需要上传的路径
dir = "C:/tmp/统计数据"
client_hdfs = InsecureClient('http://192.168.200.81:9870', user='admin')
client_hdfs.makedirs(base_path)
def get_all_dir(path):
fills_list = os.listdir(path)
for file_name in fills_list:
file_abs_path = os.path.join(path, file_name)
if os.path.isdir(file_abs_path):
global dir_count
client_hdfs.makedirs(base_path + "/" + file_name)
print("dir:", file_name)
get_all_dir(file_abs_path)
else:
mid_path = file_abs_path.replace(dir, "").replace(file_name, "")
hdfs_path = base_path + mid_path + "" + file_name
local_path = file_abs_path
print(hdfs_path + " **" + local_path)
client_hdfs.upload(hdfs_path, file_abs_path)
print("file:", file_name)
if __name__ == '__main__':
get_all_dir(dir)
最后,这里面有个小坑,就是需要修改hosts文件,要不然upload这个方法会报错,就是将hadoop集群的ip地址和hostsname 填入hosts即可