IDEA下Spark的开发(DT大数据梦工厂)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDEA下Spark的开发(DT大数据梦工厂)相关的知识,希望对你有一定的参考价值。

IDEA越使用效果越好,快捷键方便,阅读源码方便

一般阅读Spark或者Scala的源码都采用IDEA使用

下载IDEA最新版本的社区版本即可,

安装的时候必须安装Scala,这个过程是IDEA自动化的插件管理,所以点击后会自动下载(跳过在setting plugins里面也可以安装)

本地JAVA8和Scala2.10.4软件套件的安装和Eclipse不同

打开

技术分享

打开之后点击File->Project Structure来设置工程的Libraries 核心是添加Spark的jar依赖

技术分享

技术分享

代码拷贝过来,alt+Enter自动导入

集群模式

在生产环境下,一定是通过写自动化shell脚本来自动提交程序的

package com.dt.spark

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext


/**
 * 使用Scala开发集群测试的spark wordcount程序
 * @author DT_大数据梦工厂
 * 新浪微博:http://weibo.com/ilovepains
 * */
object WordCount_Cluster {
  def main(args:Array[String]){
    /**
     * 1、创建Spark配置对象SparkConf,设置Spark程序的运行时的程序配置信息
     * 例如:通过setMaster来设置程序要连接的Spark集群的url,
     * 如果设置为local,则代表Spark程序在本地运行,特别适合于机器配置条件非常差(例如只有1G的内存)的初学者
     */
   
    val conf = new SparkConf()//创建SparkConf对象
    conf.setAppName("My First Spark App In IDEA!")//设置应用程序的名称,在程序运行的监控界面可以看到名称
    //conf.setMaster("spark://Master:7077")//此时必须要运行在Master:7077上,之后运行可手工配置
   
    /**
     * 2、创建SparkContext对象
     * SparkContext是Spark程序所有功能的唯一入口,无论采用Scala、Java、Python、R等都必须要
     * SparkContext核心作用:初始化Spark应用程序所运行所需要的核心组件,包括DAGScheduler、TaskScheduler、SchedulerBackend
     * 同时还会负责Spark程序往Master注册程序等
     * SparkContext是整个Spark应用程序中最为至关重要的一个对象
     */
    val sc = new SparkContext(conf)//通过创建SparkContext对象,通过传入SparkConf实例来定制Spark运行的具体参数和配置信息
   
    /**
     * 3、根据具体的数据来源(HDFS、HBase、Local FS、DB、S3等)通过SparkContext来创建RDD
     * RDD创建基本有三种方式:根据外部的数据来源(例如HDFS),根据Scala集合、由其它的RDD操作
     * 数据会被RDD划分成为一系列的Partitions,分配到每个Partition的数据属于一个Task的处理范畴
     */
    //sc.textFile(文件路径,最小并行度)
    //val lines: RDD[String],通过类型推断得到lines是String类型的RDD
    //val lines = sc.textFile("/library/wordcount/input/Data", 1)//读取HDFS文件,并切分成不同的Partition
    val lines = sc.textFile("/historyserverforSpark/README.md"1)
   
   
    /**
     * 4、对初始的RDD进行transformation级别的处理,例如map、filter等高阶函数的编程,来进行具体的数据计算
     * 4.1、将每一行的字符串拆分成单个的单词
     */
   
    val words = lines.flatMap { line => line.split(" ") }//对每一行的字符串进行单次拆分并把所有行的拆分结果通过flat合并成一个大的单次集合
   
    /**
     * 4.2、在单词拆分的基础上对每个单词实例计数为1,也就是word=>(word,1)
     */
    val pairs = words.map { word => (word,1) }//其实编程了Tuple  (word,1)
   
    /**
     * 4.3、在每个单词实例计数为1的基础上统计每个单词在文件中出现的总次数
     */
    val wordCountsOrdered = pairs.reduceByKey(_+_).map(pair=>(pair._2,pair._1)).sortByKey(false).map(pair=>(pair._2,pair._1))//对相同的key,进行value的累加(包括local和Reducer级别同时reduce
   
    //集群中wordCounts.collect,是把集群中所有的结果搜集到driver上面
    wordCountsOrdered.collect.foreach(wordNumberPair=>println(wordNumberPair._1+":"+wordNumberPair._2))
   
    /**
     * 5、释放相关资源
     */
    sc.stop()
  }
}

额外:Spark开发不建议直接打包到集群,原因为:

1、内存和cores的限制,默认情况下Spark程序的driver会在提交Spark程序的机器上,所以如果在IDE中提交程序的话,那IDE机器就必须非常强大;

2、driver要指挥Workers的运行并频繁的发生通讯,如果开发IDE和Spark集群不在同一个网络下,就会出现任务丢失、运行缓慢等多种不必要的问题;

3、这是不安全的;

一般情况下会有专门和集群下Worker同样配置的机器,在这台机器上进行程序的开发和提交

在IDEA中打包程序

File->Project Structure->Artifacts(手动)->jar->From modules with dependencies...

技术分享

特别注意把Spark和Scala的jar去除,因为1、包很大;2、实际运行,会自动去集群环境找

技术分享

build->build Artifacts

技术分享

技术分享

王家林老师名片:

中国Spark第一人

新浪微博:http://weibo.com/ilovepains

微信公众号:DT_Spark

博客:http://blog.sina.com.cn/ilovepains

手机:18610086859

QQ:1740415547

邮箱:[email protected]


以上是关于IDEA下Spark的开发(DT大数据梦工厂)的主要内容,如果未能解决你的问题,请参考以下文章

底层战详解使用Java开发Spark程序(DT大数据梦工厂)

Eclipse下开发Scala(DT大数据梦工厂)

SparkRDD解密(DT大数据梦工厂)

Spark运行原理和RDD解析(DT大数据梦工厂)

Spark Sort-Based Shuffle内幕彻底解密(DT大数据梦工厂)

Spark内核架构解密(DT大数据梦工厂)