Spark第一个程序开发WordCount
Java版本
package cn.spark.java.core;
import java.util.Arrays;
import java.util.Iterator;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;
/**
 * zgf
 * java本地测试WordCount程序
 */
public class WordCountJavaLocal {
    public static void main(String[] args) {
        //编写spark程序
        //本地执行
        
        //第一步,创建SparkConf对象,设置spark应用的配置信息
        SparkConf conf = new SparkConf()
                .setAppName("WordCountJavaLocal")
                //设置Master(),可以设置spark程序要连接的spark集群的master节点的url
                //val conf = new SparkConf().setAppName("WordCount").setMaster("spark://master:7077")  // 运行在集群中
                //若果设置成local则代表在本地运行
                .setMaster("local");
                
        //第二步,设置JavaSparkContext对象
        /*
        SparkContext 是spark程序的所有功能的入口,(java,scala,Python)都需要SparkContext,
        他的主要作用是,包括初始化一些spark程序的核心组件,(调度器DAGScheduler,taskScheduler);
        还会到spark的master节点上进行注册。。。。
        通过传入SparkConf实例来定制Spark运行的具体参数和配置信息
         -java(JavaSparkContext)-scala(原生SparkContext) -sql(SQLContext,HiveContext) -Streaming(原生)
         */
        JavaSparkContext sc = new JavaSparkContext(conf);
        
        /*
        第三步
         根据具体的数据来源(HDFS、 HBase、Local FS、DB、 S3等)通过SparkContext来创建RDD
      RDD 的创建基本有三种方式: 根据外部的数据来源(例如HDFS)、根据Scala集合使用SparkContext的parallelize方法、
       由其他的RDD操作产生
       数据会被RDD划分成为一系列的Partitions,分配到每个Partition的数据属于一个Task的处理范畴
        输入源(hdfs,本地、、),创建一个初始 的RDD
        输入源中的数据会被打散,分配到RDD的每一个partition中,从而形成初始的RDD
        SparkContext中,用于根据文件类型的输入源创建的RDD的方法,叫做textFile()
        java中,创建普通的rdd,都是JavaRDD
         */
        JavaRDD<String> lines = sc.textFile("C://test001.txt");
        
        /*
        第四步,对初始的RDD进行transformation操作,计算操作
        将每一行拆成单词
        */
        JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
            private static final long serialVersionUID = 1L;
            public Iterator<String> call(String line) throws Exception {
                return Arrays.asList(line.split(" ")).iterator();
            }
        });
        /*
        将单词映射为(单词,1)的格式
        只有这样才能操作后面的reduceBykey,将单词的出现个数累加
        mapTopair是将每个单词元素映射为(v1,v2)的tuple2类型的元素
        tuple2就是scala类型
        mapToPair算子,需要配合PairFunction使用,第一个参数泛型是输入类型
        第二个,第三个参数是输出Tuple2类型
        */
        JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
            private static final long serialVersionUID = 1L;
            public Tuple2<String, Integer> call(String word) throws Exception {
                return new Tuple2<String, Integer>(word, 1);
            }
        });
       /*
       以单词作为key,统计单词出现的次数
       reduceByKey算子,对每个key对应的value,都进行reduce操作
      (hello,1)(world,1)(hello,1)(hello,1)....
       例:hello:首先,1+1+2;然后在2+1=3
       最后返回JavaPairRDD的元素,也是tuple,(key,value)
        */
        JavaPairRDD<String, Integer> wordCounts = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
            private static final long serialVersionUID = 1L;
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });
        /*
        action操作(一个程序只有transformation操作(flatmap,mapTopair,reduceBykey)是不会执行的)
        foreach操作来触发程序执行
         */
        wordCounts.foreach(new VoidFunction<Tuple2<String, Integer>>() {
            private static final long serialVersionUID = 1L;
            public void call(Tuple2<String, Integer> wordCount) throws Exception {
                System.out.println(wordCount._1 + "------" + wordCount._2 + "times.");
            }
        });
        sc.close();
    }
}
Scala版本
package SparkStudy
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
  * @author: zgf
  * scala 测试WordCount程序
  */
object WordCount {
  def main(args: Array[String]): Unit = {
    //设置Spark配置
    val conf: SparkConf = new SparkConf().setAppName("WordCount") //.setMaster("local[*]")
    //创建Spark上下文
    val sc: SparkContext = new SparkContext(conf)
    //读取输入数据
    val lines = sc.textFile(args(0))
    //处理数据
    val words: RDD[String] = lines.flatMap(_.split(" ")).filter(word => word != " ")//拆分单词,并过滤掉空格,当然还可以继续进行过滤,如去掉标点符号
    val pair: RDD[(String, Int)] = words.map((_, 1)) // 在单词拆分的基础上对每个单词实例计数为1, 也就是 word => (word, 1)
    val reduced: RDD[(String, Int)] = pair.reduceByKey(_ + _)  // 在每个单词实例计数为1的基础之上统计每个单词在文件中出现的总次数, 即key相同的value相加
//  val wordscount = pairs.reduceByKey((v1, v2) => v1 + v2)  
    val ans = reduced.sortBy(_._2, false)
    ans.saveAsTextFile(args(1))
    //    println(ans.collect().toBuffer)
    //关闭释放资源
    sc.stop()
  }
}
scala的简洁强大啊!!!!!
程序集群提交
如果运行在集群中,需要将程序打包成jar包,使用spark提供的spark-submit提交到集群
spark-submit --class SparkStudy.WordCount --master spark://master:7077 --executor-memory 1g --total-executor-cores 2 /root/bigdata/sparkdemo/SparkDemo-1.0-SNAPSHOT.jar hdfs://master:8020/test001.txt hdfs://master:8020/output
| - - 参数名 | 参数说明 | 
|---|---|
| –class | 应用程序的主入口类,仅针对 java 或 scala 应用 | 
| –master | master 的地址, 集群的master URL,例如 spark://host:port, yarn, local | 
| –executor-memory | 每个 executor 的内存,默认是1G | 
| –executor-core | 每个 executor 的核数。在yarn或者standalone下使用 | 


(写了好久了,保存学习复习笔记!!!仅供参考!!!)
来源:CSDN
作者:肆无忌惮Neo
链接:https://blog.csdn.net/qq_42316200/article/details/98364613