spark 部署笔记 2019
Spark部署
- SBT编译
SPARK_HAOOP_VERSION=2.2.0 SPARK_YARN=true sbt/sbt assembly - Maven编译
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m" mvn -Pyarn -Dhadoop.version=2.2.0 -Dyarn.version=2.2.0 -DskipTests clean package
Spark部署包生成命令 make-distribution.sh
-- hadoop VERSION: Hadoop版本号,不加参数时hadoop 版本为1.0.4
-- with-yarn: 是否支持Hadoop YARN,不加参数时,不支持yarn
-- with-hive: 是否在Spark SQL 中支持hive,不加此参数时不支持hive
-- skip-java-test: 是否在编译的过程中略过java测试,不加此参时为略过
-- with-tackyon:是否支持内存文件系统Tackyon,不加此参数不生成tgz文件,只生成/dis目录
-- name NAME: 和--tgz结合可以生成 spark-\(VERSION-bin-\)NAME.tgz的部署包,不加此参数时NAME为hadoop的版本号
部署包生成
- 生成支持yarn、hadoop2.2.0的部署包
./make-distribution.sh --hadoop 2.2.0 --with-yarn --tgz - 生成支持yarn、hive的部署包
./make-distribution.sh --hadoop 2.2.0 --with-yarn --with-hive --tgz
Spark Standalone 集群部署
- Java 的安装
- ssh 无密码登录
- Spark 安装包解压
- Spark 配置文件配置
文件 conf/slave
- hadoop1
- hadoop2
- hadoop3
文件conf/spark-env.sh
export SPARK_MASTER_IP=hadoop1
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORKER_INSTANCES=1
export SPARK_WORKER_MEMORY=3g
Spark Standalone HA 部署
基于文件系统的 HA
- spark.deploy.recoveryMode 设成 FILESYSTEM
- spark.deploy.recoveryDirectory Spark 保存恢复状态的目录
- Spark-env.sh 里对 SPARK_DAEMON_JAVA_OPTS 设置
- export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=FILESYSTEM -Dspark.deploy.recoveryDirectory=/app/hadoop/spark100/recovery"
基于 zookeeper 的 HA
- spark.deploy.recoveryMode 设置成 ZOOKEEPER
- park.deploy.zookeeper.url ZooKeeper URL
- spark.deploy.zookeeper.dir ZooKeeper 保存恢复状态的目录,缺省为 /spark
- spark-env 里对 SPARK_DAEMON_JAVA_OPTS 设置
- export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop1:2181,hadoop2:2181,hadoop3:2181 -Dspark.deploy.zookeeper.dir=/spark"
Spark 工具简介
- Spark 交互工具 spark-shell
- Spark 应用程序部署工具 spark-submit
- 参数说明参见 http://blog.csdn.net/book_mmicky/article/details/25714545
spark-shell
- 例子
– bin/spark-shell --executor-memory 2g --driver-memory 1g --master spark://ha
doop1:7077
– scala> val rdd=sc.textFile("hdfs://hadoop1:8000/dataguru/data/NOTICE")
– scala> rdd.cache()
– scala> val wordcount=rdd.flatMap(_.split(" ")).map(x=>(x,1)).reduceByKey(_+
_)
– scala> wordcount.take(10)
– scala> val wordsort=wordcount.map(x=>(x._2,x._1)).sortByKey(false).map(x=>
(x._2,x._1))
– scala> wordsort.take(10)
spark-submit
- 例子:
– bin/spark-submit --master spark://hadoop1:7077 --class org.apache.spark.exa
mples.SparkPi --executor-memory 2g lib/spark-examples-1.0.0-hadoop2.2.0.jar
1000
bin/spark-submit --master spark://hadoop1:7077 --class org.apache.spark.exa
mples.SparkPi --executor-memory 2g --total-executor-cores 2 lib/spark-examp
les-1.0.0-hadoop2.2.0.jar 1000
var rdd1=sc.textFile("hdfs://hadoop1:8080/dataguru/data/NOTICE")
rdd1.cache()
var rdd2=rdd1.flatMap(.split("")).map(x=>(x,1)).reduceByKey(_+_)
rdd2.take(10)
Hadoop 数据集
- Spark 可以将任何 hadoop 所支持存储资源转化成 RDD ,如本地文件、 HDFS 、 Cassandra 、 HBase, Amazon S3 等。
- Spark 支持 text files, SequenceFiles 和任何 Hadoop InputFormat 格式
使用 textFile() 方法可以将本地文件或 HDFS 文件转换成 RDD
-
如果读取本地文件,各节点都要有该文件;或者使用网络共享文件
-
支持整个文件目录读取,如 textFile("/my/directory")
-
压缩文件读取,如 textFile("/my/directory/*.gz")
-
通配符文件读取,如 textFile("/my/directory/*.txt")
-
textFile() 有可选的第二个参数 slice ,默认情况下,为每个 block 创建一个分片,用户也可以通过 slice 指定更多的分片,但不能使用少于 block 数的分片
-
使用 wholeTextFiles() 读取目录里面的小文件,返回 ( 文件名,内容 ) 对
-
使用 sequenceFile[K,V]() 方法可以将 SequenceFile 转换成 RDD
-
使用 hadoopRDD() 方法可以将其他任何 Hadoop 的输入类型转化成 RDD
广播变量( Broadcast Variables )
- 广播变量缓存到各个节点的内存中,而不是每个 Task
- 广播变量被创建后,能在集群中运行的任何函数调用
- 广播变量是只读的,不能在被广播后修改
- 对于大数据集的广播, Spark 尝试使用高效的广播算法来降低通信成本
- 使用方法
val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar.value
累加器
- 累加器只支持加法操作
- 累加器可以高效地并行,用于实现计数器和变量求和
- Spark 原生支持数值类型和标准可变集合的计数器,但用户可以添加新的类型
- 只有驱动程序才能获取累加器的值
- 使用方法
val accum = sc.accumulator(0)
sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
accum.value
例子
val lines = sc.textFile("hdfs://...")
// transformed RDDs
val errors = lines.filter(_.startsWith("ERROR"))
val messages = errors.map(_.split("\t")).map(r => r(1))
messages.cache()
// action 1
messages.filter(_.contains("mysql")).count()
// action 2
messages.filter(_.contains("php")).count()

浙公网安备 33010602011771号