Spark学习笔记(相关ha集群搭建+知识总结)

  1. Spark HA模式搭建
  2. 借助zookeeper,并且启动至少两个Master节点来实现高可靠,配置方式比较简单:
  3. Spark集群规划:hadoop02,hadoop03是Master;hadoop02, hadoop03, hadoop04是Worker
  4. 安装配置zk集群,并启动zk集群
  5. 停止spark所有服务,修改配置文件spark-env.sh,在该配置文件中删掉SPARK_MASTER_IP并添加如下配置
  6. export SPARK_DAEMON_JAVA_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop02:2181,hadoop03:2181,hadoop04:2181 -Dspark.deploy.zookeeper.dir=/spark”
  7. 1.在hadoop02节点上修改slaves配置文件内容指定worker节点
  8. 2.在hadoop02上执行sbin/start-all.sh脚本,然后在hadoop03上执行sbin/start-master.sh启动第二个Master

1.spark-env.sh配置信息
export JAVA_HOME=/usr/local/jdk1.8.0_73
export SCALA_HOME=/usr/local/scala-2.11.8
export SPARK_HOME=/home/hadoop/apps/spark-2.2.0
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.6.5
export HADOOP_CONF_DIR=/home/hadoop/apps/hadoop-2.6.5/etc/hadoop

ZOOKEEPER集群信息

export SPARK_DAEMON_JAVA_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=hadoop02:2181,hadoop03:2181,hadoop04:2181 -Dspark.deploy.zookeeper.dir=/spark”

历史服务器(/spark/sparklogs需要在hdfs中创建,注意这里是hadoop02:9000,不是集群myha01!)

export SPARK_HISTORY_OPTS=”-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=3
-Dspark.history.fs.logDirectory=hdfs://hadoop02:9000/spark/log”

export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8080
export SPARK_WORKER_MEMORY=1g
export SPARK_WORKER_CORES=1

export SPARK_WORKER_PORT=7078

export SPARK_WORKER_WEBUI_PORT=8081

export SPARK_WORKER_INSTANCES=1
export SPARK_EXECUTOR_MEMORY=1g
export SPARK_DRIVER_MEMORY=1g

export SPARK_LOG_DIR=/home/hadoop/sparkdata/logs
export SPARK_PID_DIR=/home/hadoop/sparkdata
export SPARK_LOCAL_IP=192.168.18.204
export SPARK_CLASSPATH= SPARKCLASSPATH: CLASSPATH:/home/hadoop/apps/spark-2.2.0/lib/mysql-connector-java-5.1.40-bin.jar:/home/hadoop/apps/apache-hive-1.2.1-bin/lib*

  1. slaves配置信息
    hadoop02
    hadoop03
    hadoop04

  2. spark-defaults.conf配置信息()
    spark.master spark://hadoop02:7077
    spark.eventLog.enabled true
    spark.eventLog.dir hdfs://hadoop02:9000/spark/log
    spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers=”one two three”
    spark.yarn.historyServer.address hadoop02:18080
    spark.history.fs.logDirectory hdfs://hadoop02:9000/spark/user

  3. spark-submit
    spark-submit提交基于本地/
    /home/hadoop/apps/spark-2.2.0/bin/spark-submit \
    –class WordCount2 \
    –master local[1] \
    /home/hadoop/original-spark1706-1.0-SNAPSHOT.jar \
    100
    spark-submit提交基于yarn///
    export HADOOP_CONF_DIR=/home/hadoop/apps/hadoop-2.6.5/etc/hadoop
    /home/hadoop/apps/spark-2.2.0/bin/spark-submit \
    –class WordCount2 \
    –master yarn \
    –deploy-mode client \
    –executor-memory 1G \
    –num-executors 1 \
    /home/hadoop/original-spark1706-1.0-SNAPSHOT.jar \
    1000

  4. spark-submit提交基于yarn(必须添加的内容)
    spark-submit提交基于yarn,出现找不到sparkContext时候,修改yarn-site.xml,从而修改虚拟内存


yarn.nodemanager.vmem-pmem-ratio
4
Ratio between virtual memory to physical memory when setting memory limits for containers

  1. Spark-sql, Spark on yarn的搭建
    Spark on yarn已搭建好,开始使用SparkSql,做如下工作
    1、 将Hive-site.xml 复制至$SPARK_HOME/conf目录,注意配置hive.metastore.uris、hive.metastore.client.socket.timeout


