来自 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.xml
、core-site.xml
、hdfs-default.xml
、hdfs-site.xml
、mapred-default.xml
、mapred-site.xml
、yarn-default.xml
、yarn-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 路径加载所有层配置,我可以在其中放置配置对于需要的集群。
至少对我有用。
我有基于 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.xml
、core-site.xml
、hdfs-default.xml
、hdfs-site.xml
、mapred-default.xml
、mapred-site.xml
、yarn-default.xml
、yarn-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 路径加载所有层配置,我可以在其中放置配置对于需要的集群。
至少对我有用。