来自 Python (PySpark) 的 Spark 自定义 Hadoop 配置?

Custom Hadoop Configuration for Spark from Python (PySpark)?

我有基于 Python 的脚本,它应该是 运行 在 Apache Spark 集群上。

我有 Hadoop MapReduce InputFormat 作为 RDD 的数据源。这里没问题。

问题是我想构建自定义 Hadoop Configuration 并加载额外的资源文件并设置属性。意图是在 Python SparkContext.

中使用修饰的 Configuration

我可以构建 JVM 可以构建和加载所需的代码 Hadoop Configuration。如何使用 PySpark 将它附加到 Python?

有人知道这一切是如何实现的吗?

我已经解决了这个难题,因为我放弃了在线修改 Configuration 并且仅基于自定义的 Hadoop 配置集 *.xml 文件的要求。

起初我写了 Java class,它为 org.apache.hadoop.conf.Configuration 添加了额外层的配置到默认资源。它的静态初始化附加配置默认资源:

public class Configurator {

    static {

        // We initialize needed Hadoop configuration layers default configuration
        // by loading appropriate classes.

        try {
            Class.forName("org.apache.hadoop.hdfs.DistributedFileSystem");
        } catch (ClassNotFoundException e) {
            LOG.error("Failed to initialize HDFS configuartion layer.");
        }

        try {
            Class.forName("org.apache.hadoop.mapreduce.Cluster");
        } catch (ClassNotFoundException e) {
            LOG.error("Failed to initialize YARN/MapReduce configuartion layer.");
        }

        // We do what actually HBase should: default HBase configuration
        // is added to default Hadoop resources.
        Configuration.addDefaultResource("hbase-default.xml");
        Configuration.addDefaultResource("hbase-site.xml");
    }

    // Just 'callable' handle.
    public void init() {
    }

}

所以现在如果有人加载我的 Configurator 他或她在 class 路径上搜索了以下基础结构配置:核心、hdfs、MapReduce、YARN、HBase。合适的文件是 core-default.xmlcore-site.xmlhdfs-default.xmlhdfs-site.xmlmapred-default.xmlmapred-site.xmlyarn-default.xmlyarn-site.xml , hbase-default.xml, hbase-site.xml。如果我需要额外的层,扩展没问题。

提供

Configurator.init() 只是为了让 class 加载更简单。

现在我需要扩展 Python Spark 脚本以在 Spark 上下文启动期间访问配置器:

# Create minimal Spark context.
sc = SparkContext(appName="ScriptWithIntegratedConfig")

# It's critical to initialize configurator so any
# new org.apach.hadoop.Configuration object loads our resources.
sc._jvm.com.wellcentive.nosql.Configurator.init()

所以现在正常的 Hadoop new Configuration() 构造(在基于 Hadoop 的数据集的 PythonRDD 基础设施中很常见)导致从 class 路径加载所有层配置,我可以在其中放置配置对于需要的集群。

至少对我有用。