铭文一级:

第8章 Spark Streaming进阶与案例实战

黑名单过滤

访问日志 ==> DStream
20180808,zs
20180808,ls
20180808,ww
==> (zs: 20180808,zs)(ls: 20180808,ls)(ww: 20180808,ww)

黑名单列表 ==> RDD
zs
ls
==>(zs: true)(ls: true)

==> 20180808,ww

leftjoin
(zs: [<20180808,zs>, <true>]) x
(ls: [<20180808,ls>, <true>]) x
(ww: [<20180808,ww>, <false>]) ==> tuple 1

第9章 Spark Streaming整合Flume

Push方式整合

Flume Agent的编写: flume_push_streaming.conf

simple-agent.sources = netcat-source
simple-agent.sinks = avro-sink
simple-agent.channels = memory-channel

simple-agent.sources.netcat-source.type = netcat
simple-agent.sources.netcat-source.bind = hadoop000
simple-agent.sources.netcat-source.port = 44444

simple-agent.sinks.avro-sink.type = avro
simple-agent.sinks.avro-sink.hostname = 192.168.199.203
simple-agent.sinks.avro-sink.port = 41414

simple-agent.channels.memory-channel.type = memory

simple-agent.sources.netcat-source.channels = memory-channel
simple-agent.sinks.avro-sink.channel = memory-channel

flume-ng agent \
--name simple-agent \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/flume_push_streaming.conf \
-Dflume.root.logger=INFO,console

hadoop000:是服务器的地址
local的模式进行Spark Streaming代码的测试 192.168.199.203

本地测试总结
1)启动sparkstreaming作业
2) 启动flume agent
3) 通过telnet输入数据,观察IDEA控制台的输出

spark-submit \
--class com.imooc.spark.FlumePushWordCount \
--master local[2] \
--packages org.apache.spark:spark-streaming-flume_2.11:2.2.0 \
/home/hadoop/lib/sparktrain-1.0.jar \
hadoop000 41414

铭文二级:

第8章 Spark Streaming进阶与案例实战

复制NetworkWordCount改成TransformApp:

1.构建黑名单

val blacks = List("zs","ls")

val blacksRDD = ssc.sparkContext.parallelize(blacks).map(x=>(x,true))

传入的数据:20180808,zs

需要构建的各种形式:(zs: 20180808,zs)(ls: 20180808,ls)(ww: 20180808,ww)

黑名单:(zs: true)(ls: true)

RDD=(zs: [<20180808,zs>, <true>]) x 
(ls: [<20180808,ls>, <true>]) x
(ww: [<20180808,ww>, <false>])

val clicklog = lines.map(x => (x.split(",")(1),x)).transform(rdd => {

  rdd.leftOuterJoin(blacksRDD)

  .filter(x => x._2._2.getOrElse(flase) != true)

  .map(x => x._2._1)

})

clicklog.print()    //打印来看看

实战:整合Spark Streaming与Spark SQL的操作

直接拷贝官方源码来测试->点击

导入相应的包

在pom.xml导入SparkSQL的依赖(将Spark Streaming的改成sql即可)

官方关键代码:

// Convert RDD[String] to RDD[case class] to DataFrame
val wordsDataFrame = rdd.map(w => Record(w)).toDF()
// Creates a temporary view using the DataFrame
wordsDataFrame.createOrReplaceTempView("words")

运行监测即可

第9章 Spark Streaming整合Flume(push与pull方式)

push方式(看官网):

一、Flume配置->二、导入依赖->三、FlumeUtils->四、spark-submit提交

一、cp exec-memory-avro.conf flume-push-streaming.conf

修改agent、source、channel、sink名称(官网点击

exec source改成netcat source因为等下从端口获取数据

type、bind、port:44444

sink改成avro sink:

type、hostname、port:41414

二、导入依赖(官网模板):

资源依赖参考对比:

Source     Artifact
Kafka spark-streaming-kafka-0-8_2.11
Flume spark-streaming-flume_2.11
Kinesis spark-streaming-kinesis-asl_2.11 [Amazon Software License]

三、FlumeUtils(参数由Edit Configurations传入)返回值为JavaReceiverInputDStream:

/**
* Spark Streaming整合Flume的第一种方式
*/
object FlumePushWordCount {
def main(args: Array[String]): Unit = {
if(args.length != 2) {
System.err.println("Usage: FlumePushWordCount <hostname> <port>")
System.exit(1)
}
val Array(hostname, port) = args
val sparkConf = new SparkConf() //.setMaster("local[2]").setAppName("FlumePushWordCount")
val ssc = new StreamingContext(sparkConf, Seconds(5))
//TODO... 如何使用SparkStreaming整合Flume
val flumeStream = FlumeUtils.createStream(ssc, hostname, port.toInt)
flumeStream.map(x=> new String(x.event.getBody.array()).trim)
.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).print()
ssc.start()
ssc.awaitTermination()
}
}

本机代码联调测试:

1、sink上的ip改成本机ip

2、本地测试的代码就修改成自己0.0.0.0,port为41414

3、启动顺序:

启动代码程序->Flume启动->telnet localhost 44444

四、spark-submit提交到生产:

