一 ,SparkPi 源码分析 :

1 ,在 linux 中把例子整出来 :

spark提交yarn的client任务jar包冲突 spark yarn 提交_jar

2 ,得到 jar 包 :

spark提交yarn的client任务jar包冲突 spark yarn 提交_jar_02

3 ,把他整到 idea 中 :

spark提交yarn的client任务jar包冲突 spark yarn 提交_spark_03

4 ,看这个类 : SparkPi

spark提交yarn的client任务jar包冲突 spark yarn 提交_hadoop_04

5 ,源码查看 : 读懂它,老师已经添加详细注释

  1. 思路 :
  2. 代码 :
package day01.demo01.pi

import org.apache.spark.{SparkConf, SparkContext}
import scala.math.random

object MyPi {
    def main(args: Array[String]): Unit = {
        var sc = new SparkContext(new SparkConf().setAppName("pi").setMaster("local"))
        //  系数取值 : 如果传参了,就ongoing第一个参数,没传参的话,就用默认值 2
        val slices = if (args.length > 0) args(0).toInt else 2
        //  n : 比如我们传进来参数 100,n = 1000 0000
        val n = math.min(100000L * slices, Int.MaxValue).toInt
        //  打点 n 个,slices 是分区个数 ( count 就是有多少个点,落在圆内 )
        val count = sc.parallelize(1 until n, slices).map { i =>
            //  -1 --> 1
            val x = random * 2 - 1
            val y = random * 2 - 1
            //  落在圆内( x方+y方<r方 ),就取值 1 ,落在圆外就取值 0 ( 取值 n 次,所以,这个 n ,指的是次数,并不直接参与预算 )
            if (x*x + y*y <= 1) 1 else 0
            //  一共有多少个点落在圆内
        }.reduce(_ + _)
        //  思考 : π1^2=面积
        //          count / (n - 1) = 比例 : 圆内的点的比例,占了正方形的几分之几
        //          count / (n - 1) * (2*2) = 面积
        //          π = 4.0 * count / (n - 1)
        println(s"Pi is roughly ${4.0 * count / (n - 1)}")
        sc.stop()
    }
}

6 ,获得知识 :

  1. 数组 --> rdd
val rdd:RDD[String] = sc.parallelize(Array[String](1,2,3,4))
val rdd:RDD[String] = sc.makeRDD(Array[String](1,2,3,4))
  1. reduce 求和 :
def main(args: Array[String]): Unit = {
    var conf = new SparkConf().setAppName("rd").setMaster("local")
    var sc = new SparkContext(conf)
    val rdd1: RDD[Int] = sc.parallelize(Array[Int](1,2,3,4,5))
    val i: Int = rdd1.reduce(_+_)
    println(i)
    sc.stop()
}
  1. 指定分区个数 :
    数据 : 1 --> n
    分区数 : slices
    spark.sparkContext.parallelize(1 until n, slices)

7 ,运行结果 :

spark提交yarn的client任务jar包冲突 spark yarn 提交_jar_05

8 ,在集群中运行 :

cd /export/servers/spark-2.3.1-bin-hadoop2.6/bin
./spark-submit --master spark://node01:7077 --class org.apache.spark.examples.SparkPi /export/servers/spark-2.3.1-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.3.1.jar 100

9 ,得到结果 :

spark提交yarn的client任务jar包冲突 spark yarn 提交_hadoop_06

二 ,搭建 Spark 提交任务的客户端

1 ,原理 :

  1. 把 spark 安装包严封不动的复制到另一台机器上即可
  2. 为什么 : 因为主机是 node01 ,从节点是 node02 , node03 ,即使把 spark 安装包复制到 node04 了,node04 也只是个提交任务的工具而已,没有别的用。

2 ,做法 :

将 spark 安装包复制到另一台机器即可

三 ,spark on yarn 搭建 :

1 ,停止 spark 集群 :

cd /export/servers/spark-2.3.1-bin-hadoop2.6/sbin
./stop-all.sh

2 ,修改 yarn 配置 : ( 三台机器 )

  1. 关闭虚拟内存检查
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim yarn-site.xml
<!-- 关闭虚拟内存检查 -->
<property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
</property>
scp yarn-site.xml root@node02:$PWD
scp yarn-site.xml root@node03:$PWD
  1. 也可以 : 修改虚拟内存 :
<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>9000</value>
    <discription>每个任务最多可用内存,单位MB,默认8192MB</discription>
</property>
<property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>200</value>
    <discription>每个任务最少可用内存,单位MB</discription>
</property>
<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4.1</value>
    <discription>container最少使用的虚拟内存比例</discription>
</property>

3 ,修改 - 环境变量 :

vim /etc/profile

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

source /etc/profile

4 ,修改 - spark-env.sh

cd /export/servers/spark-2.3.1-bin-hadoop2.6/conf
vim spark-env.sh

# HADOOP_CONF_DIR
export HADOOP_CONF_DIR=/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/

5 ,基于 yarn 提交任务 : 理论

  1. 不需要 spark 集群
  2. 只要启动 yarn 就可以了
  3. 为什么 :
    1 ,算法是我们写的
    2 ,计算引擎是 Spark 的
    3 ,资源是由 yarn 分配的

6 ,基于 yarn 提交任务 : 动手

  1. 启动 hdfs : node01
    start-dfs.sh
  2. 启动 yarn :node01
    start-yarn.sh
  3. 启动历史任务 :node01
    mr-jobhistory-daemon.sh start historyserver
  4. 提交 SparkPi :node01
cd /export/servers/spark-2.3.1-bin-hadoop2.6/bin
./spark-submit  --master yarn --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 10000

7 ,正确的结果 :

spark提交yarn的client任务jar包冲突 spark yarn 提交_jar_07