spark编程cheat-sheet

1、pyspark

spark routain:

 
 
from pyspark import SparkContext
from pyspark import HiveContext
if __name__ == '__main__':     
	global_dic = get_dic(target_date)     
	sc = SparkContext(appName='get_sub_strategy_delete_distribute/')     
	sqlCtx = HiveContext(sc)     global_dic_br = sc.broadcast(global_dic)
	取字典用时:
	line = global_dic_br.value.get(global_id+'-'+str(item_id))
 

 

make  a table:

首先转化成DataFrame:

方式1:直接在Row中加meta信息

 

from pyspark.sql import SQLContext, Row
map(
    lambda data: Row(cityid=data[0], datekey=data[1], itemid=data[2], userid=data[3], uuid=data[4], item_type=data[5], utm_campaign=data[6], viewtime=data[7], utm_medium=data[8], utm_term=data[9], dt=data[1])
            )

 

然后:dataFrame = sqlCtx.createDataFrame(hisDataRdd)

            或者 dataFrame = hisDataRdd.toDF(待验证)

方式2:定义类

方式3:定义schema

 

由DataFrame插入table:

 

脚本配置spark-submit:

 

 /opt/meituan/spark-latest/bin/spark-submit \
               --master yarn-cluster --queue etl \
               --executor-memory 11G --num-executors 260 --executor-cores 1 \
               --driver-memory 10G --files /opt/meituan/spark-latest/conf/hive-site.xml \
               --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \
               --conf spark.akka.frameSize=100 --conf spark.shuffle.manager=SORT \
               --conf spark.driver.maxResultSize=2048m \
               --conf spark.yarn.executor.memoryOverhead=4096 \
               --conf spark.yarn.driver.memoryOverhead=6000 newData.py $today

 

2、sparkUI讲解

https://spark.apache.org/docs/3.0.0-preview/web-ui.html#executors-tab

 

3、spark 分区数

3.1 对于HDFS读入/HIVE查询的分区数

HDFS 的分区数由文件数和hdsf最大块限制决定

HIVE查询的分区数也由查询表的分区数和hdsf最大块限制决定

例如:

读入一份 2048M 大小的数据,hdfs 块大小设置为 128M

  1. 该目录有1000个小文件

答案:则会生成1000个partition。

  1. 如果只有1个文件,

答案:则会生成 16 个partition

  1. 如果有一个大文件1024M,其余999 个文件共 1024M

答案:则会生成 1007个分区。

调整hdfs读入分区数:

spark.hadoop.mapreduce.input.fileinputformat.split.minsize; spark.hadoop.mapreduce.input.fileinputformat.split.maxsize;

的大小来调整HadoopRDD的分区数量。

调整sql分区参数:

如果想要使得maxSplitBytes值变大,也就是分区数变小。

可通过将defaultMaxSplitBytes值调大,

也就是spark.sql.files.maxPartitionBytes,

将spark.sql.files.openCostInBytes也调大;

如果如果想要使得maxSplitBytes值变小,也就是分区数变大。

可以将defaultMaxSplitBytes值调小,

也就是spark.sql.files.maxPartitionBytes,

将spark.sql.files.openCostInBytes也调小。

 

3.2 transformation 分区数

一个RDD通过transformation转换成另外一个RDD,那么新生成的分区数量是多少呢?

  1. filter(), map(), flatMap(), distinct()

partition数量等于parent RDD的数量。

  1. rdd.union(other_rdd)

partition数量等于rdd_size + other_rdd_size

  1. rdd.intersection(other_rdd)

partition数量等于max(rdd_size, other_rdd_size)

  1. rdd.subtract(other_rdd)

partition数量等于rdd_size

  1. rdd.cartesian(other_rdd)

partition数量等于rdd_size * other_rdd_size

 

3.3 各种join、groupByKey、reduceByKey等

(1)自己指定分区数

例子:reduceByKey((x,y) => x+y, 指定分区数)

(2)根据默认分区参数,一般默认分区参数最好设成运行core的2-3倍

—-spark.default.parallelism 200 : Spark作业的默认为500~1000个比较合适,如果不设置,spark会根据底层HDFS的block数量设置task的数量,这样会导致并行度偏少,资源利用不充分。该参数设为num-executors * executor-cores的2~3倍比较合适。

参考资料:

 3.1 3.2 参考自https://juejin.im/post/6844904021502001166

3.3 参考自https://zhuanlan.zhihu.com/p/108454557
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值