我的火花安装在CDH5 5.8.0中并以纱线运行其应用程序。群集中有5台服务器。一台服务器用于资源管理器。其他四个服务器是节点管理器。每台服务器都有2个核心和8G内存。
spark应用程序主逻辑并不复杂:来自postgres db的查询表。为每条记录做一些业务,最后将结果保存到db。这是主要代码:
String columnName="id";
long lowerBound=1;
long upperBound=100000;
int numPartitions=20;
String tableBasic="select * from table1 order by id";
DataFrame dfBasic = sqlContext.read().jdbc(JDBC_URL, tableBasic, columnName, lowerBound, upperBound,numPartitions, dbProperties);
JavaRDD<EntityResult> rddResult = dfBasic.javaRDD().flatMap(new FlatMapFunction<Row, Result>() {
public Iterable<Result> call(Row row) {
List<Result> list = new ArrayList<Result>();
........
return list;
}
});
DataFrame saveDF = sqlContext.createDataFrame(rddResult, Result.class);
saveDF = saveDF.select("id", "column 1", "column 2",);
saveDF.write().mode(SaveMode.Append).jdbc(SQL_CONNECTION_URL, "table2", dbProperties);
我使用此命令将应用程序提交给yarn:
spark-submit --master yarn-cluster --executor-memory 6G --executor-cores 2 --driver-memory 6G --conf spark.default.parallelism=90 --conf spark.storage.memoryFraction=0.4 --conf spark.shuffle.memoryFraction=0.4 --conf spark.executor.memory=3G --class com.Main1 jar1-0.0.1.jar
有7个执行器和20个分区。当表记录很小(例如小于200000)时,20个活动任务可以分配给7个执行程序余额,如下所示: Assign task averagely
但是当表记录很大时,例如1000000,该任务将不会平均分配。总有一个执行程序运行很长时间,其他执行程序很快运行。有些执行程序无法分配任务。像这样: enter image description here