【发布时间】:2016-03-16 06:17:57
【问题描述】:
我有一个用于 HADOOP 2.6 的 spark-1.5.1,在我的本地计算机上以独立模式运行。我正在尝试从示例 java 应用程序运行配置单元查询,将 spark.master 指向在我的本地计算机上运行的 (spark://impetus-i0248u:7077) spark master。这是一段java代码:
SparkConf sparkconf = new SparkConf().set("spark.master", "spark://impetus-i0248u:7077").set("spark.app.name", "sparkhivesqltest")
.set("spark.cores.max", "2").set("spark.executor.memory", "2g").set("worker_max_heapsize","2g").set("spark.driver.memory", "2g");
SparkContext sc = new SparkContext(sparkconf);
HiveContext sqlContext = new HiveContext(sc);
DataFrame jdbcDF = sqlContext.sql("select * from bm.rutest");
List<Row> employeeFullNameRows = jdbcDF.collectAsList();
HiveContext 正在正确初始化,因为它能够与 hive 元存储建立连接。我在jdbcDF.collectAsList(); 遇到了例外情况@
这是 spark 尝试提交作业时出现的错误:
提交 15/12/10 20:00:42 INFO DAGScheduler: 提交 2 个缺失 ResultStage 0 (MapPartitionsRDD[3] at collectAsList at HiveJdbcTest.java:30) 2010 年 15 月 12 日 20:00:42 信息 TaskSchedulerImpl:添加 任务集 0.0 和 2 个任务 2010 年 15 月 12 日 20:00:42 信息 TaskSetManager: 在阶段 0.0 中启动任务 0.0(TID 0、172.26.52.54、ANY、2181 字节) 15/12/10 20:00:42 INFO TaskSetManager:在阶段 0.0 中启动任务 1.0 (TID 1, 172.26.52.54, ANY, 2181 字节)
异常:java.lang.OutOfMemoryError 从 线程中的 UncaughtExceptionHandler “sparkDriver-akka.remote.default-remote-dispatcher-5”中的异常 线程“shuffle-server-1”异常:java.lang.OutOfMemoryError 从线程“shuffle-server-1”中的 UncaughtExceptionHandler 抛出 线程“threadDeathWatcher-2-1”中的异常异常: java.lang.OutOfMemoryError 从 UncaughtExceptionHandler 中抛出 线程“threadDeathWatcher-2-1”
异常:java.lang.OutOfMemoryError 从 线程中的 UncaughtExceptionHandler “sparkDriver-akka.remote.default-remote-dispatcher-6”中的异常 线程“qtp1003369013-56”异常:java.lang.OutOfMemoryError 从线程“qtp1003369013-56”中的 UncaughtExceptionHandler 抛出
异常:java.lang.OutOfMemoryError 从 线程中的 UncaughtExceptionHandler “sparkDriver-akka.remote.default-remote-dispatcher-21”
异常:java.lang.OutOfMemoryError 从 线程中的 UncaughtExceptionHandler “sparkDriver-akka.actor.default-dispatcher-17”
异常:java.lang.OutOfMemoryError 从 线程中的 UncaughtExceptionHandler “sparkDriver-akka.remote.default-remote-dispatcher-23”中的异常 线程“shuffle-server-2”异常:java.lang.OutOfMemoryError 从线程“shuffle-server-2”中的 UncaughtExceptionHandler 抛出
异常:java.lang.OutOfMemoryError 从 线程中的 UncaughtExceptionHandler “sparkDriver-akka.actor.default-dispatcher-2”
下面是spark-env.sh中添加的配置
SPARK_EXECUTOR_CORES=2
SPARK_EXECUTOR_MEMORY=3G
SPARK_WORKER_CORES=2
SPARK_WORKER_MEMORY=2G
SPARK_EXECUTOR_INSTANCES=2
SPARK_WORKER_INSTANCES=1
如果我将 spark.master 设置为本地 [*],它可以正常工作,但是当我将它指向在我的机器上运行的 master 时,我得到了上面提到的异常。 如果我尝试使用相同的配置连接到 mysql db,它可以正常工作。
PS:表格只有一行。
请帮忙..!
【问题讨论】:
-
collect()方法收集所有工作人员的所有数据并将其存储在驱动程序上,使用驱动程序内存。如果您在大型数据集上运行,那么您将获得 OOM 是合乎逻辑的。考虑天气collect()是您真正寻找的行动。 -
我想要给定查询的所有记录集,在这种情况下,我的表只有一行。
-
为什么要将它返回给您的驱动程序?什么原因?
-
能够使用这段代码而不是使用collectAsList()来解决这个OOM错误。迭代器 iter = jdbcDF.javaRDD().toLocalIterator(); while (iter.hasNext()){ Row row = iter.next(); } 谢谢 :)
-
但我还是没明白,为什么 collectAsList() 会为单个记录抛出 OOM 错误。即使我配置了 2GB 的驱动程序内存,仍然面临同样的错误。你能详细说明一下吗?我是 Spark 的新手..
标签: java hadoop apache-spark hive apache-spark-sql