在win平台用scala语言并在IDEA中进行Spark编程,然后利用IDEA中的sbt插件进行打包,把打包好的jar包扔到Spark集群中运行。
安装前的准备:确保你有一个可以访问的Spark集群,一个安装好的IntelliJ IDEA。
SBT_HOME=D:\sbt
再在系统变量的PATH中添加
%SBT_HOME%\bin
-Dsbt.boot.directory=D:/sbt/.sbt/boot
-Dsbt.ivy.home=D:/sbt/.ivy2
-Dsbt.global.base=D:/sbt/.sbt
-Dsbt.repository.config=D:/sbt/conf/repo.properties
[repositories]
local
ali:http://maven.aliyun.com/nexus/content/repositories/central/
File->Settings->搜索Plugins,在插件中搜索scala和sbt进行安装
def main(args: Array[String]): Unit = {
println("打包成功!")
}
点击左上角“+”号,选择sbt Task
修改Name,这个自己设置即可
Tasks项输入:~run
修改VM parameters的内容:把/sbt/conf/sbtconfig.txt中的以-Dsbt开头的内容加进去
运行输出结果如下:
可以看出,程序运行成功。打包好的jar包在\target\scala-2.11\testsbt_2.11-0.1.jar
把这个jar上传至spark集群的机器上,如果你的windows能够访问spark集群,利用xshell工具,连接上spark集群,利用命令$>rz 上传jar包。上传至的目录就是输入rz命令的当前目录。
/soft/spark/bin/spark-submit --class test /soft/spark/mycode/testsbt_2.11-0.1.jar
它的意思是先进入到spark/bin目录下找到spark-submit命令,然后设置–class为我们jar包中的test类,然后指定jar包的位置
可以看出,我们刚才打包好的jar包 已经可以在spark集群中运行了。
libraryDependencies +="org.apache.spark" % "spark-core_2.11" % "2.3.2" % "provided"
修改完后点击右下角的“Import Changes”,等待加载依赖包。
import org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkConf, SparkContext}
object wordCount {
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
val inputFile = "/user/wordcount/words.txt" //hdfs文件访问
val conf = new SparkConf().setAppName("wordCount").setMaster("local[2]")
val sc = new SparkContext(conf)
val textFile = sc.textFile(inputFile)
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
wordCount.foreach(println)
}
}
代码是统计hadoop中的hdfs文件系统中的一个words.txt中的词频。
/soft/spark/bin/spark-submit --class wordCount /soft/spark/mycode/testsbt_2.11-0.1.jar
可以看到运行结果。
val lines = sc.textFile("hdfs://localhost:8020/user/hadoop/words.txt") //这个端口号是自己设定的
val lines = sc.textFile("/user/hadoop/words.txt")
val lines = sc.textFile("words.txt") //默认加载/user/hadoop/下的文件
使用Spark操作HBase。前提是集群中配置好了HBase,并且里面有一个名为“student”的表,属性有name、gender、age这三个。
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.8") //这个0.14.8版本号根据自己的sbt版本修改
libraryDependencies += "org.apache.hbase" % "hbase-client" % "1.1.5"
libraryDependencies += "org.apache.hbase" % "hbase-common" % "1.1.5"
libraryDependencies += "org.apache.hbase" % "hbase-server" % "1.1.5"
assemblyJarName in assembly := "BigData.jar" //指定打包的名称
test in assembly := {}
assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false)
assemblyMergeStrategy in assembly := {
case PathList("javax", "servlet", xs@_*) => MergeStrategy.first
case PathList(ps@_*) if ps.last endsWith ".class" => MergeStrategy.first
case PathList(ps@_*) if ps.last endsWith ".xml" => MergeStrategy.first
case PathList(ps@_*) if ps.last endsWith ".html" => MergeStrategy.first
case PathList(ps@_*) if ps.last endsWith ".properties" => MergeStrategy.first
case "application.conf" => MergeStrategy.concat
case "unwanted.txt" => MergeStrategy.discard
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
修改完后,Import Changes以下,如果有错误,回去修改assembly.sbt中的版本号。
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.hadoop.hbase.util.Bytes
import org.apache.log4j.{Level, Logger}
object SparkOperateHBase {
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
Logger.getLogger("org.apache.hadoop.hbase").setLevel(Level.ERROR)
val conf = HBaseConfiguration.create()
val sc = new SparkContext(new SparkConf())
//设置查询的表名
conf.set(TableInputFormat.INPUT_TABLE, "student")
val stuRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],
classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
classOf[org.apache.hadoop.hbase.client.Result])
val count = stuRDD.count()
println("Students RDD Count: " + count)
stuRDD.cache()
//遍历输出
stuRDD.foreach({ case (_, result) =>
val key = Bytes.toString(result.getRow)
val name = Bytes.toString(result.getValue("info".getBytes, "name".getBytes))
val gender = Bytes.toString(result.getValue("info".getBytes, "gender".getBytes))
val age = Bytes.toString(result.getValue("info".getBytes, "age".getBytes))
println("Row key:" + key + " Name:" + name + " Gender:" + gender + " Age:" + age)
})
}
}
sbt assembly
带有依赖的jar包打包已经完成!此时去文件夹中找到BigData.jar,会发现大小变大了不少,30+M,不带jar包的才几K。