Spark 作业提交

Spark 作业提交

一、作业打包jar

1、工程目录结构



2、不同运行模式的打包方式
 Local模式与Yarn模式不同就在于:Local模式运行时jar包仅在本地存在,而Yarn模式需要在每台从机的环境上都要相同的jar包,因此在Yarn 模式打jar包时,需要将pom.xml中依赖的 所有jar包一起打进去。
  (1) Local 模式对maven 工程进行编译为jar 文件
             mvn clean package -DskipTests
    【题外话:安装自定义jar包到自己的maven仓库
            mvn install:install-file -Dfile=/www/lib/ipdatabase-master/target/ ipdatabase-1.0-SNAPSHOT.jar -DgroupId=com.ggstar -DartifactId=ipdatabase -Dversion=1.0 -Dpackaging=jar
       】
    打包成功后,会在ImoocSparkSQLProject/target 文件下生成一个 jar 文件,如pom.xml 中配置为 ,则生成sql-1.0.jar 

  (2) Yarn模式对maven 工程进行编译为jar 文件
           a.打包时要注意,pom.xml中需要添加如下plugin,目的就是将pom.xml所依赖的包一起打进去。

          b. 该方式打包时,可以对环境上已经存在的jar 禁止打进去, 确保 Spark 不与应用依赖的其他工件打包在一起。 在依赖下添加 <scope>provided</scope> ,如图
                            
    

  <plugin>
               <artifactId>maven-assembly-plugin</artifactId>
                    <configuration>
                        <archive>
                            <manifest>
                                 <mainClass></mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
          </plugin>

或者

<!-- 用来创建超级JAR包的Maven shade插件 -->
<plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.3</version>
      <executions>
             <execution>
                   <phase>package</phase>
                    <goals>
                         <goal>shade</goal>
                    </goals>
             </execution>
      </executions>
</plugin>


运行maven 命令:    mvn assembly:assembly
     打包成功后,会在ImoocSparkSQLProject/target 文件下生成一个 jar 文件,如pom.xml 中配置为 ,则生成sql-1.0-jar-with-dependencies.jar 


4、作业提交有多种运行模式,以下是各种模式的提交方式。
5、依赖冲突解决办法:当用户应用与 Spark 本身依赖同一个库时可能会发生依赖冲突,导致程序崩溃。这种情况不是很常见,但是出现的时候也让人很头疼。通常,依赖冲突表现为 Spark 作业执行过程中抛出 NoSuchMethodError 、 ClassNotFoundException ,或其他与类加载相关的 JVM 异常。对于这种问题,主要有两种解决方式:一是修改你的应用,使其使用的依赖库的版本与 Spark 所使用的相同,二是使用通常被称为“shading”的方式打包你的应用。Maven 构建工具通过对例 7-5 中使用的插件(事实上,shading 的功能也是这个插件取名为 maven-shade-plugin 的原因)进行高级配置来支持这种打包方式。shading 可以让你以另一个命名空间保留冲突的包,并自动重写应用的代码使得它们使用重命名后的版本。这种技术有些简单粗暴,不过对于解决运行时依赖冲突的问题非常有效。

二、选择Spark 运行模式提交

在Spark中,支持4种运行模式:
    1)Local:开发时使用
    2)Standalone: 是Spark自带的,如果一个集群是Standalone的话,那么就需要在多台机器上同时部署Spark环境
    3)YARN:建议大家在生产上使用该模式,统一使用YARN进行整个集群作业(MR、Spark)的资源调度
    4)Mesos
不管使用什么模式,Spark应用程序的代码是一模一样的,只需要在提交的时候通过--master参数来指定我们的运行模式即可


1、Local模式下


提交Spark Application到环境中运行。如果要写入数据库数据则需要加上  --jars
1、该模式操作路径在本地的数据
spark-submit  \
--name SparkSessionApp \
--class com.imooc.spark.SparkSessionApp \
--jars /www/lib/mysql-connector-java-5.1.25.jar  \   
--master local[2]  \
/www/lib/sql-1.0.jar  \
/www/instl/spark/spark-2.1.0-bin-2.6.0-cdh5.7.0/examples/src/main/resources/people.json