hive.metastore.warehouse.dir
/user/hive/warehouse
hive default warehouse, if nessecory, change it

2、复制MySQL-connector-Java.jar 到 SPARKHOME/lib3sparkenv.shexportSPARKCLASSPATH= SPARK_CLASSPATH:/home/hadoop/apps/spark-2.2.0/lib/mysql-connector-java-5.1.40-bin.jar:/home/hadoop/apps/apache-hive-1.2.1-bin/lib*

4.将 HIVEHOME/conf/hivesite.xml SPARK_HOME/conf目录下。
HADOOPHOME/etc/hadoop/hdfssite.xml SPARK_HOME/conf目录下。

启动Spark集群
启动SparkSQL Client:
/home/hadoop/apps/spark-2.2.0/bin/spark-shell \
–master spark://hadoop02:7077 \
–executor-memory 1G \
–num-executors 1 \
–driver-class-path /home/hadoop/apps/spark-2.2.0/lib/mysql-connector-java-5.1.40-bin.jar \

/home/hadoop/apps/spark-2.2.0/bin/spark-shell \
–master yarn \
–executor-memory 1G \
–num-executors 1 \
–driver-class-path /home/hadoop/apps/spark-2.2.0/lib/mysql-connector-java-5.1.40-bin.jar \

6.1 Kafka的搭建
kafka的搭建步骤
1) 集群的角色规划
2) 到 官方网站上面去下载需要版本。
3) 解压 -》 重命名(软件链接) -》 配置环境变量
4) 修改配置文件 $KAFKA_HOME/config/server.properties这个文件 , 修改内容如下: 红色的地方是必须要修改的
broker.id=0 类似于zookeeper里面的myid 文件, 用来做标示的。
port=9092 端口号 一般情况下,不用改。
host.name=hadoop3 绑定主机名
log.dirs=/usr/local/soft/kafka/kafka-logs 消息的数据存在哪个目录下(配置一个存储比较大目录)
num.partitions=1 配置默认主题分区的个数,一般我们也不配,不配默认就是1 个分区。 如果需要多个分区。那么在创建topic的时候可以指定的。 如果数据量比较大,建议使用多个分区。如果数据量比较小,那么一个分区就可以了。
log.retention.hours=168 kafka里面的数据也是有生命周期的。默认 数据会帮你保留 168 个小时。也就是 7天。
zookeeper.connect=localhost:2181 kafka集群依赖的是哪一套zookeeper。
5) 启动服务
kafka-server-start.sh config/server.properties
6) 测试(注意,不同的版本应该参考不同的文档)
6.1 创建主题
kafka-topics.sh –create –zookeeper localhost:2181 –replication-factor 1 –partitions 1 –topic test
6.2 查询主题
bin/kafka-topics.sh –list –zookeeper localhost:2181
6.3模拟一个生产者往kafka里面添加数据:
bin/kafka-console-producer.sh –broker-list hadoop1:9092,hadoop2:9092 –topic test
生产者给kafka 写数据的时候只需要跟kafka其中的一个节点交互就可以了。
6.4 模拟一个消费者,往kafka里面消费数据 读数据
bin/kafka-console-consumer.sh –zookeeper localhost:2181 –topic test –from-beginning
6.Flume的搭建

a1

a1.sources=r1
a1.sinks=k1
a1.channels=c1

source

a1.sources.r1.type=spooldir
a1.sources.r1.spoolDir=/root/test1706

channel

a1.channels.c1.type=memory

sink

a1.sinks.k1.type=logger

bind then source and wink to then channel

a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
启动脚本
flume-ng agent –conf conf –conf-file ../conf/test1.properties –name a1 -Dflume.root.logger=INFO,console
7. 弹性分布式数据集 RDD
Spark最重要的就是RDD(Resilient Distributed Datasets )
1)数据是分散在各个节点上面(分布式的数据集)
2)具有可分区性
一个RDD里面会有一个或者多个分区,
默认情况下,HDFS上一个文件块就对应RDD里面的一个区
3)弹性的
灵活
如果在内存足够的情况下,Spark就在内存里面运行,但是
如果内存不够,可以把多余的数据放到磁盘去运行。这样处理起来就比较
灵活。比较有弹性。
4)容错性
7. RDD结构

  1. RDD分区

  2. RDD的创建
    1)通过读取文件
    a 通过读取的是本地文件
    b 通过读取的是HDFS上的文件
    c ….还有其他的,只要我们能读到就可以了。
    2)使用并行化的方式创建RDD
    sc.parallelize(List(1,2,3))
    3)makeRDD
    val RDD = sc.makeRDD(List(1,2,3,4))

  3. Transformation和action

