使用原因:sparksql应用集群内存,查询更快
使用方法:编写代码逻辑,使用spark-submit提交到yarn上执行
简单代码示例:
核心思想就是编写查询sql,然后对获取到的df数据集再进行逻辑处理,转存
object Main extends Logging{
def main(args: Array[String]): Unit = {
//第一个参数:处理的hive日期分区
//第二个参数:选择处理的字段
//第三个参数(可空):处理经纬度时,去除噪声点的距离(m)
val tablename:String=StoreConfig.hivetablename
val database:String = StoreConfig.hivedatabase
//构造spark连接,选择hive数据库
val spark = SparkSession.builder().enableHiveSupport()
.appName("SparkTest").getOrCreate()
spark.sql(" use "+database+" ").collect()
base_imei(spark,args(0))
}
}
//进行sql编写和对获取的df数据集进行相关操作
def base_imei(spark: SparkSession,date:String): Unit ={
val res = spark.sql("select * from "+tablename")
.rdd.mapPartitions { rows =>
var sum = 0
val handler=new HbaseHandler()
try {
rows.foreach { r =>
sum = sum + 1
handler.insertIMEI(basetablename,r.getString(0),r.getLong(1),date)
}
} catch {
case e: Throwable =>
logError("", e)
} finally {
handler.close()
handler.client.close()
}
Array(sum).toIterator
}.collect()
logInfo(s"baseimei总数 ${res.sum}")
}
提交操作:
搭建环境:下载spark-2.3.0按装包,将hive/hbase配置文件拷入目录下conf目录,hive/hbase依赖包拷入目录下jars文件夹,idea 打包的 jar 上传到jars文件夹
1.进入sparkshell 可以进行sparksql查询hive
./spark-shell --executor-memory 40G
例句:spark.sql("select * from test1").show(1000)
2.运行提交的项目jar包:(指定内存、线程数参数,jar包需要的参数,如下面的参数cs1等)
./spark-submit --driver-memory 40G --master local[40] --class Main test.jar cs1 cs2 cs3
线上多节点spark 使用yarn模式,替换loacl模式
示例:
./spark-submit --master yarn --num-executors 100 --executor-memory 20G --executor-cores 5 --driver-memory 5G --conf spark.default.parallelism=1500 --class Main /home/jar/spark-with-exit.jar 2017-10-01 3
提交参数:
--num-executors 设置Spark作业总共要用多少个Executor进程来执行
--executor-memory 设置每个Executor进程的内存
--executor-cores 设置每个Executor进程的CPU core数量
num-executors乘以executor-memory,就代表了你的Spark作业申请到的总内存量
--conf spark.sql.shuffle.partitions=1024 : 这个是调整shuffle任务数量的配置
--driver-memory 设置Driver进程的内存。
参数调优建议:Driver的内存通常来说不设置,或者设置1G左右应该就够了。唯一需要注意的一点是,如果需要使用collect算子将RDD的数据全部拉取到Driver上进行处理,那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题