spark中有partition的概念,每个partition都会对应一个task,task越多,在处理大规模数据的时候,就会越有效率。不过task并不是越多越好,如果平时测试,或者数据量没有那么大,则没有必要task数量太多。
我的第一个query程序,有200个task,我改成了50个,节约了1s左右。
参数可以通过spark_home/conf/spark-default.conf配置文件设置:
spark.sql.shuffle.partitions 50
spark.default.parallelism 10
上边两个参数,第一个是针对spark sql的task数量,我的程序逻辑是将rdd首先转换成dataframe,然后进行query,所以对应第一个参数。而如果程序是非sql则第二个参数生效。
附上query的scala代码:
package Users
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.SparkContext._
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{StructType,StructField,StringType}
object AreaPhone {
def main(args: Array[String]) {
if (args.length == 0) {
System.err.println("Usage: AreaPhone <file1>")
System.exit(1)
}
val conf = new SparkConf().setAppName("AreaPhone")
val sc = new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val users = sc.textFile(args(0))
val schemaString = "index userid phone area age gender userau date"
val schema =
StructType(
schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))
val rowRDD = users.map(_.split(",")).map(p=>Row(p(0), p(1), p(2), p(3), p(4), p(5), p(6), p(7)))
val usersDataFrame = sqlContext.createDataFrame(rowRDD, schema)
usersDataFrame.registerTempTable("users")
usersDataFrame.groupBy("area").count().show()
val result = usersDataFrame.groupBy(usersDataFrame("phone").substr(0,3)).count().toDF("phone","count")
result.sort(result("phone").asc).show()
sc.stop()
}
}