运行ML算法星火地图功能里面运行ML算法星火地图功能里面(Run ML algorithm insi

2019-05-12 13:49发布

所以,我一直在尝试了几天,现在运行在星火映射函数内部ML算法。 我发布了一个更具体的问题,而是引用星火的ML算法使我有以下错误:

AttributeError: Cannot load _jvm from SparkContext. Is SparkContext initialized?

很显然,我不能引用SparkContext里面apply_classifier功能。 我的代码是类似于在前面的问题,我问,但至今还没有找到一个解决我所期待的建议:

def apply_classifier(clf):
    dt = DecisionTreeClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures", maxDepth=3)
    if clf == 0:
        clf = DecisionTreeClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures", maxDepth=3)
    elif clf == 1:
        clf = RandomForestClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures", numTrees=5)

classifiers = [0, 1]

sc.parallelize(classifiers).map(lambda x: apply_classifier(x)).collect() 

我已经尝试使用flatMap而不是map ,但我得到NoneType object is not iterable

我也想传递一个广播的数据集(这是一个数据帧)作为内部参数apply_classifier功能。 最后,是有可能做什么,我试图做的? 有什么选择?

Answer 1:

是有可能做什么,我试图做的?

它不是。 阿帕奇星火不支持任何形式的嵌套和分布式操作只能由驾驶员进行初始化。 这包括访问分布式的数据结构,如火花DataFrame

有什么选择?

这取决于很多因素,如数据的大小,可用的资源量和算法的选择。 一般来说,你有三种选择:

  • 使用仅Spark任务管理工具来培训本地,非分布式模型。 它看起来像你探索这条道路在一定程度上已经。 对于更高级的实现这种方式,你可以检查spark-sklearn

    通常,当数据是相对小的这种方法是特别有用的。 它的优点是,有多个作业之间没有竞争。

  • 使用标准的多线程工具,从一个单一的情况下提交多个独立作业。 您可以使用例如threadingjoblib

    虽然这种方法可能,我不会推荐它在实践中。 并非所有Spark组件是线程安全的,你必须非常小心,以避免意外行为。 它也给你在资源分配上很难控制。

  • 参数化你的星火应用程序并使用外部管线管理器( Apache的气流 , 路易吉 , 留芳 )提交作业。

    虽然这种方法也有一些缺点(它需要数据保存到永久存储),它也是最普遍,最强大的,并给出了资源分配大量的控制。



文章来源: Run ML algorithm inside map function in Spark