2、该模式操作路径在hdfs上的数据
spark-submit  \
--name SparkSessionApp \
--class com.imooc.spark.SparkSessionApp \
--jars /www/lib/mysql-connector-java-5.1.25.jar  \   
--master local[2]  \
/www/lib/sql-1.0.jar  \
hdfs://hadoop001:8020/inputfile/ people.json


2、YARN模式
    如果想运行在YARN之上, ResourceManager的地址从Hadoop配置中获取。因此必须要设置HADOOP_CONF_DIR或者是YARN_CONF_DIR。即为spark配置上hadoop路径下直 到/etc/hadoop 的路径
  
   方式 1:直接导出方式   export HADOOP_CONF_DIR=/www/instl/hadoop/hadoop-2.6.0-cdh5.9.3/etc/hadoop

   方式2:在 $SPARK_HOME/conf/spark-env.sh 中配置上hadoop路径下直 /etc/hadoop 的路径
     
       HADOOP_CONF_DIR= /www/instl/hadoop/hadoop-2.6.0-cdh5.7.0/etc/hadoop

 YARN 模式运行的两种方式

 (1) Client 模式特点:(YARN默认模式)
         a. Driver运行在Client端(提交Spark作业的机器)
         b.Client会和请求到的Container进行通信来完成作业的调度和执行,Client是不能退出的
         c..日志信息会在控制台输出:便于我们测试
         d.命令如