打包:mvn clean package -DskipTests

可以得到路径:sparktrain-1.0.jar

传文件到虚拟机命令(仅适用于mac用户):

scp sparktrain-1.0.jar hadoop@hadoop000:~/lib

完整指令:

spark-submit \

--class com.imooc.spark.FlumePushWordCount \
--master local[2] \
--packages org.apache.spark:spark-streaming-flume_2.11:2.2.0 \
/home/hadoop/lib/sparktrain-1.0.jar \
hadoop000 41414

 

【慕课网实战】Spark Streaming实时流处理项目实战笔记十一之铭文升级版的更多相关文章

  1. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十之铭文升级版

    铭文一级: 第八章:Spark Streaming进阶与案例实战 updateStateByKey算子需求:统计到目前为止累积出现的单词的个数(需要保持住以前的状态) java.lang.Illega ...

  2. 【慕课网实战】Spark Streaming实时流处理项目实战笔记七之铭文升级版

    铭文一级: 第五章:实战环境搭建 Spark源码编译命令:./dev/make-distribution.sh \--name 2.6.0-cdh5.7.0 \--tgz \-Pyarn -Phado ...

  3. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十四之铭文升级版

    铭文一级: 第11章 Spark Streaming整合Flume&Kafka打造通用流处理基础 streaming.conf agent1.sources=avro-sourceagent1 ...

  4. 【慕课网实战】Spark Streaming实时流处理项目实战笔记二之铭文升级版

    铭文一级: 第二章:初识实时流处理 需求:统计主站每个(指定)课程访问的客户端.地域信息分布 地域:ip转换 Spark SQL项目实战 客户端:useragent获取 Hadoop基础课程 ==&g ...

  5. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十六之铭文升级版

    铭文一级: linux crontab 网站:http://tool.lu/crontab 每一分钟执行一次的crontab表达式: */1 * * * * crontab -e */1 * * * ...

  6. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十五之铭文升级版

    铭文一级:[木有笔记] 铭文二级: 第12章 Spark Streaming项目实战 行为日志分析: 1.访问量的统计 2.网站黏性 3.推荐 Python实时产生数据 访问URL->IP信息- ...

  7. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十二之铭文升级版

    铭文一级: ======Pull方式整合 Flume Agent的编写: flume_pull_streaming.conf simple-agent.sources = netcat-sources ...

  8. 【慕课网实战】Spark Streaming实时流处理项目实战笔记九之铭文升级版

    铭文一级: 核心概念:StreamingContext def this(sparkContext: SparkContext, batchDuration: Duration) = { this(s ...

  9. 【慕课网实战】Spark Streaming实时流处理项目实战笔记八之铭文升级版

    铭文一级: Spark Streaming is an extension of the core Spark API that enables scalable, high-throughput, ...

随机推荐

  1. js学习(初)

    一种弱数据类型语言  var 基础: 处理字符串的函数 数组基础操作 流程控制语句 选择,分支 循环for for in for(索引变量 in  对象){ 语句块 } 面向对象: js语言的对象就是 ...

  2. 如何利用git由本机向github上传文件 ssh方式的

    1.直接在git bash里操作,输入命令cd ~/.ssh ls 2.如果不是这样的,说明没有生产公匙,然后输入命令 ssh-keygen -t rsa -C "自己的邮箱地址" ...

  3. @params、@PathVariabl和@RequestParam用法与区别

    [1]params params: 指定request中必须包含某些参数值是,才让该方法处理. @RequestMapping(value = "testParamsAndHeaders&q ...

  4. python string tuple list dict 相互转换的方法

    dict = {'name': 'Zara', 'age': 7, 'class': 'First'}# 字典转为字符串,返回:<type 'str'> {'age': 7, 'name' ...

  5. Java使用默认浏览器打开指定URL的方法(二种方法)

    直接看代码:方法一: 复制代码 代码如下: Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler http://ww ...

  6. poj 3624 && hdu 2955(背包入门)

    http://poj.org/problem?id=3624 背包中最基础的01背包,大意是有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总 ...

  7. javascript的变量类型:var、let、const

    不同点:可变性,与作用域的关系. 可变性:const定义的变量都不可变,而var和let可以任意更改. const 只能在声明时被初始化一次,之后不允许将全新的值赋值给const变量.但可以修改con ...

  8. Oracle数据库mybatis 插入空值时报错(with JdbcType OTHER)

    参考文档: 1.https://blog.csdn.net/fishernemo/article/details/27649233 2.http://helgaxu.iteye.com/blog/21 ...

  9. BZOJ1855 股票交易 单调队列优化 DP

    描述 某位蒟佬要买股票, 他神奇地能够预测接下来 T 天的 每天的股票购买价格 ap, 股票出售价格 bp, 以及某日购买股票的上限 as,  某日出售股票上限 bs, 并且每次股票交 ♂ 易 ( 购 ...

  10. C++ 的虚析构函数

    当一个基类的指针指向一个派生类的对象,并用该基类的指针去删除或者析构派生类对象时,如果基类的析构函数不是声明为虚函数,那么在析构时基类的析构函数将会被直接调用,派生类的析构函数应为没被调用而导致内存泄 ...