我的火花安装在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个 Actuator 和20个分区 . 当表记录较小(例如小于200000)时,20个活动任务可以分配给7个执行程序余额,如下所示:Assign task averagely

但是当表记录很大时,例如1000000,该任务将不会平均分配 . 总有一个执行程序长时间运行,其他执行程序很快运行 . 有些执行者无法分配任务 . 像这样:enter image description here