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
- 该目录有1000个小文件
答案:则会生成1000个partition。
- 如果只有1个文件,
答案:则会生成 16 个partition
- 如果有一个大文件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,那么新生成的分区数量是多少呢?
- filter(), map(), flatMap(), distinct()
partition数量等于parent RDD的数量。
- rdd.union(other_rdd)
partition数量等于rdd_size + other_rdd_size
- rdd.intersection(other_rdd)
partition数量等于max(rdd_size, other_rdd_size)
- rdd.subtract(other_rdd)
partition数量等于rdd_size
- 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