Spark WordCount
代码
package com.my
import org.apache.spark.{SparkConf, SparkContext}
object StreamingT {
def main(args: Array[String]): Unit = {
var conf = new SparkConf().setAppName("WordCount")
// 提交到集群运行时 不用设置
// .setMaster("local")
var sc = new SparkContext(conf)
//args(0)传参文件路径
var result = sc.textFile(args(0)).flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).sortBy(_._2)
//保存到args(1)中
result.saveAsTextFile(args(1))
sc.stop()
}
}
pom文件
<!--当前maven项目的唯一标识-->
<groupId>com.lqy</groupId>
<artifactId>streming</artifactId>
<version>1.0-SNAPSHOT</version>
<!--同一版本号 (抽出来) -->
<properties>
<spark.version>2.3.0</spark.version>
</properties>
<!--运行依赖-->
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.3.0</version>
<!--表示打包的时候,不会打进去 , 但是本地运行时候,需要放开-->
<scope>provided</scope>
</dependency>
</dependencies>
<!--打包的依赖-->
<build>
<finalName>WordCount</finalName>
<plugins>
<!--Scala打包插件-->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<archive>
<manifest>
<!--对应打包的主类-->
<mainClass>com.my.StreamingT</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
打包 上传服务器 启动hadoop start-dfs.sh
启动spark集群 sbin/start-all.sh
sbin/start-master.sh
启动备用master节点基于spark standalone提交任务 standalone client模式 bin/spark-submit
--master spark://node05:7077
--deploy-mode client
--class com.my.StreamingT
/root/WordCount.jar
hdfs://mycluster/user/tt/word
hdfs://mycluster/user/tt/k1
standalone cluster模式 bin/spark-submit
--master spark://node05:7077
--deploy-mode cluster
--class com.my.StreamingT
/root/WordCount.jar
hdfs://mycluster/user/tt/word
hdfs://mycluster/user/tt/k1
可能出现错误: UnknownHostException: mycluster
Caused by: java.lang.IllegalArgumentException: java.net.UnknownHostException: mycluster
at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:374)
at org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:312)
at org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:178)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:665)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:601)
原因 : 找不到hadoop的hdfs-site.xml和core-site.xml Spark Standalone模式读取HA模式下的HDFS 解决1 : 代码设置hadoop参数var sc = new SparkContext(conf)
//core-site.xml 配置hdfs-site.xml的逻辑入口
sc.hadoopConfiguration.set("fs.defaultFS", "hdfs://mycluster")
//hdfs-site.xml
sc.hadoopConfiguration.set("dfs.nameservices", "mycluster")
sc.hadoopConfiguration.set("dfs.ha.namenodes.mycluster", "nn1,nn2")
//逻辑映射nn1
sc.hadoopConfiguration.set("dfs.namenode.rpc-address.mycluster.nn1", "node04:8020")
//逻辑映射nn2
sc.hadoopConfiguration.set("dfs.namenode.rpc-address.cdhservice.nn2", "node05:8020")
sc.hadoopConfiguration.set("dfs.client.failover.proxy.provider.mycluster", "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider")
解决2 : 代码设置文件路径val sc = spark.sparkContext
sc.hadoopConfiguration.addResource("路径/core-site.xml")
sc.hadoopConfiguration.addResource("路径/hdfs-site.xml")
基于spark on yarn提交任务 准备 start-yarn.sh启动yarn
yarn-daemon.sh start resourcemanager 如果RM没启动 , 使用这个命令启动
提交 yarn-cluster bin/spark-submit
--master yarn-clust
--class com.my.StreamingT
/opt/WordCount.jar
hdfs://mycluster/user/tt/word
hdfs://mycluster/user/tt/kkk
--master yarn-clust
等同
--master yarn
--deploy-mode cluster
提交 yarn-client --master yarn
--deploy-mode client
其他参数 --master master 的地址,提交任务到哪里执行,例如 spark://host:port, yarn, local
--deploy-mode 在本地 (client) 启动 driver 或在 cluster 上启动,默认是 client
--class 应用程序的主类,仅针对 java 或 scala 应用
--name 应用程序的名称
--properties-file 加载的配置文件,默认为 conf/spark-defaults.conf
--driver-memory Driver内存,默认 1G
--driver-java-options 传给 driver 的额外的 Java 选项
--driver-library-path 传给 driver 的额外的库路径
--driver-class-path 传给 driver 的额外的类路径
--driver-cores Driver 的核数,默认是1。在 yarn 或者 standalone 下使用
--executor-memory 每个 executor 的内存,默认是1G
--total-executor-cores 所有 executor 总共的核数。仅仅在 mesos 或者 standalone 下使用
--num-executors 启动的 executor 数量。默认为2。在 yarn 下使用
--executor-core 每个 executor 的核数。在yarn或者standalone下使用
--jars 用逗号分隔的本地 jar 包,设置后,这些 jar 将包含在 driver 和 executor 的 classpath 下
--packages 包含在driver 和executor 的 classpath 中的 jar 的 maven 坐标
--exclude-packages 为了避免冲突 而指定不包含的 package
--repositories 远程 repository
--conf PROP=VALUE
指定 spark 配置属性的值,
例如 -conf spark.executor.extraJavaOptions="-XX:MaxPermSize=256m"
测试是否成功