10.Spark架构

  1. Collect

  2. Spark广播变量

  3. Spark累加变量

  4. Spark对外存 OFF_HEAP

  5. Spark持久化
    RDD的持久化肯定是一个调优的操作,现在我们要梳理的是什么样的情况下使用这个持久化!!
    如果我们的这个RDD就被我们使用一次,要把它持久化的必要性不是很大!!
    如果一个rdd多次被我们使用,这个时候,强烈建议,把这个rdd进行持久化,这非常有利于提高我们的
    代码运行的效率。
    持久化的时候肯定需要考虑一些持久化的级别:
    1) 大多数情况下,我们不用说,我们肯定喜欢的是cache,因为数据都是在内存里面效率很高。
    2)如果这样做我们的内存有肯定 是不够的,我们就需要考虑把数据持久化的时候,进行对数据序列化
    说道序列化,其实序列化是有多种方式的,不同方式的序列化,性能也不一样。 这个时候
    就需要我们考虑配置性能比较好的序列化方式。( 这个我们会在调优的时候,单独拿出来 讲解,然后我们会在项目里面去演示如何去配置。 )
    目前,我们只需要有这个问题需要我们去考虑就可以了。
    3)虽然Spark给我们提供了可以把数据一个部分存到磁盘,一部分存到内存里面,或者把【所有的数据都存到磁盘上】(特别是这一种)
    我们不太建议使用,性能上没什么提升,更有可能的是,还不如我们代码从头计算一次。
    4)如果对数据进行进行持久化完了以后,确定不用了,那么最好 使用如下代码:
    RDD.unpersist()
    LRU

  6. Checkpoint

  7. Spark运行模式
    spark://host:port, mesos://host:port, yarn, or local.
    Spark的运行模式:
    这个地方,我们讲,但是大家要注意,千万不要一次性就说有几种。
    最好直接把相对应的模式给说出来,什么意思呢?
    1)第一种模式:
    个人认为应该说的是Local,什么叫Local模式呢?
    我们是平时开发,在IDEA,Eclipse里面开发的模式就是Local模式。
    还有,我们直接用Spark-Shell这种进来的模式也是local。
    那,所有从Spark-shell这儿进来的模式都是local模式吗?
    spark-shell –master spark://hadoop1:7077 –executor-memory 500m –total-executor-cores 1
    2) standalone模式:
    我们应该注意,Spark自己管理自己的资源。在目前的企业里面一部分的集群,确实也是
    会用Standalone模式。
    cluster模式
    client模式
    大家应该还记得,我们之前在讲Spark运行流程的时候,我们在提Dirver,那个时候我说,当时我们说的是在某种模式下,哪一台上面提交的代码,那么哪一台就是Driver服务器。

    在standalone的时候,分为cluster模式和client模式,区别在于Dirver的位置不一样,如果使用的是client模式,那么在哪台上提交的spark的代码,那么哪台就是
    Driver。如果提交任务的时候我们使用的是cluster的模式呢? 那么会在Spark集群里面随机挑一台服务器作为Driver节点。 他们不一样的地方在于Driver位置的不同。
    具体任务使用什么模式,是有–deploy-mode 这个参数控制,如果不配置默认就是client模式。如果需要cluster模式,那么需要配置一下。
    如果配置了不同模式,区别在于两点?
    1) Dirver的位置不一样,那么如果是client模式,那么Driver服务就会在提交代码的那台服务器上生成,假如我们提交了100个任务,那么这台服务器,就会有100个
    Driver,压力很大,容易出问题,所以我们在正式集群里面提交任务的时候我们互使用cluster模式,因为要把Dirver分散到各个节点(一个任务运行完了Driver就消失了)

2) 那client有什么优势,肯定有优势,优势在于你在运行程序的时候,打印出来的日志特别的详细。
这有利于大家去调试程序,所以我们正常的开发路程是这样子的。我们肯定开发的时候,测试的时候那么使用的client的模式。
等我门的任务运行正确以后,我们会把变成Cluster模式去提交到集群上!!!

3,Spark on YARN 模式
这个模式,在工作当中要的场景很多,为什么呢?因为之前大数据的平台就是用hadaoop去架构的,也就是说之前大数据平台里面已经有Hadoop了。
现在我们可能就是往这个平台上面去扩我们的生态圈。
现在我们要注意这样的一个问题。使用了yarn以后Spark的任务应该要怎么运行了?

   对于Spark的Application,由两个重要的部分组成:
