我有一个9节点m3.xlarge(8 cpu / 15 gig)EMR集群,其中1个节点是主节点,其他8个节点是从节点。我正在尝试运行一个简单的程序来检查GraphX连接的组件。这是我的代码:
def main(args : Array[String]): Unit = {
val sparkConfig = new SparkConf()
.set("hive.exec.dynamic.partition", "true")
.set("hive.exec.dynamic.partition.mode", "nonstrict")
.set("hive.s3.max-client-retries", "50")
.set("hive.s3.max-error-retries", "50")
.set("hive.s3.max-connections", "100")
.set("hive.s3.connect-timeout", "5m")
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.set("spark.kryo.registrationRequired", "true")
.set("spark.kryo.classesToRegister", "org.apache.spark.graphx.impl.VertexAttributeBlock")
.set("spark.broadcast.compress", "true")
.set("spark.default.parallelism", "24")
val spark = SparkSession.builder()
.appName("Spark Hive Example")
.enableHiveSupport()
.config(sparkConfig)
.getOrCreate()
// Set Kryo for serializing
GraphXUtils.registerKryoClasses(sparkConfig)
val res = spark.sql("SELECT col1, col2, col3 FROM table1 limit 10000")
val edgesRDD = res.rdd.map(row => Edge(row.getString(0).hashCode, row.getString(1).hashCode, row(2).asInstanceOf[String]))
val res_two = spark.sql("SELECT col1 FROM table2 where col1 is not NULL and col1 != '' limit 100000")
val vertexRDD: RDD[(VertexId, String)] = res_two.rdd.map(row => (row.getString(0).hashCode, row(0).asInstanceOf[String]))
val graph = Graph(vertexRDD, edgesRDD)
graph.cache()
val connectedComponents = graph.connectedComponents().vertices
我使用以下方式在EMR集群上提交jar:
spark-submit --conf spark.hadoop.fs.s3a.access.key=xxx --conf spark.hadoop.fs.s3a.secret.key=xxx --conf spark.yarn.submit.waitAppCompletion=false --class com.mypkg.SampleGraphX --master yarn --deploy-mode cluster --num-executors 12 --executor-cores 6 --executor-memory 10g --conf "spark.driver.extraJavaOptions=-Djavax.net.ssl.sessionCacheSize=1000 -Djavax.net.ssl.sessionCacheTimeout=60" --conf "spark.executor.extraJavaOptions=Djavax.net.ssl.sessionCacheSize=1000 -Djavax.net.ssl.sessionCacheTimeout=60" GraphxTest1.jar
table1和table2都有数百万个条目,但我限制了我的代码,只能从中读取10000和100000个条目。两者都是位于S3的外部表。这项工作已经运行了近2天。为什么需要这么长时间?我的代码有问题吗?或者我需要更改一些配置吗?
另外,当我查看UI时,我看到即使我的群集有64个vCore(每个节点8个核心),每个节点只使用1个核心。 在下图中,仅使用了总共64个核中的3个核。我已经看到这个最多有6个核心(当6个节点处于活动状态时)。为什么不使用所有内核?
答案 0 :(得分:0)
您不是在查看Spark UI,这是调度程序UI。您应该在列表中找到您的应用程序,并访问链接到您的应用程序的URL。 当您访问Spark UI时,可以更容易地判断发生了什么(存储中的内存不足,没有足够的分区,陷入读取数据,陷入迭代......)