9 스파크가 처리하는 구성 요소를 학습 데이터를 스트리밍 스트리밍 스파크 학습

관련 개념을 SparkStreaming

개요

실시간 웹 로그 분석, 실시간 추적 페이지 뷰 및 기타 통계 : 주로 같은 스트리밍 데이터의 실시간 처리에 사용 SparkStreaming.
데이터 흐름의 특성은 :

  • 데이터는 항상 변화
  • 데이터 롤백 할 수 없습니다
  • 데이터는 항상 홍수한다

스파크 스트리밍 데이터를 스트리밍 프레임 워크 스파크 확장 가능한 실시간 높은 처리량 처리를 기반으로, 데이터는 다양한 소스, 예를 들어, 카프카, 수로, 트위터, ZeroMQ TCP 소켓 등으로 할 수있다. 이 프레임 워크에서 다양한 계산은지도와 같은 스트리밍 데이터를 지원하기 위해, 감소의이 같은 가입 할 수 있습니다. 데이터를 처리 한 후 파일 시스템 또는 데이터베이스에 저장 될 수있다.

스트리밍 가이드 틀도 같은 주어진다, 데이터 스트림 소스는 왼쪽에, 오른쪽은 처리 후의 출력 데이터 저장 대상이다.

여전히 일을 sparkStreaming 곳 즉, 애플리케이션에서 사용하기 전에 파일 시스템을 HDFS.

기본 데이터 SparkStreaming 추상적 인 d 스트림

이 성분은 기본 데이터 추상화 d 스트림, 그 중국 의미 스파크 자체에 대한 RDD 같은 "이산 흐름"SparkStreaming하는 개념이다.
이 시간의 경과를 나타내는 데이터 소스 입력 데이터 스트림으로부터 수신 될 수있는 연속 데이터 스트림으로 스트림 처리 된 입력 데이터 스트림을 변환함으로써 생성 될 수있다. 그 내부에는, d 스트림이 연속 RDD 시리즈로 표시되는 각 RDD 특정 시간 간격 데이터를 포함한다.

모든 변환 연산은 RDD d 스트림 동작의 바닥에 적용된다. 여기에, 다음, 워드 d 스트림에 d 스트림 전체 "라인"에, 수술 후이 lineDStream flatMap을했던 "라인"RDD 모든 순간부터 lineDStream와 양식을 볼 수있는 튜토리얼 이미지의 예는, 실제입니다 이것은 각 기본 RDD flatMap 각 단어에 유일한 RDD 달성마다 변환되는 대응하는 시간이다.

처리 모드

최하위 레벨에서, 사용 된 스트림 데이터를 데이터 스트리밍 스파크를 처리하는 방법은 시간이 배치 모드에서 유사한 과정을 통해, 작은 데이터 세그먼트들로 데이터 세그먼트를 분리한다.
연속 데이터 지속성, 개별 및 일괄 처리 : 전체에 관한 한, 그것은 아이디어 스파크 스트리밍을 처리하는 것입니다.

  • 데이터 지속성 : 상기 수신 된 데이터를 일시적으로 다시 소스 데이터를 처리하기위한 유지 때 에러 처리되도록, 저장
  • 이산 : 저장 데이터의 특정 시간 구간에 사용 (I 함께 이때 d 스트림은 이산 RDD d 스트림은 데이터 스트림을 수신하는 매 순간이 이해가된다)
  • 배치 프로세싱 다음 RDD 일괄 처리 모드 데이터

d 스트림 다시 전환 동작 및 동작의 두 가지 방법의 출력 동작을 제공 RDD 패키지에 대응한다.

작동 과정의 자세한 사항

StreamingContext

이것은 Sparkcontext는 RDD를 제공하는 (SC)를 개체 전에이 Context 오브젝트뿐만 아니라 데이터로서 d 스트림 생성 및 변형을 수신하여 처리하는 기능을 제공하는 것과 같은 기능을 조작은 "스트림 데이터"텍스트 오브젝트이다. 아니 StreamingContext 개체는 이러한 기능을 사용할 수 없습니다.

StreamingContext 개체 만들기

import org.apache.spark._
import org.apache.spark.streaming._

val conf = new SparkConf().setAppName(appName).setMaster(master) 
val ssc = new StreamingContext(conf, Seconds(1)) //这里把conf配置对象传给对应的方法

조작을 위해 RDD는 RDD를 조작하는 SparkContext를 사용하는 필요, 그것은 내부 StreamingContext이 SparkContext 생성 알아야 할 경우, sparkContext을 사용하는 것입니다
전화를 점 기호를 호출하는 것입니다

ssc.sparkContext

StreamingContext 주 사용

  • 사용자 정의 데이터 소스 DStreams 만들기
  • 사용 변환 작업 및 출력 DStreams
  • 데이터 수신 : StreamingContext.start ()
  • 보류 결과 : StreamingContext.awaitTermination ()
  • 프로그램 정지 : StreamingContext.stop ()

입력 소스

