linux - PySpark hastighed Ubuntu vs Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et prøvejob for PySpark, som er en version af PageRank-algoritmen.
Koden er som følger:


from \_\_future\_\_ import print\_function
from operator import add
import timeit
from pyspark.sql import SparkSession

# Normalize a list of pairs(url, rank) to 1
def normalize(ranks):
    norm = sum([rank for u, rank in ranks])
    ranks = [(u, rank / norm) for (u, rank) in ranks ]
    return sorted(ranks, key=lambda x: x[1], reverse=True)

def pagerank\_2(edgeList, n, niter):
    # Loads all URLs from input file and initialize their neighbors.
    m = edgeList.groupByKey().cache()
    s = 0.85

    # Loads all URLs with other URL(s) link to from input file 
    # and initialize ranks of them to one.
    q = spark.sparkContext.range(n).map(lambda x: (x, 1.0)).cache()
    r = spark.sparkContext.range(n).map(lambda x: (x, 0.0)).cache()

    # Calculates and updates URL ranks continuously 
    # using PageRank algorithm.
    for iteration in range(niter):
        # Calculates URL contributions to the rank of other URLs.
        # Add URL ranks based on neighbor contributions.
        # Do not forget to add missing values in q and set to 0.0
        q = q.fullOuterJoin(m)
             .flatMap(lambda x: (x[1][1] and [(u, x[1][0]/len(x[1][1])) for u in x[1][1]]) or [])
             .reduceByKey(add)
             .rightOuterJoin(r)
             .mapValues(lambda x: (x[0] or 0)*s + (1-s))
        print("iteration = ", iteration)

    # Collects all URL ranks and dump them to console after normalization
    ranks = normalize(q.collect())
    print(ranks[0:10])


if \_\_name\_\_ == "\_\_main\_\_":

    spark = SparkSession
            .builder
            .master('local[*]')
            .appName("SparkPageRank")
            .config('spark.driver.allowMultipleContexts', 'true')
            .config('spark.sql.warehouse.dir', 'file:///C:/Home/Org/BigData/python/BE4/') 
            .config('spark.sql.shuffle.partitions', '10')
            .getOrCreate()

    spark.sparkContext.setLogLevel('WARN')

    g = [(0, 1), (0, 5), (1, 2), (1, 3), (2, 3),
         (2, 4), (2, 5), (3, 0), (5, 0), (5, 2)]
    n = 6
    edgeList = spark.sparkContext.parallelize(g)
    print(timeit.timeit('pagerank\_2(edgeList, 6, 10)', number=1, globals=globals()))


Noder er nummereret fra 0 til n-1. KantenList-parameteren er en RDD, der indeholder en liste over par noder (aka kanter).


Jeg kører det på Windows 10 (Anaconda, Spark 2.1.0, winutils) i lokal tilstand.
Dette job er fordelt som 2896 opgaver, som alle er meget lette.


Mit problem er løbetiden.
Med eksemplet ovenfor:



  • Windows 10:> 40mn!

  • Windows Subsystem til Linux (Ubuntu 14.04): 30s



Computeren er en bærbar computer kerne i7-4702HQ, 16Gb ram, 512Gb SSD.
Windows er langsommere end Linux, når det kommer til lanceringsprocessen, men 50x langsommere? Der er sikkert noget at gøre for at reducere dette hul?


Jeg har deaktiveret Windows Defender for alle de filer, der står på spil: java bibliotek, python bibliotek osv.
Enhver anden ide om hvad man skal se på?


Tak for enhver anelse.

Bedste reference


Måske er nøglen lokal [[*]] , hvilket betyder det



  Kør Spark lokalt med så mange arbejdstråde som logiske kerner på din
  maskine.



Forsøger at bruge f.eks. lokal [[10]]