我有一个HADOOP 2.6的spark-1.5.1在本地机器上以独立模式运行。我正试图从一个示例java应用程序中运行一个hive查询,将spark.master指向(spark://impetus-i0248u:7077)火花大师在我的本地机器上运行。这是一段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正在正确初始化,因为它能够与配置单元元存储建立连接。我在jdbcDF.collectAsList();
遇到异常
以下是spark尝试提交作业时出现的错误:
提交时间:10年12月15日20:00:42信息DAGScheduler:缺少提交2来自ResultStage 0的任务(位于的collectAsList处的MapPartitionsRDD[3]HiveJdbcTest.java:30)10年12月15日20:00:42信息任务调度Impl:添加任务集0.0,包含2个任务2010年12月15日20:00:42信息任务集管理器:在阶段0.0中启动任务0.0(TID 0,172.26.52.54,ANY,2181字节)10年12月15日20:00:42信息TaskSetManager:在0.0阶段启动任务1.0(TID 1,172.26.52.54,任意,2181字节)
异常:从引发java.lang.OutOfMemoryError线程中未捕获异常处理程序"sparkDriver akka.remote.default-remote-dispatcher-5"中出现异常线程"shuffle-server-1"异常:java.lang.OutOfMemoryError从线程"shuffle-server-1"中的UnaughtException处理程序引发线程"threadDeathWatcher-2-1"出现异常异常:中的UnaughtException处理程序引发java.lang.OutOfMemoryErrorthread"threadDeathWatcher-2-1"
异常:从引发java.lang.OutOfMemoryError线程中未捕获异常处理程序"sparkDriver akka.remote.default-remote-dispatcher-6"中出现异常线程"qtp1003369013-56"异常:java.lang.OutOfMemoryError从线程"qtp1003369013-56"中的UnaughtException处理程序抛出
异常:从引发java.lang.OutOfMemoryError线程中未捕获异常处理程序"sparkDriver akka.remote.default-remote-dispatcher-21"
异常:从引发java.lang.OutOfMemoryError线程中未捕获异常处理程序"sparkDriver akka.aactor.default-dispatcher-17"
异常:从引发java.lang.OutOfMemoryError线程中未捕获异常处理程序"sparkDriver akka.remote.default-remote-dispatcher-23"中出现异常线程"shuffle-server-2"异常:java.lang.OutOfMemoryError从线程"shuffle-server-2"中的UnaughtException处理程序抛出
异常:从引发java.lang.OutOfMemoryError线程中未捕获异常处理程序"sparkDriver akka.aactor.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设置为local[*],它可以正常工作,但当我将其指向在我的机器上运行的master时,我会得到上面提到的异常。如果我尝试连接到mysqldb,使用相同的配置,它可以正常工作。
附言:这张表只有一行。
请帮忙。。!
以下是对问题中概念的解释:-
- local[*]=执行是多线程的,并且不是分布式的。当作业在单机上测试时,有利于开发。它适用于您的情况,因为数据不会被打乱或从执行器移动到驱动程序。。。所有这些都在一个单独的JVM和本地JVM中
- collectAsList-此方法将从驱动程序节点上的执行程序收集所有数据,这会导致Shuffling,并且Shuffling是一个内存密集型过程,因为它需要序列化、网络和磁盘IO
- javaRDD().toLocalIterator()=生成与collect()相同的结果,但按顺序处理每个分区,不涉及混洗。请注意,我们在RDD中只使用分区的顺序,并且分区中项目的顺序已经定义好了
因此,考虑到以上情况,当您使用local box时,local(*)或collectAsList()可能不会给出任何OOM,但collect()可能会产生内存异常。