我有一次迭代,它调用LogisticRegressionWithLBFGS x次。
问题是,每次循环迭代越来越慢,最终永远挂起。
我尝试了很多不同的方法,但到目前为止还没有运气。
代码如下:
def getBootsrapedAttribution( iNumberOfSamples, df):
def parsePoint(line):
return LabeledPoint(line[2], line[3:])
aResults = {}
while x <= iNumberOfSamples:
print ("## Sample: " + str(x))
a = datetime.datetime.now()
dfSample = sampleData(df)
dfSample.repartition(700)
parsedData = dfSample.rdd.map(parsePoint)
parsedData = parsedData.repartition(700)
parsedData.persist()
model = LogisticRegressionWithLBFGS.train(parsedData)
parsedData.unpersist()
b = datetime.datetime.now()
print(b-a)
x+=1
def sampleData(df):
df = df.repartition(500)
dfFalse = df.filter('col == 0').sample(False, 0.00035)
dfTrue = df.filter('col == 1')
dfSample = dfTrue.unionAll(dfFalse)
return dfSample
getBootsrapedAttribution(50, df)
输出看起来像这样:
## Sample: 1
0:00:44.393886
## Sample: 2
0:00:28.403687
## Sample: 3
0:00:30.884087
## Sample: 4
0:00:33.523481
## Sample: 5
0:00:36.107836
## Sample: 6
0:00:37.077169
## Sample: 7
0:00:41.160941
## Sample: 8
0:00:54.768870
## Sample: 9
0:01:01.31139
## Sample: 10
0:00:59.326750
## Sample: 11
0:01:37.222967
## Sample: 12
...hangs forever
如果没有model = LogisticRegressionWithLBFGS.train(parsedData)
,它就会在没有性能问题的情况下运行。
我的群集如下所示:
spark.default.parallelism 500
spark.driver.maxResultSize 20G
spark.driver.memory 200G
spark.executor.cores 32
spark.executor.instances 2
spark.executor.memory 124G
有谁知道这个问题?
答案 0 :(得分:1)
我回答了我自己的问题。
问题在方法LogisticRegressionWithLBFGS
内。用LogisticRegression
中的Spark 2.1+
替换此方法解决了这个问题。每次迭代都不会减慢速度。
此外,您可以使用上述代码进行更多改进。
可以使用rdd
方法sample
替换DataFrame
方法sampleBy
。这也将避免不必要的union
:
.sampleBy('col', fractions={0: 0.00035, 1: 1}, seed=1234)
此外,上面代码中的所有repartitions
都是不必要的。重要的是,传递给df
的{{1}}分配得很好且getBootsrapedAttribution()
。