spark worker 内存不足
spark worker insufficient memory
我有一个 spark/cassandra 设置,我在其中使用 spark cassandra java 连接器来查询 table。到目前为止,我有 1 个 spark 主节点(2 个核心)和 1 个工作节点(4 个核心)。它们在 conf/ 下都有以下 spark-env.sh:
#!/usr/bin/env bash
export SPARK_LOCAL_IP=127.0.0.1
export SPARK_MASTER_IP="192.168.4.134"
export SPARK_WORKER_MEMORY=1G
export SPARK_EXECUTOR_MEMORY=2G
这是我的 spark 执行代码:
SparkConf conf = new SparkConf();
conf.setAppName("Testing");
conf.setMaster("spark://192.168.4.134:7077");
conf.set("spark.cassandra.connection.host", "192.168.4.129");
conf.set("spark.logConf", "true");
conf.set("spark.driver.maxResultSize", "50m");
conf.set("spark.executor.memory", "200m");
conf.set("spark.eventLog.enabled", "true");
conf.set("spark.eventLog.dir", "/tmp/");
conf.set("spark.executor.extraClassPath", "/home/enlighted/ebd.jar");
conf.set("spark.cores.max", "1");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> cassandraRowsRDD = CassandraJavaUtil.javaFunctions(sc).cassandraTable("testing", "ec")
.map(new Function<CassandraRow, String>() {
private static final long serialVersionUID = -6263533266898869895L;
@Override
public String call(CassandraRow cassandraRow) throws Exception {
return cassandraRow.toString();
}
});
System.out.println("Data as CassandraRows: \n" + StringUtils.join(cassandraRowsRDD.toArray(), "\n"));
sc.close();
现在我在第一个节点上启动 master spark,然后在第二个节点上启动 worker,然后我 运行 上面的代码。它在工作线程上创建了一个执行程序线程,但我在应用程序端日志中看到以下消息:
[Timer-0] WARN org.apache.spark.scheduler.TaskSchedulerImpl - Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
现在保持相同的设置,当我在主服务器上 运行 spark/sbin/start-all.sh 时,它会在第一个节点上创建主实例和工作实例。再次当我 运行 相同的代码和分配的工人是这个新工人时,它工作得很好。
我原来的 worker 运行在与主节点不同的节点上可能有什么问题?
找出根本原因。 Master 随机分配端口给 worker 进行通信。由于 master 上的防火墙,worker 无法向 master 发送消息(可能是资源详细信息)。奇怪的工人甚至懒得抛出任何错误。
我有一个 spark/cassandra 设置,我在其中使用 spark cassandra java 连接器来查询 table。到目前为止,我有 1 个 spark 主节点(2 个核心)和 1 个工作节点(4 个核心)。它们在 conf/ 下都有以下 spark-env.sh:
#!/usr/bin/env bash
export SPARK_LOCAL_IP=127.0.0.1
export SPARK_MASTER_IP="192.168.4.134"
export SPARK_WORKER_MEMORY=1G
export SPARK_EXECUTOR_MEMORY=2G
这是我的 spark 执行代码:
SparkConf conf = new SparkConf();
conf.setAppName("Testing");
conf.setMaster("spark://192.168.4.134:7077");
conf.set("spark.cassandra.connection.host", "192.168.4.129");
conf.set("spark.logConf", "true");
conf.set("spark.driver.maxResultSize", "50m");
conf.set("spark.executor.memory", "200m");
conf.set("spark.eventLog.enabled", "true");
conf.set("spark.eventLog.dir", "/tmp/");
conf.set("spark.executor.extraClassPath", "/home/enlighted/ebd.jar");
conf.set("spark.cores.max", "1");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> cassandraRowsRDD = CassandraJavaUtil.javaFunctions(sc).cassandraTable("testing", "ec")
.map(new Function<CassandraRow, String>() {
private static final long serialVersionUID = -6263533266898869895L;
@Override
public String call(CassandraRow cassandraRow) throws Exception {
return cassandraRow.toString();
}
});
System.out.println("Data as CassandraRows: \n" + StringUtils.join(cassandraRowsRDD.toArray(), "\n"));
sc.close();
现在我在第一个节点上启动 master spark,然后在第二个节点上启动 worker,然后我 运行 上面的代码。它在工作线程上创建了一个执行程序线程,但我在应用程序端日志中看到以下消息:
[Timer-0] WARN org.apache.spark.scheduler.TaskSchedulerImpl - Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
现在保持相同的设置,当我在主服务器上 运行 spark/sbin/start-all.sh 时,它会在第一个节点上创建主实例和工作实例。再次当我 运行 相同的代码和分配的工人是这个新工人时,它工作得很好。
我原来的 worker 运行在与主节点不同的节点上可能有什么问题?
找出根本原因。 Master 随机分配端口给 worker 进行通信。由于 master 上的防火墙,worker 无法向 master 发送消息(可能是资源详细信息)。奇怪的工人甚至懒得抛出任何错误。