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-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()
posted @ 2020-02-28 21:38  my_flash  阅读(213)  评论(0)    收藏  举报