为 Apache Spark 指定外部配置文件
Specifying an external configuration file for Apache Spark
我想在配置文件中指定 Spark 的所有属性,然后在运行时加载该配置文件。
~~~~~~~~~~编辑~~~~~~~~~~~
原来我对如何去做这件事很困惑。忽略这个问题的其余部分。要查看有关如何将 .properties 文件加载到 Spark 集群的简单解决方案(在 Java Spark 中),请参阅下面我的回答。
以下原题,仅供参考。
~~~~~~~~~~~~~~~~~~~~~~~~
我要
- 不同的配置文件取决于环境(本地,aws)
- 我想指定特定于应用程序的参数
举个简单的例子,假设我想根据字符串过滤日志文件中的行。下面我有一个简单的 Java Spark 程序,它从文件中读取数据并根据用户定义的字符串对其进行过滤。该程序接受一个参数,即输入源文件。
Java 星火代码
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
public class SimpleSpark {
public static void main(String[] args) {
String inputFile = args[0]; // Should be some file on your system
SparkConf conf = new SparkConf();// .setAppName("Simple Application");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> logData = sc.textFile(inputFile).cache();
final String filterString = conf.get("filterstr");
long numberLines = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) {
return s.contains(filterString);
}
}).count();
System.out.println("Line count: " + numberLines);
}
}
配置文件
配置文件基于https://spark.apache.org/docs/1.3.0/configuration.html,看起来像:
spark.app.name test_app
spark.executor.memory 2g
spark.master local
simplespark.filterstr a
问题
我使用以下参数执行应用程序:
/path/to/inputtext.txt --conf /path/to/configfile.config
但是,这不起作用,因为异常
Exception in thread "main" org.apache.spark.SparkException: A master URL must be set in your configuration
被抛出。对我来说意味着没有加载配置文件。
我的问题是:
- 我的设置有什么问题?
- 在 spark 配置文件中指定特定于应用程序的参数是好的做法吗?
--conf
只设置单个Spark属性,不用于读取文件。
例如--conf spark.shuffle.spill=false
.
- 应用程序参数不会进入 spark-defaults,而是作为程序参数传递(并从您的 main 方法中读取)。
spark-defaults
应包含适用于大多数或所有作业的 SparkConf 属性。如果您想使用配置文件而不是应用程序参数,请查看 Typesafe Config。它还支持环境变量。
FWIW,使用 Typesafe Config 库,我刚刚验证了这个在 ScalaTest 中的工作:
val props = ConfigFactory.load("spark.properties")
val conf = new SparkConf().
setMaster(props.getString("spark.master")).
setAppName(props.getString("spark.app.name"))
所以过了一段时间,我意识到我很困惑。将配置文件放入内存的最简单方法是使用标准属性文件,将其放入 hdfs 并从那里加载。作为记录,这是执行此操作的代码(在 Java Spark 中):
import java.util.Properties;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
SparkConf sparkConf = new SparkConf()
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
InputStream inputStream;
Path pt = new Path("hdfs:///user/hadoop/myproperties.properties");
FileSystem fs = FileSystem.get(ctx.hadoopConfiguration());
inputStream = fs.open(pt);
Properties properties = new Properties();
properties.load(inputStream);
试试这个
--properties-file /path/to/configfile.config
然后在 scala
程序中访问
sc.getConf.get("spark.app.name")
我想在配置文件中指定 Spark 的所有属性,然后在运行时加载该配置文件。
~~~~~~~~~~编辑~~~~~~~~~~~
原来我对如何去做这件事很困惑。忽略这个问题的其余部分。要查看有关如何将 .properties 文件加载到 Spark 集群的简单解决方案(在 Java Spark 中),请参阅下面我的回答。
以下原题,仅供参考。
~~~~~~~~~~~~~~~~~~~~~~~~
我要
- 不同的配置文件取决于环境(本地,aws)
- 我想指定特定于应用程序的参数
举个简单的例子,假设我想根据字符串过滤日志文件中的行。下面我有一个简单的 Java Spark 程序,它从文件中读取数据并根据用户定义的字符串对其进行过滤。该程序接受一个参数,即输入源文件。
Java 星火代码
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
public class SimpleSpark {
public static void main(String[] args) {
String inputFile = args[0]; // Should be some file on your system
SparkConf conf = new SparkConf();// .setAppName("Simple Application");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> logData = sc.textFile(inputFile).cache();
final String filterString = conf.get("filterstr");
long numberLines = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) {
return s.contains(filterString);
}
}).count();
System.out.println("Line count: " + numberLines);
}
}
配置文件
配置文件基于https://spark.apache.org/docs/1.3.0/configuration.html,看起来像:
spark.app.name test_app
spark.executor.memory 2g
spark.master local
simplespark.filterstr a
问题
我使用以下参数执行应用程序:
/path/to/inputtext.txt --conf /path/to/configfile.config
但是,这不起作用,因为异常
Exception in thread "main" org.apache.spark.SparkException: A master URL must be set in your configuration
被抛出。对我来说意味着没有加载配置文件。
我的问题是:
- 我的设置有什么问题?
- 在 spark 配置文件中指定特定于应用程序的参数是好的做法吗?
--conf
只设置单个Spark属性,不用于读取文件。
例如--conf spark.shuffle.spill=false
.- 应用程序参数不会进入 spark-defaults,而是作为程序参数传递(并从您的 main 方法中读取)。
spark-defaults
应包含适用于大多数或所有作业的 SparkConf 属性。如果您想使用配置文件而不是应用程序参数,请查看 Typesafe Config。它还支持环境变量。
FWIW,使用 Typesafe Config 库,我刚刚验证了这个在 ScalaTest 中的工作:
val props = ConfigFactory.load("spark.properties")
val conf = new SparkConf().
setMaster(props.getString("spark.master")).
setAppName(props.getString("spark.app.name"))
所以过了一段时间,我意识到我很困惑。将配置文件放入内存的最简单方法是使用标准属性文件,将其放入 hdfs 并从那里加载。作为记录,这是执行此操作的代码(在 Java Spark 中):
import java.util.Properties;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
SparkConf sparkConf = new SparkConf()
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
InputStream inputStream;
Path pt = new Path("hdfs:///user/hadoop/myproperties.properties");
FileSystem fs = FileSystem.get(ctx.hadoopConfiguration());
inputStream = fs.open(pt);
Properties properties = new Properties();
properties.load(inputStream);
试试这个
--properties-file /path/to/configfile.config
然后在 scala
程序中访问
sc.getConf.get("spark.app.name")