Spark第一个程序开发----WordCount

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 应用
–mastermaster 的地址, 集群的master URL,例如 spark://host:port, yarn, local
–executor-memory每个 executor 的内存,默认是1G
–executor-core每个 executor 的核数。在yarn或者standalone下使用

在这里插入图片描述
在这里插入图片描述
(写了好久了,保存学习复习笔记!!!仅供参考!!!)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值