1) Driver  Program
        main(xxx){
        new SparkContext()  //这行代码非常重要
        }
        资源申请,任务调度
 2) Executor
            JVM(进程)
            里面云心我们Job任务的Task。

现在我们思考,Spark的运行流程我们知道的,yarn的运行流程我们也是知道的。 问题是这两个过程怎么才能很好的结合在一起呢?
1)在Spark运行的时候,要启动Executor,我们的任务需要在Executor里面去运行。
实际上这个问题挺好解决,到了yarn里面以后,我们也申请资源,这个时候我们申请到的资源是container,我们在container里面
启动Executor,这正运行的是Executor里面task。
2) 这儿有问题?
在Spark里面 Driver去申请资源
在yarn里面APPmaster也是申请资源。
其实很简单,申请资源的时候, Driver -》 ApplicationMaster -> ResourceManager
总结:
在yarn的模式下,Spark任务的运行,也分client和cluster 。如果是client模式,那么Driver就是在提交代码的哪台服务器上生成。
如果是CLuster模式,那么Driver会在NodeManager的随机节点上生成。

mesos:
Mesos也是一个类似于YARN的资源调度器。实际上,Spark出来的时候,其实是基于整个Mesos,因为spark和Mesos 是由同一个团队开发的。
所以,在公司里面管理资源的时候,有些团队真会可能会用这个Mesos,比如联通
它里面也分client和cluster这样的两种模式。
大家感兴趣就百度一下就可以了!!!
18. Spark任务提交
比如我们现在进行任务的提交。大家尽量去官方文档上面去找,相对应spark的版本的提交方式。不同的spark的版本,提交认识稍有不同。
如果让spark on yarn呢>
其实什么都不用做,把yarn集群启动起来就可以了。然后最多在spark-evn.sh配置HADOOP_CONF_DIR=/usr/local/soft/hadoop/etc/hadoop 参数就可以了。
./bin/spark-submit \
–class org.apache.spark.examples.SparkPi \
–master yarn \
–deploy-mode cluster \
–executor-memory 1G \
–num-executors 1 \
/path/to/examples.ja
大家要注意一点,不同的版本,提交的方式有点不一样。
经常问的一个问题:(明天早上分享的同学讲一讲(第一个))
Spark 运行的模式有几种。
Local
Stanalone
client
cluster
YARN
client
cluster
Mesos
client
cluster

  1. Spark窄依赖和宽依赖
    在RDD中,把依赖划分为了两种类型,一种是窄依赖,一种是款依赖。
    窄依赖:
    指父RDD的每个分区都只被子RDD的一个分区所使用。
    宽依赖:
    指父RDD的分区被子RDD多个分区所依赖

  2. Spark常见名词解释
    词 含义
    Application User program built on Spark. Consists of a driver program and executors on the cluster.
    我们开发的程序,开发完了以后,提交到Spark上面去运行,那么我们开发的这个程序就叫做application

Application jar A jar containing the user’s Spark application. In some cases users will want to create an “uber jar” containing their application along with its dependencies. The user’s jar should never include Hadoop or Spark libraries, however, these will be added at runtime.
我们开发完了代码以后,我们运行的时候,都是打成jar包。 我们打成的那个运行的jar就是一个application jar。
Driver program The process running the main() function of the application and creating the SparkContext
在不用的模式下,因为我们开始初始我们代码,就会出来Driver服务 (其实Driver这个事目前来讲我们讲得很模糊,我们后面会在看源码的时候,再会过头来解释这个东西)
Cluster manager An external service for acquiring resources on the cluster (e.g. standalone manager, Mesos, YARN)
之所以给出来这个概念,是因为我们的运行模式不一样。

Deploy mode Distinguishes where the driver process runs. In “cluster” mode, the framework launches the driver inside of the cluster. In “client” mode, the submitter launches the driver outside of the cluster.
client模式和cluster模式, 这两种模式决定了Driver的位置不一样。
Worker node Any node that can run application code in the cluster
通俗的这么理解,运行我们application的节点就是worker节点。
Executor A process launched for an application on a worker node, that runs tasks and keeps data in memory or disk storage across them. Each application has its own executors.
我们分配了资源以后,会启动Executor,其实真正运行任务的task就是在运行在Executor里面的。