각 입력 DStreams (데이터 소스), 파일 스트림 외에, 수신기 (리시버) 객체와 관련된 수신기는 오브젝트 데이터 소스를 수신하여 메모리에 저장되어있다.

스파크 스트리밍은 두 가지 유형을 제공하는 내장 데이터 소스 :

기본 데이터 소스. StreamingContext는 파일 시스템, 소켓 커넥터, Akka 같이 API에서 직접 사용할 수 있습니다. 단순한 파일의 경우, 치료의 textFileStream streamingContext의 방법을 사용할 수 있습니다.
고급 데이터 소스. 예 플룸 카프카, 운동성, 트위터 및 기타 도구의 데이터 소스로 사용될 수있다. 이러한 데이터 소스를 사용하여 의존 대응 필요

이 변환을 d 스트림

d 스트림의 비 작동 상태로 변환 및 이가지 상태.

상태 비 변환 작업

데이터의 각 배치는 데이터의 이전 배치에 의존하지 않는다.

변환 작업 의미
지도 (FUNC) 새로운 기능 FUNC 따라 d 스트림을 생성
flatMap (FUNC) 유사한 방법으로지도하지만, 각각의 여러 값을 반환 할 수 있습니다. 리턴 값은 함수 FUNC의 모음
노동 조합 (otherStream) 새로운 d 스트림을 제공하는 두 개의 d 스트림 및 세트를 가지고
카운트() 모든 계산 RDD 번호 d 스트림
감소 (FUNC) 모든 RDD d 스트림은 함수 FUNC 중합 결과에 의해 계산
countByValue () 유형 K의 d 스트림은, 새로운 d 스트림을 반환하는 경우,이 새로운 d 스트림 요소 유형 (K, 롱)이며, K는 d 스트림의 원래 값이, 롱 표시 몇 번 키
reduceByKey (FUNC [numTasks]) d 스트림 키 - 값 쌍 (K, V), 및 새로운 d 스트림 K로 복귀하기위한 결합 기능 FUNC 값에서 얻어진 중합 결과 각각의 값에 이용된다
조인 (otherStream [numTasks]) 키 d 스트림의 키 d 스트림의 (K, V), (가) d 스트림을 사용하여 작업을 조인의 키 - 값 쌍 (K, W)가 생성 될 수 있다면 (K (V, W))에 근거
cogroup (otherStream [numTasks]) 동일한 방법으로 가입하지만 d 스트림의 (K, V) d 스트림, 생성의 기초 cogroup (K, W) (K, (서열 [V], 서열 [W]))의 d 스트림에 기초
변환 (FUNC) 각 RDD 기반 FUNC d 스트림의 함수 호출은 파라미터 RDD 함수 FUNC는 리턴 값도이다 RDD
updateStateByKey (FUNC) 각 키는 함수 func에 핸들 모든 이전 상태와 새로운 상태를 호출합니다 들어

이 상태 변환 액션

需要使用之前批次的数据或中间结果来计算当前批次的数据。
有状态转化操作包括 Window 操作(基于窗口的转化操作) 和 UpdateStateByKey 操作(追踪状态变化的转化操作)

  • Window操作用作把几个批次的DStream合并成一个DStream,换句话说就是把这个窗口之内的DStream变成一个DStream
    每个 window 操作都需要 2 个参数:
    window length。顾名思义,就是窗口的长度。每个 window 对应的批次数(下图中是 3,time1-time3 是一个 window, time3-time5 也是一个 window)
    sliding interval。顾名思义,窗口每次滑动的间隔。每个 window 之间的间隔时间,下图下方的 window1,window3,window5 的间隔。图中这个值为 2。

  • UpdateStateByKey 操作
    使用 UpdateStateByKey 方法需要做以下两步:
    定义状态:状态可以是任意的数据类型
    定义状态更新函数:这个函数需要根据输入流把先前的状态和所有新的状态
    不管有没有新数据进来,在每个批次中,Spark 都会对所有存在的 key 调用 func 方法,如果 func 函数返回 None,那么 key-value 键值对不会被处理。

以一个例子来讲解 updateStateByKey 方法,这个例子会统计每个单词的个数在一个文本输入流里:
runningCount 是一个状态并且是 Int 类型,所以这个状态的类型是 Int,runningCount 是先前的状态,newValues 是所有新的状态,是一个集合,函数如下:

def updateFunction(newValues: Seq[Int], runningCount: Option[Int]): Option[Int] = {
    val newCount = ...  // add the new values with the previous running count to get the new count
    Some(newCount)
}

updateStateByKey 方法的调用

val runningCounts = pairs.updateStateByKey[Int](updateFunction _)

输出操作

DStream 中的数据一般会输出到数据库、文件系统等外部系统中

