1.使用SparkConf配置Spark

(1)在java中使用SparkConf创建一个应用:
SparkConf conf =new SparkConf();
//设置应用名称
conf.set("spark.app.name",",my spark app");
//设置master
conf.set("spark.master","local");
//设置ui端口号
conf.set("spark.ui.port","36000");
//使用这个配置对象创建一个SparkContext
JavaSparkContext sc =new JavaSparkContext(conf);
当然也可以调用SaprkConf的set方法,使用如下:
SparkConf conf =new SparkConf();
conf.setAppName("my spark app");
conf.setMaster("local");
JavaSparkContext sc =new JavaSparkContext(conf);
(2)也可以在spark-submit中指定conf的相关设置,如下:
   
  1. bin/spark-submit
  2. --class com.example.myapp
  3. --master local
  4. --name myspp
  5. --conf spark.ui.port=36000
  6. myApp.jar
    spark-submit也支持从文件中读取配置项的值。这对于设置一些与环境相关的配置项比较有用,方便不同用户共享这些配置。默认情况下,spark-submit脚本会在Spark安装目录中找到conf/spark-defaults.conf文件,尝试读取该文件中以空格隔开的键值对数据。你也可以通过spark-submit的--properties-File标记,自定义该文件的路径。
    示例如下:
  1. bin/spark-submit
  2. --class com.example.myapp
  3. --properties-file my-config.conf
  4. myApp.jar
  5. ##Content of my-config.conf ##
  6. spark.master local[4]
  7. spark.app.name "my spark app"
  8. spark.ui.port 360000
    注意:有时候,有可能同一个配置项在多个地方被配置了。Spark的优先级顺序是:优先级最高的是在用户代码中显示调用set()方法设置的选项。其次是通过spark-submit传递的参数,再次是卸载配置文件中的值,最后是系统的默认值。
常用的Spark配置项的值
常用的Spark配置项的值 默认值 描述
spark.executor.memory
(--executor-memory)
512M 为每个执行器进程分配的内存,格式与JVM内存字符串格式一样。
spark.executor.cores
(--executor-cores)
spark.core.max
(--total-executor-cores)
1(无) 限制应用使用的核心个数的配置项。在YARN模式下,spark.executor.cores会为每个任务分配指定书目的核心。在独立模式和Mesos模式下,spark.core.max设置了所有执行器进程使用的核心总数的上限。
spark.speculation false 设为true时开启任务预测执行机制。当出现比较慢的任务是,这种机制会在另外的节点上也尝试执行该任务的一个副本。打开此选项会帮助减少大规模集群中个别慢的任务带来的影响。
spark.storage.blockMan
agerTimeoutIntervalMs
45000 内部用来通过超时机制追踪执行器进程是否存活的阀值。对于会引发长时间垃圾回收暂停的作业,需要把这个值调到100秒以上来放置失败。在Spark将来的版本中,这个配置项可能会被一个统一的超时设置所替代。
spark.executor.extraJava Options
spark.executor.extra
ClassPath
spark.executor.extra 
Library
这三个参数用来自动以如何启动执行器进程的JVM,分别用来添加额外的Java参数,classpath以及程序库路径。使用字符串来设置这些参数。推荐使用--jars标记来添加依赖。
spark.serizlizer org.apache.spark.serializer.JavaSerializer 指定用来进行序列化的类库,包含通过网络传输数据或缓存数据时的徐泪花。默认的Java序列化对于任何可以被徐泪花的Java独享都适用,但是速度很慢。我们推荐在追求速度时适用org.apache.spark.serializer.KryoSerializer并且对Kyro进行适当的调优。该项可以配置为任何org.apache.serializer的子类。
spark.eventLog.enabled false 设为true时,开启时间日志机制,这样已完成的Saprk作业就可以通过历史服务器查看。
spark.eventLog.dir file///tmp/spark-event 值开启事件日志机制时,事件日志文件的存储位置。这个值指向的路径需要设置一个全局可见的文件系统中,比如HDFS



2.spark执行流程
(1)用户代码定义RDD的有向无环图
    RDD上的操作会创建出新的RDD,并引用它们的父节点,这样就创建出了一个图
(2)行动操作把有向无环图强制转译为执行计划
    当你调用RDD的一个行动操作是,这个RDD就必须计算出来。这也要求计算出该RDD的父节点。Saprk调度器提交一个作业来计算所有必要的RDD。这个作业会包含一个或者多个步骤,每个步骤其实也就是一波并行执行的计算任务。一个步骤对应有向无环图中的一个或者多个RDD,一个步骤对应多个RDD是因为发生了流水线执行。
(3)任务于集群中调度并执行
    步骤是按照顺序处理的,任务则独立地启动来计算出RDD的一部分。一旦作业的最后一个步骤结束,一个行动操作也就执行完毕了。
3.使用Kryo序列化工具并注册所需要的类 重点!
    spark在开发过程中,当数据量很大的时候,为了减少内存的消耗,可以使用KryoSerializer进行序列化,其具体操作步骤如下:
    (1)指定spark序列化类
    (2)增加类MyRegistrator类,注册需要Kryo序列化的类
以下是示例程序:
MyRegistrator.java
import com.esotericsoftware.kryo.Kryo;
import org.apache.spark.serializer.KryoRegistrator;

/**
* Created by Administrator on 2015/11/30.
*/
public class MyRegistrator implements KryoRegistrator{
public void registerClasses(Kryo kryo) {
//注册需要使用KryoSerizlizer的类
kryo.register(javaBean.class);
}
}
javaBean.java
public class javaBean implements Serializable {
public int i;
//构造函数
public javaBean(int i){
this.i=i;
}
//getter
public int getI() {
return i;
}
//setter
public void setI(int i) {
this.i = i;
}
public String toString(){
return "this is the "+i+"th element!";

}
}
main.java
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

