Python 分布式计算框架 PP (Parallel Python):集群模式下的实践探索

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 该文介绍了使用Parallel Python (PP) 在两台物理机上构建分布式计算集群的经验。PP是一个轻量级框架,旨在简化Python代码在多处理器系统和集群中的并行执行。文中通过设置子节点的IP、端口和密钥启动PP服务器,并在主节点创建PP实例进行负载均衡。实验使用官方的质数和计算示例,显示PP在集群模式下能有效利用多台机器的多核CPU,实现计算效率的显著提升。未来,作者计划进一步研究PP在更复杂任务和大规模集群中的应用潜力。

该文章是我在2016年发布在某sdn上的,搬运过来。


背景介绍

在现代计算领域,随着硬件性能的提升,特别是多核处理器和大规模集群的普及,分布式计算成为提高程序效率和处理大规模数据的关键手段。Parallel Python(简称PP)作为一款轻量级的分布式计算框架,旨在简化Python代码在SMP系统(多处理器或多核心)和集群环境中的并行执行。尽管网络上不乏关于PP单机多进程应用的教程,但在集群模式下PP的潜力却鲜少被深入挖掘。本文将分享在两台物理机(一台四核,一台双核)上搭建PP集群,实现分布式计算的实践经验。

平台配置与PP集群部署

部署PP集群的第一步是在所有参与计算的节点上安装Python环境,并通过pip install pp安装PP库。安装完成后,ppserver.py脚本将出现在Python的scripts目录中,它用于在子节点上启动监听端口。例如,在子节点上执行python ppserver.py -p 35000 -i 192.168.1.104 -s "123456",其中-p指定监听端口,-i是本地IP地址,-s后跟的是密钥,确保通信安全。

主节点则负责创建ppserver实例,需指定子节点的IP列表及相同的密钥,以建立安全的通信渠道。主节点通过动态负载均衡机制,将任务智能分配至各子节点,充分利用集群中每台机器的多核优势。

实战案例:求解质数和

为了验证PP在集群模式下的性能,我们采用了官方示例sum_primes.py,其主要功能是计算小于给定整数的所有质数之和。在本次实验中,我们将数据规模扩大,同时利用两台物理机的计算资源,观察PP的分布式计算能力。

Python

#!/usr/bin/python
# File: sum_primes.py
# Author: VItalii Vanovschi
# Desc: This program demonstrates parallel computations with pp module
# It calculates the sum of prime numbers below a given integer in parallel
# Parallel Python Software: http://www.parallelpython.com
 
import math, sys, time, datetime
import pp
 
def isprime(n):
    """Returns True if n is prime and False otherwise"""
    if not isinstance(n, int):
        raise TypeError("argument passed to is_prime is not of 'int' type")
    if n < 2:
        return False
    if n == 2:
        return True
    max = int(math.ceil(math.sqrt(n)))
    i = 2
    while i <= max:
        if n % i == 0:
            return False
        i += 1
    return True
 
def sum_primes(n):
    """Calculates sum of all primes below given integer n"""
    return sum([x for x in xrange(2,n) if isprime(x)])
 
print """Usage: python sum_primes.py [ncpus]
    [ncpus] - the number of workers to run in parallel, 
    if omitted it will be set to the number of processors in the system
"""
 
# tuple of all parallel python servers to connect with
#ppservers = ()
ppservers = ("192.168.1.104:35000",)
#ppservers=("*",)
 
if len(sys.argv) > 1:
    ncpus = int(sys.argv[1])
    # Creates jobserver with ncpus workers
    job_server = pp.Server(ncpus, ppservers=ppservers, secret="123456")
else:
    # Creates jobserver with automatically detected number of workers
    job_server = pp.Server(ppservers=ppservers, secret="123456")
 
print "Starting pp with", job_server.get_ncpus(), "workers"
 
# Submit a job of calulating sum_primes(100) for execution. 
# sum_primes - the function
# (100,) - tuple with arguments for sum_primes
# (isprime,) - tuple with functions on which function sum_primes depends
# ("math",) - tuple with module names which must be imported before sum_primes execution
# Execution starts as soon as one of the workers will become available
job1 = job_server.submit(sum_primes, (100,), (isprime,), ("math",))
 
# Retrieves the result calculated by job1
# The value of job1() is the same as sum_primes(100)
# If the job has not been finished yet, execution will wait here until result is available
result = job1()
 