输出操作 含义
print() 打印出 DStream 中每个批次的前 10 条数据
saveAsTextFiles(prefix, [suffix]) 把 DStream 中的数据保存到文本文件里。每次批次的文件名根据参数 prefix 和 suffix 生成:”prefix-TIME_IN_MS[.suffix]”
saveAsObjectFiles(prefix, [suffix]) 把 DStream 中的数据按照 Java 序列化的方式保存 Sequence 文件里,文件名规则跟 saveAsTextFiles 方法一样
saveAsHadoopFiles(prefix, [suffix]) 把 DStream 中的数据保存到 Hadoop 文件里,文件名规则跟 saveAsTextFiles 方法一样
foreachRDD(func) 遍历 DStream 中的每段 RDD,遍历的过程中可以将 RDD 中的数据保存到外部系统中

注:
foreachRDD 方法会遍历 DStream 中的每段 RDD,遍历的过程中可以将 RDD 中的数据保存到外部系统中。将数据写到外部系统通常都需要一个 connection 对象,一种很好的方式就是使用 ConnectionPool,ConnectionPool 可以重用 connection 对象在多个批次和 RDD 中。示例代码如下:

dstream.foreachRDD { rdd =>
  rdd.foreachPartition { partitionOfRecords =>
    // ConnectionPool is a static, lazily initialized pool of connections
    val connection = ConnectionPool.getConnection()
    partitionOfRecords.foreach(record => connection.send(record))
    ConnectionPool.returnConnection(connection)  // return to the pool for future reuse
  }
}

DStream 的输出操作也是延迟执行的(惰性操作),就像 RDD 的 action 操作一样。RDD 的 action 操作在 DStream 的输出操作内部执行的话会强制 Spark Streaming 执行从而获得输出。

实践(最简单的wordCount)

项目例子中我们通过实现一个 Spark Streaming 应用连接给定 TCP Socket,接收字符串数据并对数据进行 MapReduce 计算单词出现的频次。这个例子来自官方文档并做了一些修改。
Spark Streaming 上构建应用与 Spark 相似,都要先创建 Context 对象,并对抽象数据对象进行操作,Streaming 中处理的数据对象是 DStream。

创建StreamingContext对象

// 引入spark.streaming中的StreamingContext模块
import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.StreamingContext._
// 注:最后一项在Spark 1.3及其之后的版本中不是必需的

// 下面这一句在 Spark Shell 中是不必输入的,因为 Spark Context 对象在 Spark Shell 启动过程中就已经创建好
// 创建本地的SparkContext对象,包含2个执行线程,APP名字命名为StreamWordCount
// val conf = new SparkConf().setMaster("local[2]").setAppName("SteamWordCount")

// 直接通过 Spark Context 对象 sc ,创建本地的StreamingContext对象,第二个参数为处理的时间片间隔时间,设置为1秒
val ssc = new StreamingContext(sc, Seconds(1))

所以两个关键的东西就是,SparkContext对象和数据处理的时间间隔。这里把数据处理的时间间隔设置成一秒。

创建DStream对象

这里是从一个socket获取数据的,对应的指定数据源的函数是“socketTextStream”,注意这步在没有nc命令让计算机开启9999端口的监听时,也可以输入并且不会报错,原因在于在ssc.start()输入之前所有的业务逻辑或者说执行操作的代码都可以被看做是惰性的操作,只有调用了start()之后Streamingcontext才运行之前输入的表示业务逻辑的代码,也就是说,按照我们的代码,只要在start()调用之前用nc开启监听就可以让程序正确运行。

// 创建DStream,指明数据源为socket:来自localhost本机的9999端口
val lines = ssc.socketTextStream("localhost", 9999)

lines 数据源可以来自各种不同的数据源,但原理都类似,调用不同的创建函数去连接 Kafka、 Flume、HDFS/S3、Kinesis 和 Twitter 等数据源。

对DStream对象操纵

对表示每行的DStream分割成每个单词的DStream。
这个操作和之前学的对RDD的操作基本没有什么区别,最大的不同是调用flatMap方法的对象不再是一个RDD对象而是一个DStream对象。

// 使用flatMap和Split对1秒内收到的字符串进行分割
val words = lines.flatMap(_.split(" "))

然后做最简单的求和

// map操作将独立的单词映射到(word,1)元组
val pairs = words.map(word => (word, 1))

// reduceByKey操作对pairs执行reduce操作获得(单词,词频)元组
val wordCounts = pairs.reduceByKey(_ + _)

写入文件系统

// 输出文件夹的前缀,Spark Streaming会自动使用当前时间戳来生成不同的文件夹名称
val outputFile = "/tmp/ss"

// 将结果输出
wordCounts.saveAsTextFiles(outputFile)

要注意的是,到这里上面这些语句其实都还没有被执行,只有StreamingContext对象调用了start()方法,上面这些语句才作为业务逻辑不停的被执行,而且,时间间隔是调用StreamingContext对象的时候指定好的,这里就是一秒。就是说,调用了start方法之后,9999端口上监听到的数据每隔一秒就会被sparkStreaming计算一次单词数,然后保存到对应的文件系统路径下。
每隔一秒还是挺快的,我就上了个厕所


就这样了,

추천

출처www.cnblogs.com/ltl0501/p/12232332.html