spark 基础开发 Tips总结
本篇博客主要是 sparksql 从初始开发注意的一些基本点以及力所能及的可优化部分的介绍:
所使用spark版本:2.0.0 scala版本:2.11.8
1. SparkSession的初始化:
val sparkSession = SparkSession.builder().master("local[*]").appName("AppName").config("spark.sql.warehouse.dir", "file:///D:/XXXX/XXXX/spark-warehouse").config("spark.sql.shuffle.partitions", 50).getOrCreate()
注意点:
a. spark.sql.warehouse.dir 需要显示设置,否则会抛出 Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: file:... 错误
b. spark.sql.shuffle.partitions 指定 Shuffle 时 Partition 个数,也即 Reducer 个数。根据业务数据量测试调整最佳结果
Partition 个数不宜设置过大:
Reducer(代指 Spark Shuffle 过程中执行 Shuffle Read 的 Task) 个数过多,每个 Reducer 处理的数据量过小。大量小 Task 造成不必要的 Task 调度开销与可能的资源调度开销(如果开启了 Dynamic Allocation)
Reducer 个数过大,如果 Reducer 直接写 HDFS 会生成大量小文件,从而造成大量 addBlock RPC,Name node 可能成为瓶颈,并影响其它使用 HDFS 的应用
过多 Reducer 写小文件,会造成后面读取这些小文件时产生大量 getBlock RPC,对 Name node 产生冲击
Partition 个数不宜设置过小:
每个 Reducer 处理的数据量太大,Spill 到磁盘开销增大
Reducer GC 时间增长
Reducer 如果写 HDFS,每个 Reducer 写入数据量较大,无法充分发挥并行处理优势
2. 将非结构化数据转换为结构化数据DataFrame(本人用的自定义模式):
val rdd= sparkSession.sparkContext.textFile(path, 250) // 默认split为2 val schemaString = "time hour lic" //结构化数据的列名,可理解为关系型数据库的列名 val fields = schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, nullable = true)) // 字段名 字段类型 是否可为空 val schema = StructType(fields) //上两步组装最终 createDataFrame 时需要的 schema val rowRDD = citySECRDD.map(_.split(",")).filter(attributes => attributes.length >= 6 && attributes(1).equals("2")&& attributes(0).split(" ").length > 1 && attributes(0).split(" ")(1).split(":").length > 1).map(attributes => {Row(attributes(0).trim,attributes(0).split(" " (1).split(":")(0).trim,attributes(2).trim,attributes(3).trim,attributes(4).trim,attributes(5).trim)}) //自定义一些过滤条件 以及组装最终的 row类型的RDD val df= sparkSession.createDataFrame(rowRDD, schema) //将rdd装换成DataFrame
3. 两种缓存使用方式:
1)df.persist(StorageLevel.MEMORY_ONLY) //后续如果需要反复使用DF[DataFrame的简称],则就把此DF缓存起来
df.unpersist() //释放缓存 常用的两种序列化方式:MEMORY_ONLY->不加工在内存中存储 MEMORY_ONLY_SER->在内存中序列化存储(占用内存空间较小) 2)df.createOrReplaceTempView("table") sparkSession.sql("cache table table") // 以 sql 形式缓存DF
sparkSession.sql("uncache table table") //释放缓存
4.spark整合Hbase快速批量插入
将计算结果写入Hbase:
注意:1) 如果是带有shuffle过程的,shuffle计算之前使用select()提出只需要的字段然后再进行计算,因为shuffle特别耗费时间,写磁盘的过程,所以要能少写就少写。
df.foreachPartition(partition => { val hconf = HBaseConfiguration.create(); hconf.set(zkClientPort, zkClientPortValue) //zk 端口 hconf.set(zkQuorum, zkQuorumValue) //zk 地址
hconf.set(hbaseMaster, hbaseMasterValue) //hbase master
val myTable = new HTable(hconf, TableName.valueOf(tableName))
myTable.setAutoFlush(false, false) //关键点1
myTable.setWriteBufferSize(5 * 1024 * 1024) //关键点2
partition.foreach(x => { val column1 = x.getAs[String]("column1") //列1
val column2 = x.getAs[String]("column2") //列2
val column3 = x.getAs[Double]("column3") //列3
val date = dateStr.replace("-", "") // 格式化后的日期 val rowkey = MD5Hash.getMD5AsHex(Bytes.toBytes(column1+ date)) + Bytes.toBytes(hour)
val put = new Put(Bytes.toBytes(rowkey))
put.add("c1".getBytes(), "column1".getBytes(), licPlateNum.getBytes()) //第一列族 第一列
put.add("c1".getBytes(), "column2".getBytes(), hour.getBytes()) //第一列族 第二列
put.add("c1".getBytes(), "column3".getBytes(), interval.toString.getBytes()) //第一列族 第三列
put.add("c1".getBytes(), "date".getBytes(), date.getBytes()) //第一列族 第四列
myTable.put(put)
})
myTable.flushCommits() //关键点3
/*
*关键点1_:将自动提交关闭,如果不关闭,每写一条数据都会进行提交,是导入数据较慢的做主要因素。
关键点2:设置缓存大小,当缓存大于设置值时,hbase会自动提交。此处可自己尝试大小,一般对大数据量,设置为5M即可,本文设置为3M。
关键点3:每一个分片结束后都进行flushCommits(),如果不执行,当hbase最后缓存小于上面设定值时,不会进行提交,导致数据丢失。
注:此外如果想提高Spark写数据如Hbase速度,可以增加Spark可用核数量。
*/
5. spark任务提交shell脚本:
spark-submit --jars /XXX/XXX/hbase/latest/lib/hbase-protocol-0.96.1.1-cdh5.0.2.jar \
--master yarn\
--num-executors 200 \
--conf "spark.driver.extraClassPath=/share/apps/hbase/latest/lib/hbase-protocol-0.96.1.1-cdh5.0.2.jar" \
--conf "spark.executor.extraClassPath=/share/apps/hbase/latest/lib/hbase-protocol-0.96.1.1-cdh5.0.2.jar" \
--conf spark.driver.cores=2 \
--conf spark.driver.memory=10g \
--conf spark.driver.maxResultSize=2g \
--conf spark.executor.cores=6 \
--conf spark.executor.memory=10g \
--conf spark.shuffle.blockTransferService=nio \
--conf spark.memory.fraction=0.8 \
--conf spark.shuffle.memoryFraction=0.4 \
--conf spark.default.parallelism=1000 \
--conf spark.sql.shuffle.partitions=400 \ 默认200,如果项目中代码设置了此选项,则代码设置级别优先,会覆盖此处设置
--conf spark.shuffle.consolidateFiles=true \
--conf spark.shuffle.io.maxRetries=10 \
--conf spark.scheduler.listenerbus.eventqueue.size=1000000 \
--class XXXXX\ 项目启动主类引用
--name zzzz \
/data/XXX/XXX-jar-with-dependencies.jar \ 项目jar包
"参数1" "参数2"
注: 红色部分是Hbase需要的配置,同时需要在spark集群的spark-defaults.conf 里面配置
spark.driver.extraClassPath 和 spark.executor.extraClassPath 直指 hbase-protocol-0.96.1.1-cdh5.0.2.jar 路径
先写到这里吧,后续会继续完善通过sparkUi 优化细节以及提交spark任务的时候 如何分配 executor.cores 和 executor.memory。
spark 基础开发 Tips总结的更多相关文章
- Ubuntu14.04或16.04下Hadoop及Spark的开发配置
对于Hadoop和Spark的开发,最常用的还是Eclipse以及Intellij IDEA. 其中,Eclipse是免费开源的,基于Eclipse集成更多框架配置的还有MyEclipse.Intel ...
- Spark:利用Eclipse构建Spark集成开发环境
前一篇文章“Apache Spark学习:将Spark部署到Hadoop 2.2.0上”介绍了如何使用Maven编译生成可直接运行在Hadoop 2.2.0上的Spark jar包,而本文则在此基础上 ...
- 最全的spark基础知识解答
原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...
- Spark(六)Spark之开发调优以及资源调优
Spark调优主要分为开发调优.资源调优.数据倾斜调优.shuffle调优几个部分.开发调优和资源调优是所有Spark作业都需要注意和遵循的一些基本原则,是高性能Spark作业的基础:数据倾斜调优,主 ...
- 转】[1.0.2] 详解基于maven管理-scala开发的spark项目开发环境的搭建与测试
场景 好的,假设项目数据调研与需求分析已接近尾声,马上进入Coding阶段了,辣么在Coding之前需要干马呢?是的,“统一开发工具.开发环境的搭建与本地测试.测试环境的搭建与测试” - 本文详细记录 ...
- FusionInsight大数据开发---Spark应用开发
Spark应用开发 要求: 了解Spark基本原理 搭建Spark开发环境 开发Spark应用程序 调试运行Spark应用程序 YARN资源调度,可以和Hadoop集群无缝对接 Spark适用场景大多 ...
- Spark基础学习精髓——第一篇
Spark基础学习精髓 1 Spark与大数据 1.1 大数据基础 1.1.1 大数据特点 存储空间大 数据量大 计算量大 1.1.2 大数据开发通用步骤及其对应的技术 大数据采集->大数据预处 ...
- Windows下搭建Spark+Hadoop开发环境
Windows下搭建Spark+Hadoop开发环境需要一些工具支持. 只需要确保您的电脑已装好Java环境,那么就可以开始了. 一. 准备工作 1. 下载Hadoop2.7.1版本(写Spark和H ...
- Centos 基础开发环境搭建之Maven私服nexus
hmaster 安装nexus及启动方式 /usr/local/nexus-2.6.3-01/bin ./nexus status Centos 基础开发环境搭建之Maven私服nexus . 软件 ...
随机推荐
- csv注入漏洞原理&&实战
前言 为了找工作,巩固巩固知识.本文会介绍 csv 注入漏洞的原理,最后给出一个示例. 正文 在 csv 文件 和 xlsx 文件中的每一项的值如果是 =, @, +, - 就会被 excel 识 ...
- linux 权限管理命令chown、chgrp、umask、linux新建文件或目录的默认权限755
chown /bin/chownchown [用户] [文件或目录] 改变文件或目录的所有者只有root可以改变文件或目录的所有者 root用户:mkdir /tmptouch /tmp/test.f ...
- Others
1.可迭代对象可以被for循环获取 2.可变与不可变对象 不可变对象:数字 字符串 元组 所谓不可变是值和身份都不变 赋值时开辟新内存空间生成新值 可变 对象:列表 字典 集合 ...
- 使用docker安装使用gitlab
1.下载镜像 gitlab/gitlab-ce:latest 当前gitlab最新版本为10.0.4 2.在服务器上创建目录 mkdir -p /home/work/ins/co ...
- JVM知识(四):GC配置参数
JVM配置参数分为三类参数:跟踪参数.堆分配参数.栈分配参数 这三类参数分别用于跟踪监控JVM状态,分配堆内存以及分配栈内存. 跟踪参数 跟踪参数用户跟踪监控JVM,往往被开发人员用于JVM调优以及故 ...
- LeetCode题解之To Lower Case
1.题目描述 2.分析 遍历字符串,使用C++ 的 标准库函数 isalpha() 判断字符是否为 字母,然后对其做 tolower() . 3.代码 string toLowerCase(strin ...
- “拒绝了对对象数据库的 EXECUTE 权限”之解决
“拒绝了对对象'aspnet_CheckSchemaVersion'的 EXECUTE 权限”之解决 [错误状态] “/XXX”应用程序中的服务器错误. ----------------------- ...
- orcl数据库查询重复数据及删除重复数据方法
工作中,发现数据库表中有许多重复的数据,而这个时候老板需要统计表中有多少条数据时(不包含重复数据),只想说一句MMP,库中好几十万数据,肿么办,无奈只能自己在网上找语句,最终成功解救,下面是我一个实验 ...
- ms17-010漏洞利用教程
ms17-010 漏洞利用并拿下服务器教程 攻击环境: 攻击机win2003 ip:192.168.150.129 Window2003 Python环境及工具 攻击机kali: ip:192.168 ...
- 微信公众平台OAuth2.0授权
1. 配置授权回调页面域名 进入微信公众平台后台后,依次进入开发者中心-权限表,找到网页授权获取用户基本信息,点击右侧的修改. 授权回调域名配置规范为全域名并且不带http,比如需要网页授权的域名为: ...