print "Sum of primes below 100 is", result
 
start_time = time.time()
 
# The following submits 8 jobs and then retrieves the results
inputs = (500000, 500100, 500200, 500300, 500400, 500500, 500600, 500700, 500000, 500100, 500200, 500300, 500400, 500500, 500600, 500700)
#inputs = (1000000, 1000100, 1000200, 1000300, 1000400, 1000500, 1000600, 1000700)
jobs = [(input, job_server.submit(sum_primes,(input,), (isprime,), ("math",))) for input in inputs]
for input, job in jobs:
    print datetime.datetime.now()
    print "Sum of primes below", input, "is", job()
 
print "Time elapsed: ", time.time() - start_time, "s"
job_server.print_stats()


运行结果表明,PP成功地在两台机器上进行了负载均衡,总耗时显著减少,加速比达到了5.1倍,意味着相较于单机计算,PP集群模式有效利用了多台计算机的多核CPU资源,极大地提升了计算效率。


c:\Python27\python.exe test_pp_official.py
Usage: python sum_primes.py [ncpus]
    [ncpus] - the number of workers to run in parallel,
    if omitted it will be set to the number of processors in the system
Starting pp with 4 workers
Sum of primes below 100 is 1060
2016-08-28 19:07:26.579000
Sum of primes below 500000 is 9914236195
2016-08-28 19:07:33.032000
Sum of primes below 500100 is 9917236483
2016-08-28 19:07:33.035000
Sum of primes below 500200 is 9922237979
2016-08-28 19:07:33.296000
Sum of primes below 500300 is 9926740220
2016-08-28 19:07:33.552000
Sum of primes below 500400 is 9930743046
2016-08-28 19:07:33.821000
Sum of primes below 500500 is 9934746636
2016-08-28 19:07:34.061000
Sum of primes below 500600 is 9938250425
2016-08-28 19:07:37.199000
Sum of primes below 500700 is 9941254397
2016-08-28 19:07:37.202000
Sum of primes below 500000 is 9914236195
2016-08-28 19:07:41.640000
Sum of primes below 500100 is 9917236483
2016-08-28 19:07:41.742000
Sum of primes below 500200 is 9922237979
2016-08-28 19:07:41.746000
Sum of primes below 500300 is 9926740220
2016-08-28 19:07:41.749000
Sum of primes below 500400 is 9930743046
2016-08-28 19:07:41.752000
Sum of primes below 500500 is 9934746636
2016-08-28 19:07:41.756000
Sum of primes below 500600 is 9938250425
2016-08-28 19:07:43.846000
Sum of primes below 500700 is 9941254397
Time elapsed:  17.2770001888 s
Job execution statistics:
 job count | % of all jobs | job time sum | time per job | job server
         6 |         35.29 |      27.4460 |     4.574333 | 192.168.1.104:35000
        11 |         64.71 |      60.2950 |     5.481364 | local
Time elapsed since server creation 17.2849998474
0 active tasks, 4 cores


总结与展望

通过本次实战,我们不仅见证了PP在集群模式下的强大性能,也验证了其在分布式计算场景中的灵活性与高效性。PP不仅简化了并行计算的实现,还展示了其在跨平台、异构集群环境中的卓越适应能力。未来,我们期待进一步探索PP在更复杂计算任务和更大规模集群中的表现,挖掘其在科学计算、数据分析等领域的潜在价值。

参考文献

