【问题标题】:Custom Hadoop Configuration for Spark from Python (PySpark)?来自 Python (PySpark) 的 Spark 自定义 Hadoop 配置?
【发布时间】:2015-06-16 18:36:32
【问题描述】:

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

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

问题是我想构建自定义 Hadoop Configuration 并加载其他资源文件并设置属性。意图是在PythonSparkContext中使用修改后的Configuration

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

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

【问题讨论】:

    标签: python hadoop mapreduce apache-spark pyspark


    【解决方案1】:

    当我放弃修改Configurationonline 的要求并且仅基于自定义的一组 Hadoop 配置 *.xml 文件时,我已经解决了这个难题。

    起初,我编写了 Java 类,它将附加层的配置添加到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,他或她会通过类路径搜索以下 inftastructure 配置:core、hdfs、MapReduce、YARN、HBase。相应的文件是core-default.xmlcore-site.xmlhdfs-default.xmlhdfs-site.xmlmapred-default.xmlmapred-site.xmlyarn-default.xmlyarn-site.xmlhbase-default.xmlhbase-site.xml。如果我需要额外的层,扩展没有问题。

    Configurator.init() 只是为了有更简单的类加载句柄。

    现在我需要在 Spark 上下文启动期间扩展 Python 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 基础架构中很常见)导致从类路径加载所有层配置,我可以在其中放置所需集群的配置。

    至少对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      相关资源
      最近更新 更多