看spark和scala版本

运行spark-shell

Welcome to

____ __

/ __/__ ___ _____/ /__

_\ \/ _ \/ _ `/ __/ '_/

/___/ .__/\_,_/_/ /_/\_\ version 1.6.0

/_/

 

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_181)

得到spark版本1.6.0,scala版本2.10.5

 

下载安装特定版本的scala

https://www.scala-sbt.org/download.html

 

 

下载特定版本的spark包

https://archive.apache.org/dist/spark/

spark-1.6.0.tgz

其中examples是示例代码

 

开发

idea的scala插件安装参见Scala 写第一个程序HelloWorld

idea新建Project,选择Scala——sbt,输入名称目录,注意版本选择与spark的scala相同版本。

build.sbt添加依赖,此处版本要求与spark版本相同

libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.6.0"

src/main/scala右击新建Package:com.whq.test

右击包,新建Scala Class选择Kind为Object,名称为Hi,代码如下

package com.whq.test

import org.apache.spark.{SparkConf, SparkContext}

object HdfsWordCount {
  def main(args: Array[String]) {
    if (args.length < 2) {
      System.err.println("Usage: HdfsWordCount <directory>")
      System.exit(1)
    }
    val inputFile=args(0)
    val outputFile=args(1)

    val conf = new SparkConf().setAppName("wordCount")
    // Create a Scala Spark Context.
    val sc = new SparkContext(conf)
    // Load our input data.
    val input =  sc.textFile(inputFile)
    // Split up into words.
    val words = input.flatMap(line => line.split(" "))
    // Transform into word and count.
    val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}
    // Save the word count back out to a text file, causing evaluation.
    counts.saveAsTextFile(outputFile)
  }

}

统计分组信息。

右侧sbt点sbt tasks中的package,打包后的文件拷贝到服务器上准备运行。

 

su - hdfs

vi hello.txt添加内容

you,jump

i,jump

you,jump

i,jump

jump

 

提交到spark目录下

hdfs dfs -put hello.txt /spark/

清空目标目录

hdfs dfs -rm -r /spark/out

 

提交运行

spark-submit --master yarn --deploy-mode client --class com.whq.test.HdfsWordCount sparksbt_2.10-0.1.jar /spark/hello.txt /spark/out

 

结果会输出到hdfs的/spark/out目录中

查看结果命令

hdfs dfs -cat /spark/out/_SUCCESS
hdfs dfs -cat /spark/out/part-00000
hdfs dfs -cat /spark/out/part-00001

 

 

Spark常用接口

常用接口

Spark主要使用到如下这几个类:

  • SparkContext:是Spark的对外接口,负责向调用该类的java应用提供Spark的各种功能,如连接Spark集群,创建RDD等。
  • SparkConf:Spark应用配置类,如设置应用名称,执行模式,executor内存等。
  • RDD(Resilient Distributed Dataset):用于在Spark应用程序中定义RDD的类。
  • PairRDDFunctions:为key-value对的RDD数据提供运算操作,如groupByKey。
  • Broadcast: 广播变量类。广播变量允许保留一个只读的变量,缓存在每一台机器上,而非每个任务保存一份拷贝。
  • StorageLevel: 数据存储级别,有内存(MEMORY_ONLY),磁盘(DISK_ONLY),内存+磁盘(MEMORY_AND_DISK)等。

RDD上支持两种类型的操作: :transformation和action,这两种类型的常用方法如下。

表 transformation

方法

说明

map(func)

对调用map的RDD数据集中的每个element都使用func。

filter(func)

对RDD中所有元素调用func,返回f为true的元素。

flatMap(func)

先对RDD所有元素调用func,然后将结果扁平化。

sample(withReplacement,faction,seed)

抽样。

union(otherDataset)

返回一个新的dataset,包含源dataset和给定dataset的元素的集合。

distinct([numTasks])

去除重复元素。

groupByKey(numTasks)

返回(K,Iterable[V]),将key相同的value组成一个集合。

reduceByKey(func,[numTasks])

对key相同的value调用func。

sortByKey([ascending],[numTasks])

按照key来进行排序,是升序还是降序,ascending是boolean类型。

join(otherDataset,[numTasks])

当有两个KV的dataset(K,V)和(K,W),返回的是(K,(V,W))的dataset,numTasks为并发的任务数。

cogroup(otherDataset,[numTasks])

当有两个KV的dataset(K,V)和(K,W),返回的是(K,Seq[V],Seq[W])的dataset,numTasks为并发的任务数。

cartesian(otherDataset)

笛卡尔积。

表 action

API

说明

reduce(func)

对RDD中的元素调用func。

collect()

返回包含RDD中所有元素的一个数组。

count()

返回的是dataset中的element的个数。

first()

返回的是dataset中的第一个元素。

take(n)

返回前n个elements。

takeSample(withReplacement,num,seed)

takeSample(withReplacement,num,seed)对dataset随机抽样,返回有num个元素组成的数组。withReplacement表示是否使用replacement。

saveAsTextFile(path)

把dataset写到一个text file中,或者hdfs,或者hdfs支持的文件系统中,spark把每条记录都转换为一行记录,然后写到file中。

saveAsSequenceFile(path)

只能用在key-value对上,然后生成SequenceFile写到本地或者hadoop文件系统。

countByKey()

对每个key出现的次数做统计。

foreach(func)

在数据集的每一个元素上,运行函数func。

countByValue()

对RDD中每个元素出现的次数进行统计。