为Apache Spark指定外部配置文件

Ale*_*der 12 java amazon-web-services apache-spark

我想在配置文件中指定所有Spark的属性,然后在运行时加载该配置文件.

~~~~~~~~~~编辑~~~~~~~~~~~

事实证明我对如何去做这件事非常困惑.忽略这个问题的其余部分.要查看有关如何将.properties文件加载到spark集群的简单解决方案(在Java Spark中),请参阅下面的答案.

以下原始问题仅供参考.

~~~~~~~~~~~~~~~~~~~~~~~~

我想要

  • 不同的配置文件取决于环境(本地,aws)
  • 我想指定特定于应用程序的参数

举个简单的例子,假设我想根据字符串过滤日志文件中的行.下面我有一个简单的Java Spark程序,它从文件中读取数据并根据用户定义的字符串对其进行过滤.该程序采用一个参数,即输入源文件.

Java Spark代码

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

配置文件

配置文件基于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
Run Code Online (Sandbox Code Playgroud)

问题

我使用以下参数执行应用程序:

/path/to/inputtext.txt --conf /path/to/configfile.config
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为例外

Exception in thread "main" org.apache.spark.SparkException: A master URL must be set in your configuration
Run Code Online (Sandbox Code Playgroud)

被抛出.对我来说意味着没有加载配置文件.

我的问题是:

  1. 我的设置有什么问题?
  2. 在spark配置文件中指定应用程序特定的参数是否很好?

Ale*_*der 8

所以过了一会儿,我意识到我很困惑.将配置文件放入内存的最简单方法是使用标准属性文件,将其放入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);
Run Code Online (Sandbox Code Playgroud)


小智 7

试试这个

--properties-file /path/to/configfile.config
Run Code Online (Sandbox Code Playgroud)

然后在scala程序中访问

sc.getConf.get("spark.app.name")
Run Code Online (Sandbox Code Playgroud)


Mar*_*ier 5

  1. --conf仅设置单个Spark属性,而不用于读取文件。
    例如--conf spark.shuffle.spill=false
  2. 应用程序参数不包含在spark-defaults中,而是作为程序args传递(并从您的main方法读取)。spark-defaults应该包含适用于大多数或所有作业的SparkConf属性。如果要使用配置文件而不是应用程序参数,请查看Typesafe Config。它还支持环境变量。


小智 5

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"))
Run Code Online (Sandbox Code Playgroud)

  • 您如何提及属性文件路径?默认情况下,它在哪里寻找文件?如果主节点与运行应用程序的主节点不同,该怎么办? (5认同)