参考网址:http://www.jb51.net/article/43500.htm
#!/usr/bin/python
# -*- coding:utf-8 -*-
"""
time:2017年5月23日17:01:38
author:zmy
intention:根据某个集市直接获取需要迁移的清单
"""
import os
import time
sum_line = 0
if __name__ == '__main__':
#获取该mart_cmo下所有的列表:排除"partitions|.Trash|data_export.db|.sparkStaging|.staging"这几个清单
fr2 = os.popen('hdfs dfs -du -s hdfs://172.19.167.12:8020/user/mart_cmo/* |sort -n -k1 |egrep -v "partitions|.Trash|data_export.db|.sparkStaging|.staging"')
#此时的整个表清单上是个字符串
content = fr2.read()
content_list = content.split("\n")
#该目录用与存放最终的目录
final_result = []
#第一轮处理
middle_result1 = []
for line in content_list:
if line:
big_location = line.split()
#获取当前行的目录大小和位置信息
content_size = int(big_location[0])
content_location = str(big_location[1])
#5T的大小 = 5497558138880
if content_size < 5497558138880:
sum_line += 1
final_result.append(big_location[1])
else:
middle_result1.append(big_location[1]+"/*")
#第二轮处理
#注意:此时line的形式为 大小 + 位置
middle_result2 = []
for line in middle_result1:
if line:
location = line.strip()
os.environ['location'] = str(location)
fr2 = os.popen('hdfs dfs -du -s $location |sort -n -k1')
content_data = fr2.read()
#进行二次判断
content2_list = content_data.split("\n")
for line in content2_list:
if line:
big_location = line.split()
#获取当前行的目录大小和位置信息
content_size = int(big_location[0])
content_location = str(big_location[1])
# 5T的大小 = 5497558138880
if content_size < 5497558138880:
sum_line += 1
final_result.append(big_location[1])
else:
#下面一行代码包含大小和位置
middle_result2.append(big_location[1]+"/*")
#第三轮处理
#middle_result2当中存放的是目录,注意:没有对应的大小
middle_result3 = []
for line in middle_result2:
if line:
location = line.strip()
os.environ['location'] = str(location)
fr3 = os.popen('hdfs dfs -du -s $location |sort -n -k1')
content_data = fr3.read()
#进行三次判断
content3_list = content_data.split("\n")
for line in content3_list:
if line:
big_location = line.split()
#获取当前行的目录大小和位置信息
content_size = int(big_location[0])
content_location = str(big_location[1])
# 5T的大小 = 5497558138880
if content_size < 5497558138880:
sum_line += 1
final_result.append(big_location[1])
else:
#下面一行代码包含大小和位置
middle_result3.append(big_location[1]+"/*")
#第四轮处理
#呵呵,经过第四轮处理后不知道会不会消失
middle_result4 = []
for line in middle_result3:
if line:
location = line.strip()
os.environ['location'] = str(location)
fr4 = os.popen('hdfs dfs -du -s $location |sort -n -k1')
content_data = fr4.read()
#进行四次判断
content4_list = content_data.split("\n")
for line in content4_list:
if line:
big_location = line.split()
#获取当前行的目录大小和位置信息
content_size = int(big_location[0])
content_location = str(big_location[1])
# 5T的大小 = 5497558138880
if content_size < 5497558138880:
sum_line += 1
final_result.append(big_location[1])
else:
#下面一行代码包含大小和位置
middle_result4.append(big_location)
#4轮过后我们在检查一次
print("sum=%d"%sum_line)
print("4轮过后仍没有被细化的列表:")
for line in middle_result4:
print("\033[45;1m%s\033[0m" % line)
line = "Successful!"
print("\033[45;1m%s\033[0m"%(line))
#将最终的结果输出到指定的文件list当中
print("正在将最终的结果刷到list中")
fr5 = open("./list",mode="w",encoding="utf-8")
for line in final_result:
if line:
fr5.write(line+"\n")
fr5.close()
# 从结果集list中过滤出不含有dt=信息的文本,并赋值给list1
print("正在从结果集当中过滤出含有dt分区的字段!")
os.system('more list | grep -v "dt=" > list1')
time.sleep(5)
# 从结果集list中过滤出含有dt=信息的文本,并赋值给list2
print("正在从结果集当中过滤出不含有dt分区的字段!")
os.system('more list | grep "dt=" > list2')
time.sleep(5)
#对于list1,调用脚本list.sh进行处理,形成第一个结果集distcp.list
print("根据list列表中的清单构造10K对应的清单列表")
os.system('sh ./list.sh')
time.sleep(30)
#对于list2,进行文本格式的处理,只过滤出路径即可。
fr6 = os.popen('more list2 |awk -F "/dt=" \'{print $1}\'')
content6 = fr6.read()
content_list6 = content6.split("\n")
# 定义一个set列表,用来去重
set_list = []
for line in content_list6:
if line and line not in set_list:
set_list.append(line)
print("你好,需要手动处理的清单为:\033[42;1m%d\033[0m个" % (len(set_list)))
print("将需要手动处理的清单存储到了distcp_handle.list文本中")
fr7 = open("./distcp_handle.list", mode="w", encoding="utf-8")
for line in set_list:
if line:
fr7.write(line + "\n")
"""
当前目录下各个文件的作用:
1.transfer_help.py 总脚本
2.list 所有需要迁移的清单
3.list1 不含有日期的清单
4.list2 含有日期的清单
5.distcp.list list1通过list.sh处理的结果,是第一批需要拷贝的清单结果
6.distcp_handle.list 需要手动进一步处理的清单
7. 本脚本执行方法:/usr/local/bin/python3.2 transfer_help.py
8.在cmo1或者cmo2客户端执行hdfs dfs -rmr hdfs://ns14/user/mart_cmo/temp/*/.distcp.tmp.attempt* 可以删除*/目录下distcp的冬冬
"""