Task A unit of work that will be sent to one executor
工作线程!!
Job A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g. save, collect); you’ll see this term used in the driver’s logs.
这个概念跟之前的mapreduce不一样,在Mapreduce里面,一个我们提交MR任务就是一个Job。
一个application里面可以有多个Job任务, 绝大多数情况下,以action为界限,每遇到一个action的操作这个application里面就会产生一个Job任务。
我们可以想到,我们开发的一个程序里面,是可以有多个action操作的,所以我们的一个application里面确实是可以有多个Job的。
Stage Each job gets divided into smaller sets of tasks called stages that depend on each other (similar to the map and reduce stages in MapReduce); you’ll see this term used in the driver’s logs.
阶段,我们的一个Job任务里面又可以划分出来多个stage。

  1. Spark的任务调度

  2. Spark的stage的划分算法

  3. HistoryServer 历史服务器查看任务
    HistoryServer端口号19888 是给Mapreduce提供的。
    对于Spark的程序,它的任务的执行情况非常重要,我们要根据他的任务的执行情况去调优。所以历史任务的界面就显得特别的重要!!!

  4. map使用替代join
    rdd1 <1,刘德华>
    rdd2 <1,99>
    rdd3

使用起来稍微需要配置一下。 性能比java序列化高10倍左右

什么样的情况下,考虑使用序列化
1)持久化的时候
涉及到序列化 减少空间的占用
观点:
找性能较好的序列化技术
2)自定义数据类型
如果需要实现序列化,那么就要手动去配置。
这个地方我们简单的说明一下,因为在我们后面做项目的时候,我们会使用这些序列化的优化,所以这儿就不演示了。
/ 创建SparkConf对象。
val conf = new SparkConf().setMaster(…).setAppName(…)
// 设置序列化器为KryoSerializer。
conf.set(“spark.serializer”, “org.apache.spark.serializer.KryoSerializer”)
// 注册要序列化的自定义类型。
conf.registerKryoClasses(Array(classOf[Student]))
kyro 节省的空间 是 java序列化 类库节省 空的 10倍左右!!!
27. Spark程序的数据结构优化
1)一个java对象,对象头 16字节
如果现在有一个对象,这个对象里面只有一个property
这个property是一个Int类型的数。 这个对象 几字节. 20字节。所以能不用对象就不用对象
json字符串
用json字符串 去替代对象
2)java的字符串 ,需要多少额外的空间存(40个字节)
val a=”abcde” UTF-16 2
50个
val a=”1”
val a:Int=1
3) ArrayList,HashMap,LinkedList 是不是很好用!!!
能不用就不用,尽可能的使用原生的数组
int[] array=new Int[]

  1. Spark数据本地性

  2. Spark的 数据倾斜
    1) 数据倾斜的现象
    绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。这种情况很常见。
    发生了数据倾斜,那么还有可能 某个task处理的数据量就很大,有时候数据量大了就会导致内存溢出!!!
    2) 发生数据倾斜的根本原因
    其实发生数据倾斜的根本的原因,就是某个task处理的数据量比较大!!!!

3) 如何去定位数据倾斜

我们发现通过界面,得知,是哪个stage发生了数据倾斜。
a) 通过我们之前学习的stage的划分算法,我们自己也可以推理得出来,哪些代码大概有问题。
b) 通过界面其实也可以看得出来,某个stage包含了哪些代码
4)去定位导致数据倾斜的key:

   transformation里面的几乎所有的算子都演示,其中一个算子是sample算子。
  RDD:有数据倾斜问题
  RDD.countByKey 
          结果一:能运行出来,但是需要等很长时间
          结果二:有可能一直运行不过去,内存溢出
    sample是用来采样。
  sampleRDD. countBykey  
              我们可以从采样的结果里面观察出来  key的分布的情况。

5)各种方法去解决数据倾斜
30. Spark提升Shuffle的并行度

  1. Spark两阶段聚合

  2. Spark 的reduce join转为map join

  3. 数据倾斜
    rdd1 RDD

transformation和action

SparkSQL
//创建程序入口
val sqlContext=new SQLContext(sc)
DataFrame 分布式的数据集,按列名的方式去组织的数据,类似于关系型数据库里面的一张表。
SQL语句

transformation和action

SparkStreaming
//创建程序入口
val conf = new SparkConf()
val ssc = new StreamingContext(conf, Seconds(1))
DStream
transformation和action

71 SparkStreaming抽象

72 foreachRDD

73 窗口函数(window)

74
75
76
77
78
79

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值