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 \
|
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 \
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 \
2、该模式操作路径在本地数据,需要加上file:// 标识
spark-submit \
--name SparkSessionApp \
--class com.imooc.spark.SparkSessionApp \
--jars /www/lib/mysql-connector-java-5.1.25.jar \
--masteryarn-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 \
--masteryarn-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 \
hdfs://hadoop001:8020/imooc/clean 20170511
|
注意:不同模式参数路径读取路径位置
【在不同的启动模式下,加载文件时的参数路径写法是不一样的,对于local模式下,默认就是读取本地文件,而在standlone或者yarn-client,或者yarn-cluster模式下,默认读的都是hdfs文件系统】, 这几种模式下很难读取本地文件(这是很显然的事情,但你可以通过指定节点的文件服务曲线救国)。
下面的代码在local模式下有效,在其它模式下无效:
var theP1 = sc.textFile("file:///usr/test/people.json") //读取本地
下面的代码在非local模式下,都是读取的hdfs,file://模式无效.
var theP1 = sc.textFile("/usr/test/people.json")
var theP2 = sc.textFile("/user/root/test/test/people.json")
下面这个语句在几种模式下都有效
在非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 )
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
|