如何构建第一个Spark项目代码

如何构建第一个Spark项目代码


环境准备

本地环境

  1. 操作系统
    Window7/Mac
  2. IDE
    IntelliJ IDEA Community Edition 14.1.6
    下载地址
  3. JDK 1.8.0_65
    下载地址
  4. Scala 2.11.7
    下载地址

其它环境

  1. Spark:1.4.1
    下载地址
  2. Hadoop Yarn:Hadoop 2.5.0-cdh5.3.2

IDE项目创建

新建一个项目

  1. New Project
    如图
  2. 使用Maven模型创建一个Scala项目
    如图
  3. 填写自己的GroupId、ArtifactId,Version不需要修改,Maven会根据GroupId生成相应的目录结构,GroupId的取值一般为a.b.c 结构,ArtifactId为项目名称。之后点击next,填写完项目名称和目录,点击finish就可以让maven帮你创建Scala项目
    这里写图片描述
    项目创建完成后,目录结构如下
    这里写图片描述
    4.为项目添加JDK以及Scala SDK
    点击File->Project Structure,在SDKS和Global Libraries中为项目配置环境。
    这里写图片描述
    至此整个项目结构、项目环境都搭建好了

编写主函数

主函数的编写在 projectName/src/main/scala/…/下完成,如果按照上述步骤完成代码搭建,将在目录最后发现

MyRouteBuild
MyRouteMain

这两个文件为模块文件,删除MyRouteBuild,重命名MyRouteMainDirectKafkaWordCount。这里,我使用Spark Streaming官方提供的一个代码为实例代码,代码如下

package org.apache.spark.examples.streaming

import kafka.serializer.StringDecoder

import org.apache.spark.streaming._
import org.apache.spark.streaming.kafka._
import org.apache.spark.SparkConf

object DirectKafkaWordCount {
  def main(args: Array[String]) {
    if (args.length < 2) {
      System.err.println("...")
      System.exit(1)
    }
    //StreamingExamples.setStreamingLogLevels()

    val Array(brokers, topics) = args

    val sparkConf = new SparkConf().setAppName("DirectKafkaWordCount")
    val ssc = new StreamingContext(sparkConf, Seconds(2))

    // Create direct kafka stream with brokers and topics
    val topicsSet = topics.split(",").toSet
    val kafkaParams = Map[String, String]("metadata.broker.list" -> brokers)
    val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
      ssc, kafkaParams, topicsSet)

    // Get the lines, split them into words, count the words and print
    val lines = messages.map(_._2)
    val words = lines.flatMap(_.split(" "))
    val wordCounts = words.map(x => (x, 1L)).reduceByKey(_ + _)
    wordCounts.print()

    // Start the computation
    ssc.start()
    ssc.awaitTermination()
  }
}

将代码最上面的package org.apache.spark.examples.streaming,替换为DirectKafkaWordCount里的package部分即可。并覆盖DirectKafkaWordCount文件。
至此Spark处理代码已经编写完成。

修改pom.xml,为项目打包做准备

pom.xml中编写了整个项目的依赖关系,这个项目中我们需要导入一些Spark Streaming相关的包。

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-core_2.10</artifactId>
  <version>1.4.1</version>
</dependency>
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-streaming-kafka_2.10</artifactId>
  <version>1.4.1</version>
</dependency>
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-streaming_2.10</artifactId>
  <version>1.4.1</version>
</dependency>

<!-- scala -->
<dependency>
  <groupId>org.scala-lang</groupId>
  <artifactId>scala-library</artifactId>
  <version>2.10.4</version>
</dependency>

除此之外,如果需要把相关依赖打包到最终JAR包中,需要在pom.xmlbulid标签中写入以下配置:

<plugins>
      <!-- Plugin to create a single jar that includes all dependencies -->
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.0.2</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>

      <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>scala-compile-first</id>
            <phase>process-resources</phase>
            <goals>
              <goal>add-source</goal>
              <goal>compile</goal>
            </goals>
          </execution>
          <execution>
            <id>scala-test-compile</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>      
    </plugins>

pom.xml文件修改完成后,即可开始maven打包,操作如图:
这里写图片描述
点击右侧弹出窗口的Execute Maven Goal,在command line中输入clean package
这里写图片描述

Spark作业提交

在项目projectname/target目录下即可找到两个jar包,其中一个仅包含Scala代码,另一个包含所有依赖的包。
jar包导到Spark服务器,运行Spark作业,运行操作如下

../bin/spark-submit –master yarn-client –jars ../lib/kafka_2.10-0.8.2.1.jar –class huochen.spark.example.DirectKafkaWordCount sparkExample-1.0-SNAPSHOT-jar-with-dependencies.jar kafka-broker topic

利用spark-submit把任务提交到Yarn集群,即可看到运行结果。

Q&A

  1. 带有依赖的jar包有80+M,似乎加上了许多没用的依赖包,这是正常情况还是由于pom.xml配置错误导致的?

Reference

Spark Streaming + Kafka Integration Guide
http://spark.apache.org/docs/1.4.1/streaming-kafka-integration.html
Running Spark on YARN
http://spark.apache.org/docs/1.4.1/running-on-yarn.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是对于“spark实时项目第二天-代码开发之消费kafka|redis去重|建立模板将数据保存到es中”的回复: 这个项目的第二天是关于代码开发的,主要包括消费kafka、使用redis进行去重、以及将数据保存到es中。具体来说,我们需要编写代码来实现以下功能: 1. 从kafka中消费数据:使用spark streaming来消费kafka中的数据,可以使用kafkaUtils.createDirectStream()方法来创建一个DStream对象。 2. 使用redis进行去重:在消费数据之前,我们需要先将数据进行去重,以避免重复处理。可以使用redis来实现去重功能,具体来说,我们可以将每条数据的唯一标识(比如说id)存储到redis中,然后在消费数据时,先判断该数据的唯一标识是否已经存在于redis中,如果存在,则说明该数据已经被处理过,可以直接跳过;否则,说明该数据是新的,需要进行处理。 3. 将数据保存到es中:最后,我们需要将处理后的数据保存到es中,以便后续的分析和查询。可以使用elasticsearch-hadoop库来实现将数据保存到es中的功能,具体来说,我们可以将每条数据转换成一个json格式的字符串,然后使用saveJsonToEs()方法将数据保存到es中。 以上就是这个项目第二天的主要内容,需要注意的是,代码开发需要结合具体的业务场景和数据特点来进行,因此具体的实现方式可能会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值