相关文章
|
3天前
|
存储 人工智能 数据挖掘
探索Python编程:从入门到实践
【8月更文挑战第28天】在这篇文章中,我们将一起踏上Python编程的奇妙旅程。无论你是编程新手还是希望提升现有技能的开发者,本文都将为你提供一条清晰的道路,引导你理解Python的核心概念并应用到实际项目中。我们将通过具体的代码示例,展示如何用Python解决实际问题,让你在学习的同时感受到编程的乐趣和成就感。
|
4天前
|
机器学习/深度学习 算法 程序员
从迷茫到明晰:我的编程之旅探索Python中的异步编程:从理解到实践
【8月更文挑战第27天】在代码的世界里,我从一个迷茫的新手成长为一个有目标、有能力的开发者。这篇文章是我的技术感悟之旅,记录了我从大学毕业后的迷茫,到勇敢尝试新领域,再到不断学习和提升的过程。我希望我的经历能给你带来启示,就像甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起在编程的道路上,找到属于自己的方向。
|
2天前
|
数据采集 API 数据库
探索Python中的异步编程:从理解到实践
【8月更文挑战第30天】在Python世界中,异步编程是一个既神秘又强大的概念。它像是给程序装上了翅膀,让原本缓慢、阻塞的操作变得迅速而流畅。本文将带你走进异步编程的世界,从基本的概念讲起,通过实例演示如何运用Python的异步特性来提升程序的性能和响应速度。我们将一步步构建一个简易的异步Web爬虫,让你在实践中感受异步编程的魅力。
|
1天前
|
存储 Kubernetes Cloud Native
探索Python编程的奥秘云原生时代的容器编排:Kubernetes入门与实践
【8月更文挑战第30天】本文以浅显易懂的方式,探讨了Python编程的核心概念和技巧。从基础语法到高级特性,再到实际应用案例,逐步引导读者深入理解Python编程的精髓。通过本文的学习,读者将能够掌握Python编程的基本技能,并激发进一步探索的兴趣。
19 13
|
1天前
|
设计模式 调度 Python
Python中的异步编程:从理解到实践打造你的个人博客——从零开始的指南
【8月更文挑战第30天】本文将带你深入探索Python的异步编程世界,从基础概念到实际应用,一步步揭示如何通过asyncio库提升程序的响应性和效率。我们将通过实际代码示例,展示如何创建异步任务、管理事件循环以及处理并发操作,让你的代码运行得更加流畅和高效。
|
1天前
|
运维 Kubernetes Cloud Native
云原生之旅:Kubernetes 集群的搭建与实践Python 编程入门:从零基础到编写实用脚本
【8月更文挑战第30天】在数字化转型的大潮中,云原生技术以其弹性、可扩展性及高效运维能力成为企业IT架构升级的关键。本文将通过实际操作演示如何在本地环境搭建一个简易的Kubernetes集群,带你领略云原生的魅力所在。从集群规划到服务部署,每一步都是对云原生理念的深刻理解和应用。让我们共同探索,如何通过Kubernetes集群的搭建和运维,提升业务灵活性和创新能力。
|
1天前
|
测试技术 Python
Python中的装饰器入门与实践
【8月更文挑战第30天】本文将带你走进Python中一个既神秘又强大的特性——装饰器。我们将从装饰器的基本概念入手,通过简单示例揭示其背后的原理。接着,我们会深入探索装饰器的高级用法,包括带参数的装饰器、装饰器嵌套和函数修饰符。最后,我们将通过一个实战项目来巩固所学知识,让装饰器成为你编程工具箱中的得力助手。
|
4天前
|
数据采集 存储 JavaScript
构建你的第一个Python爬虫:从理论到实践
【8月更文挑战第27天】本文旨在为初学者提供一个关于如何构建简单Python网络爬虫的指南。我们将从网络爬虫的基础概念讲起,然后通过一个实际的项目案例来展示如何抓取网页数据,并将其存储在本地文件中。文章将介绍必要的工具和库,并逐步引导读者完成一个简单的爬虫项目,以加深对网络数据抓取过程的理解。
|
3天前
|
存储 分布式计算 算法
探索Hadoop的三种运行模式:单机模式、伪分布式模式和完全分布式模式
在配置Hadoop集群之前,了解这三种模式的特点、适用场景和配置差异是非常重要的。这有助于用户根据个人需求和资源情况,选择最适合自己的Hadoop运行模式。在最初的学习和开发阶段,单机模式和伪分布式模式能为用户提供便利和成本效益。进而,当用户要处理大规模数据集时,完全分布式模式将是理想的选择。
11 2
|
2天前
|
数据采集 分布式计算 并行计算
Dask与Pandas:无缝迁移至分布式数据框架
【8月更文第29天】Pandas 是 Python 社区中最受欢迎的数据分析库之一,它提供了高效且易于使用的数据结构,如 DataFrame 和 Series,以及大量的数据分析功能。然而,随着数据集规模的增大,单机上的 Pandas 开始显现出性能瓶颈。这时,Dask 就成为了一个很好的解决方案,它能够利用多核 CPU 和多台机器进行分布式计算,从而有效地处理大规模数据集。
15 1
下一篇
云函数