作为this question的延续,您可以告诉我可以从SparkContext.setLocalProperties
更改哪些属性吗?我可以更改核心,RAM等吗?
答案 0 :(得分:4)
根据文档说明,localProperties
是protected[spark]
的{{1}}属性,您可以通过该属性创建逻辑作业组。另一方面,它们是SparkContext
线程局部变量。这意味着当在变量中维护的每个线程属性必须自动传输到创建的任何子线程时,它们优先于普通线程局部变量使用。当Inheritable
{}时,将本地属性传递给工作者请求运行或提交Spark作业,然后将其传递给SparkContext
。
通常DAGScheduler
用于通过Local properties
每线程属性将作业分组到FAIR作业调度程序中的池中,并使用方法spark.scheduler.pool
来设置SQLExecution.withNewExecutionId
。
我没有在独立的spark群集中分配线程局部属性的经验。值得尝试检查它。
答案 1 :(得分:3)
我使用属性spark.executor.memory
(可用属性为here)进行了一些测试,实际上是在一个非常简单的本地Spark上,开始两个线程,每个线程具有不同的设置似乎仅限于线程,带有代码(可能不是你将部署到生产中的代码),在这篇文章的最后,做一些线程交错,以确保它不是通过一些纯粹的调度运气,我得到以下输出(清理火花输出到我的控制台):
Thread 1 Before sleeping mem: 512
Thread 2 Before sleeping mem: 1024
Thread 1 After sleeping mem: 512
Thread 2 After sleeping mem: 1024
非常简洁地观察一个线程中的声明属性保留在所述线程内部,虽然我很确定它很容易导致荒谬的情况,所以在应用这些技术之前我还是建议谨慎。
public class App {
private static JavaSparkContext sc;
public static void main(String[] args) {
SparkConf conf = new SparkConf().setMaster("local")
.setAppName("Testing App");
sc = new JavaSparkContext(conf);
SparkThread Thread1 = new SparkThread(1);
SparkThread Thread2 = new SparkThread(2);
ExecutorService executor = Executors.newFixedThreadPool(2);
Future ThreadCompletion1 = executor.submit(Thread1);
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Future ThreadCompletion2 = executor.submit(Thread2);
try {
ThreadCompletion1.get();
ThreadCompletion2.get();
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static class SparkThread implements Runnable{
private int i = 1;
public SparkThread(int i) {
this.i = i;
}
@Override
public void run() {
int mem = 512;
sc.setLocalProperty("spark.executor.memory", Integer.toString(mem * i));
JavaRDD<String> input = sc.textFile("test" + i);
FlatMapFunction<String, String> tt = s -> Arrays.asList(s.split(" "))
.iterator();
JavaRDD<String> words = input.flatMap(tt);
System.out.println("Thread " + i + " Before sleeping mem: " + sc.getLocalProperty("spark.executor.memory"));
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//do some work
JavaPairRDD<String, Integer> counts = words.mapToPair(t -> new Tuple2(t, 1))
.reduceByKey((x, y) -> (int) x + (int) y);
counts.saveAsTextFile("output" + i);
System.out.println("Thread " + i + " After sleeping mem: " + sc.getLocalProperty("spark.executor.memory"));
}
}
}
答案 2 :(得分:0)
LocalProperties提供了一种简单的机制,可以将(用户定义的)配置从驱动程序传递给执行程序。您可以使用执行程序上的TaskContext来访问它们。一个例子是SQL Execution ID