如果要写入数据库数据则需要加上  --jars  ,如果需要引入文件,需要加上 --file
1、该模式操作路径在hdfs上的数据.(参数路径不加hdfs://hadoop001:8020 时,默认加上这路径)
spark-submit \
--name SparkSessionApp \
--class com.imooc.spark.SparkSessionApp \
--jars /www/lib/mysql-connector-java-5.1.25.jar  \
--master yarn-client  \
--executor-memory 1G \
--num-executors 1 \
--conf spark.sql.shuffle.partitions=100 \
--files /www/lib/ipDatabase.csv,/home/hadoop/lib/ipRegion.xlsx \
/www/lib/sql-1.0-jar-with-dependencies.jar \
hdfs://hadoop001:8020/inputfile/access.log   hdfs://hadoop001:8020 / outputfile/clean

2、该模式操作路径在本地数据,需要加上 file:// 标识
spark-submit \
--name SparkSessionApp \
--class com.imooc.spark.SparkSessionApp \
--jars /www/lib/mysql-connector-java-5.1.25.jar  \
--master yarn- client  \
--executor-memory 1G \
--num-executors 1 \
--conf spark.sql.shuffle.partitions=100 \
--files /www/lib/ipDatabase.csv,/www/lib/ipRegion.xlsx \
/www/lib/sql-1.0-jar-with-dependencies.jar \
file:///www/data/outputfile/access.log   file:///www/data/outputfile/clean

3、不参与操作路径资源

spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn- client  \
--executor-memory 1G \
--num-executors 1 \
/www/instl/spark/spark-2.1.0-bin-2.6.0-cdh5.7.0/examples/jars/spark-examples_2.11-2.1.0.jar \
4


(2) Cluster模式特点:
          a.Driver运行在ApplicationMaster中
          b.Client只要提交完作业之后就可以关掉,因为作业已经在YARN上运行了
          c.日志是在终端看不到的,因为日志是在Driver上,只能通过yarn logs -applicationId application_id (命令: yarn logs -applicationId application_1495632775836_0002  需要开通日志聚合功能服务)
                      也可以在界面上查看结果:

          d.命令如:(仅 master 后模式进行改变)

如果要写入数据库数据则需要加上  --jars  ,如果需要引入文件,需要加上 --file

1、该模式操作路径在hdfs上的数据(参数路径不加 hdfs://hadoop001:8020 时,默认加上这路径)
spark-submit \
--name SparkSessionApp \
--class com.imooc.spark.SparkSessionApp \
--jars /www/lib/mysql-connector-java-5.1.25.jar  \
--master yarn-cluster  \
--executor-memory 1G \
--num-executors 1 \
--conf spark.sql.shuffle.partitions=100 \
--files /www/lib/ipDatabase.csv,/www/lib/ipRegion.xlsx \
/www/lib/sql-1.0-jar-with-dependencies.jar \
hdfs://hadoop001:8020/inputfile/access.log   hdfs://hadoop001:8020 / outputfile/clean

2、该模式操作路径在本地数据,需要加上 file:// 标识
spark-submit \
--name SparkSessionApp \
--class com.imooc.spark.SparkSessionApp \
--jars /www/lib/mysql-connector-java-5.1.25.jar  \
--master yarn- cluster  \
--executor-memory 1G \
--num-executors 1 \
--conf spark.sql.shuffle.partitions=100 \
--files /www/lib/ipDatabase.csv,/home/hadoop/lib/ipRegion.xlsx \
/www/lib/sql-1.0-jar-with-dependencies.jar \
file:///www/data/outputfile/access.log   file:///www/data/outputfile/clean

3、不参与操作路径资源
spark-submit \
--class org.apache.spark.examples.SparkPi  \
--master yarn- cluster  \
--executor-memory 1G \
--num-executors 1 \
--conf spark.sql.shuffle.partitions=100 \
/www/instl/spark/spark-2.1.0-bin-2.6.0-cdh5.7.0/examples/jars/spark-examples_2.11-2.1.0.jar \
4


三 优化、调整并行度

./bin/spark-submit \
--class com.imooc.log.TopNStatJobYARN \
--name TopNStatJobYARN \
--master yarn \
--executor-memory 1G \
--num-executors 1 \
--conf spark.sql.shuffle.partitions=100 \
/home/hadoop/lib/sql-1.0-jar-with-dependencies.jar \


注意:不同模式参数路径读取路径位置
在不同的启动模式下,加载文件时的 参数 路径 写法是不一样的,对于local模式下,默认就是读取本地文件,而在standlone或者yarn-client,或者 yarn- cluster模式下,默认读的都是hdfs文件系统】, 这几种模式下很难读取本地文件(这是很显然的事情,但你可以通过指定节点的文件服务曲线救国)。
下面的代码在local模式下有效,在其它模式下无效:
var theP1 = sc.textFile("file:///usr/test/people.json")  //读取本地
var theP2 = sc.textFile(" hdfs://master.hadoop/user/root/test/test/people.json ") //读取hdfs文件
下面的代码在非local模式下,都是读取的hdfs,file://模式无效.
var theP1 = sc.textFile("/usr/test/people.json")  
var theP2 = sc.textFile("/user/root/test/test/people.json")
下面这个语句在几种模式下都有效
var theP2 = sc.textFile(" hdfs://master.hadoop/user/root/test/test/people.json ") //读取hdfs文件
在非local模式下等同于
var theP2 = sc.textFile("/user/root/test/test/people.json")


报错:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/kafka/KafkaUtils$
    at com.imooc.spark.project.spark.ImoocStatStreamingApp$.main(ImoocStatStreamingApp.scala:31)
    at com.imooc.spark.project.spark.ImoocStatStreamingApp.main(ImoocStatStreamingApp.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:755)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.streaming.kafka.KafkaUtils$
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 11 more

修正:把maven中以依赖的org.apache.spark:spark-streaming-kafka-0-8_2.11:2.2.0注释,以package 进行操作

spark-submit --master local[5] \
--class com.imooc.spark.project.spark.ImoocStatStreamingApp \
--packages org.apache.spark:spark-streaming-kafka-0-8_2.11:2.2.0 \
/home/hadoop/lib/sparktrain-1.0.jar \
hadoop000:2181 test streamingtopic 1

报错2

java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/client/HBaseAdmin
    at com.imooc.spark.project.utils.HBaseUtils.<init>(HBaseUtils.java:30)
    at com.imooc.spark.project.utils.HBaseUtils.getInstance(HBaseUtils.java:40)
    at com.imooc.spark.project.dao.CourseClickCountDAO$.save(CourseClickCountDAO.scala:26)
    at com.imooc.spark.project.spark.ImoocStatStreamingApp$$anonfun$main$4$$anonfun$apply$1.a

将Hbase的包全部引入

spark-submit --master local[5] \
--jars $(echo /home/hadoop/app/hbase-1.2.0-cdh5.7.0/lib/*.jar | tr ' ' ',') \
--class com.imooc.spark.project.spark.ImoocStatStreamingApp \
--packages org.apache.spark:spark-streaming-kafka-0-8_2.11:2.2.0 \
/home/hadoop/lib/sparktrain-1.0.jar \
hadoop000:2181 test streamingtopic 1




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野狼e族

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值