分布式0917-遍历检索的多进程初试水

目录

大数据分布式计算 0917

本次课程内容讲述的几个注意的有意思的东西:

分布式是什么

“数据向代码跑” / “代码向数据跑”

原本的流程:

新流程:

俗话说:双拳难敌四手嘛。

多进程 并非 多线程

多进程即开很多程序,多线程是多路并行。

map-reduce原理

1+3+5+7+9+11+13+15+17
map
(1+3+5) + (7+9+11) + (13+15+17)
reduce
9 + 27+ 45
answer

常用的框架已经封装了分布式运算的计算法,用户只写需求的逻辑,由此产生了MapReduce的框架和Yarn,并不做运算。

因为专门的“计算引擎”(基于计算系统)Hadoop,HDFS储存,spark(生于伯克利,号称分布式平台中流砥柱)

学习目标:非常熟悉,能够把自己写的东西放上去,不写,要会用。

作业

请用R或者Python自带的并行计算模块实现一个简单的单机文件查找代码,并与串行代码在效率上做比较。思考分布式与并行计算的区别。

我的答案,由于特殊需求无意义地加长了很多。同时就当初学python的任务驱动练习了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

# coding:utf-8
# 分布式计算1-多进程对比检索代码
import os
import time
import multiprocessing as mp
from time import sleep

def get_all_file(path):
res = []
for root, dirs, files in os.walk(path):
for file in files:
res.append(os.path.join(root, file))
return (res)

def checkdir(dir):
file = dir.split('\\')[-1]
(filename, extension) = os.path.splitext(file)
if (extension == '.txt') and ('win' in filename): # 检验文件后缀与事先设置的关键字
sleep(1)
return (dir)
# 上一版作业是猜测,不过本次提交版本根据一段未写在作业中的代码可以得知,要把循环从函数剔除,非遍历的部分才能使用迭代加速
# 同时为了实现更直观的对比,而不是对简单函数进行多进程(有时甚至会起反效果),加入了sleep函数

if __name__ == '__main__':
# 设定参数
path0 = "D:\\" # 设置一个路径,目标是这个路径下全部带有关键字‘win’的文本文档

# 顺序执行部分
print('顺序执行:')
start1 = time.time()
pathall2 = get_all_file(path0)
result = []
for path in pathall2:
result.append(checkdir(path))
for res2 in result:
if res2 != None: # 为了对比效果,特意使用了和多进程代码相同的函数,徒增复杂度
print(res2)
end1 = time.time()
yongshi1 = end1 - start1
print("顺序耗时:%s" % yongshi1)
print('=='*20)
# 多进程执行部分
print("多进程执行:")
start2 = time.time()
pool = mp.Pool(4) # 设置4个进程同时运行,不过感觉没有必要,空缺时会根据系统设置最佳参数
pathall1 = pool.apply_async(get_all_file,args=(path0,)).get()
# 上一行根据结果来看,没有起作用,即for循环不能被多进程加速,必须按部就班
results1 = pool.map(checkdir, pathall1) # 此处pathall一定是一个可迭代变量(iter)
pool.close() #关闭池子,不能再加入进程
pool.join() # 等待进程结束
for res1 in results1:
if res1 != None:
print(res1)
end2 = time.time()
yongshi2 = end2 - start2
print("多进程耗时:%s" % yongshi2)

# 总结:其实本程序慢在os.walk()遍历文件,对后续<比对筛选打印>函数调用多进程反而可能降速
# 核心函数只有pool四行,以及调用os.walk函数

多进程也不见得很好用嘛,甚至不经过特意等待,比顺序运行还慢,哈哈。

(请多指教,完)


本文链接: https://konelane.github.io/2020/09/17/200917hadoop/

-- EOF --

¥^¥请氦核牛饮一盒奶~suki