import java.util.ArrayList;
import java.util.List;

/**
* Created by Administrator on 2015/11/30.
*/
public class main {
public static void main(String args[]){
SparkConf conf =new SparkConf();
conf.setAppName("my spark app");
conf.setMaster("local");
//设置序列化类
conf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer");
//注册要使用KryoSerializer的类
conf.set("spark.kryo.registrator","MyRegistrator");
JavaSparkContext sc =new JavaSparkContext(conf);
List<javaBean> list =new ArrayList<javaBean>();
for(int i=0;i<10000;i++){
javaBean bean =new javaBean(i);
list.add(bean);
}
JavaRDD<javaBean> rdd =sc.parallelize(list);
for(javaBean bean:rdd.collect())
System.out.println(bean);

}
}









Spark调优与调试的更多相关文章

  1. Spark学习之Spark调优与调试(7)

    Spark学习之Spark调优与调试(7) 1. 对Spark进行调优与调试通常需要修改Spark应用运行时配置的选项. 当创建一个SparkContext时就会创建一个SparkConf实例. 2. ...

  2. Spark学习之Spark调优与调试(二)

    下面来看看更复杂的情况,比如,当调度器进行流水线执行(pipelining),或把多个 RDD 合并到一个步骤中时.当RDD 不需要混洗数据就可以从父节点计算出来时,调度器就会自动进行流水线执行.上一 ...

  3. Spark学习之Spark调优与调试(一)

    一.使用SparkConf配置Spark 对 Spark 进行性能调优,通常就是修改 Spark 应用的运行时配置选项.Spark 中最主要的配置机制是通过 SparkConf 类对 Spark 进行 ...

  4. Spark学习笔记6:Spark调优与调试

    1.使用Sparkconf配置Spark 对Spark进行性能调优,通常就是修改Spark应用的运行时配置选项. Spark中最主要的配置机制通过SparkConf类对Spark进行配置,当创建出一个 ...

  5. spark调优经验(待续)

    spark调优是须要依据业务须要调整的,并非说某个设置是一成不变的,就比方机器学习一样,是在不断的调试中找出当前业务下更优的调优配置.以下零碎的总结了一些我的调优笔记. spark 存储的时候存在严重 ...

  6. Spark调优 | Spark Streaming 调优

    Spark调优 | Spark Streaming 调优 1.数据序列化 2.广播大变量 3.数据处理和接收时的并行度 4.设置合理的批处理间隔 5.内存优化 5.1 内存管理 5.2优化策略 5.3 ...

  7. 【Spark学习】Apache Spark调优

    Spark版本:1.1.0 本文系以开源中国社区的译文为基础,结合官方文档翻译修订而来,转载请注明以下链接: http://www.cnblogs.com/zhangningbo/p/4117981. ...

  8. 【Spark调优】提交job资源参数调优

    [场景] Spark提交作业job的时候要指定该job可以使用的CPU.内存等资源参数,生产环境中,任务资源分配不足会导致该job执行中断.失败等问题,所以对Spark的job资源参数分配调优非常重要 ...

  9. 【Spark调优】大表join大表,少数key导致数据倾斜解决方案

    [使用场景] 两个RDD进行join的时候,如果数据量都比较大,那么此时可以sample看下两个RDD中的key分布情况.如果出现数据倾斜,是因为其中某一个RDD中的少数几个key的数据量过大,而另一 ...

随机推荐

  1. Android media媒体库分析之:MediaProvider

    在做Android媒体应用程序时(Audio.Image.Video)需要对Android的媒体提供者(MediaProvider)做详细的分析,下面记录一下我的收获: 一.获取MediaProvid ...

  2. Sql语句不等于空

    对于这种有null的我一般用这样的句子 isnull(Tag,'') <> '文章' 这样就可以搞定了不管是字符还是数字都可以用 <>

  3. 认识和选用常用的几种 GPRS 模块(转)

    源:http://blog.sina.com.cn/s/blog_4d80055a0100e8kr.html 我在这里把常见的GPRS模块分成3种: (1)GPRS DTU(GPRS数传单元,常称GP ...

  4. 页面加载完毕执行多个JS函数

    通常我们需要在打开页面时加载脚本,这些脚本必须在页面加载完毕后才可以执行,因为这时候DOM才完整,可以利用window.onload确保这一点,如:window.onload=firstFunctio ...

  5. jaxb异常 Class has two properties of the same name username

    import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; im ...

  6. Scroll View 深入

    转载自:http://mobile.51cto.com/hot-430409.htm 可能你很难相信,UIScrollView和一个标准的UIView差异并不大,scroll view确实会多一些方法 ...

  7. Qt5:不规则按钮的实现---通过贴图实现

    在应用开发中,有时候为了美观会在UI界面中增加不规则的按钮 现在我们就来看看Qt中是怎么实现不规则按钮的 /////////////////////////////////////////////// ...

  8. java中单例设计模式

    在java中创建单例的方式主要有三种:饿汉式.懒汉式.登记式.以下内容均是摘抄自 http://blog.csdn.net/jason0539/article/details/23297037/ 一. ...

  9. opencart配置mail服务

    编辑mail配置,如下图所示 如果sever开启了SSL,则端口改成465 在Contant Us页面留言,发送成功则配置完成

  10. ecstore中kvstore之mongodb

    mongodb安装 详细见 http://blog.csdn.net/motian06/article/details/17560067 mongodb扩展安装 详细见 http://blog.csd ...