入门Spark-Streaming遇到的问题

入门Spark-Streaming遇到的问题

以前没有用过spark,只是大概了解是大数据需要的框架。前几天组内需要构建一个用户模型,因为要求实时更新数据,所以只好硬着头皮去学着写了一个程序,大概两周的时间,中间遇到的问题记录如下。

一个程序一般分为数据读取→数据处理→结果输出的过程。学习一门新语言总要面对环境搭建→学习语法→写Demo熟悉→实战演练的过程。所以本文的顺序如下1、环境搭建;2、语法和Demo3、数据处理静态;4、数据计算;5、数据输出静态;6、数据处理动态;7、数据输出动态

一、Scala环境搭建和Spark单机环境搭建。

我的环境是Linux64位,Debian9


1、安装java环境。

Debian本身带的有openjava环境,但是开发的时候java环境使用orcale的比较好。版本方面没有遇到问题,我的开发机上本来有java1.8版本的。我建议安装1.7或者1.8版本的,不能太旧。安装好后需要设置java的路径。

因为我最终需要用Spark-Streaming环境,当时以为这个环境只能使用scala写程序,所以就安装了scala环境。实际上spark是个平台,你可以使用pythonjavascala等语言进行开发。下面安装Scala环境。

在网站https://www.scala-lang.org/download/下载压缩包,然后解压缩就可以了。我第一次用的是Deb格式的包,等待很久下载后,却因为依赖问题安装不了。原因待查。最后是尝试了第一种包scala-2.12.6.tgz,下载之后进行解压缩,最后把scalabin路径添加到bashrc中就ok了。




这里最重要的问题是scala的版本要和你搭建的spark版本吻合。因为你本地写的程序,最终要提交到服务器执行,而sparkscala版本不同,即使程序正确也会遇到问题,后面会讲到我遇到的问题。所以最简单的方法就是安装与服务器运行一致的环境。


shell中输入scala命令就能得到scala的版本。



在服务器shell中运行spark-shell命令即可得到spark版本



还有一种方法可以找到sparkscala的对应关系

首先需要确定spark的版本,然后在sparkgithub主页选择对应的分支(即版本)后,查看其pom文件,在里面搜索scala.version即可找到scala的版本

githubaddr: https://github.com/apache/spark/blob/master/pom.xml


下图是pom文件中表明的scala版本


这个文件里面还可以找到jdk版本,flume版本,zookeeper版本。详情请见

http://www.aboutyun.com/thread-23252-1-1.html


2spark安装

在官网http://spark.apache.org/downloads.html下载压缩包,之后解压缩,最后配置sparkbin路径到bashrc文件中。


3、安装scalaIDE IDEA

下载连接https://www.jetbrains.com/idea/download/#section=linux

下载之后,解压缩即可。

关于DEMO,可以参照这个例子,写个Helloworld程序,运行成功的话,说明你的环境已经搭建好了

另外还需要下载sbt,下载地址http://www.scala-sbt.org/download.html下载之后,解压缩,配置路径即可。


环境的搭建最重要的是版本问题,如果版本不统一,后续的开发会遇到很多问题,我因为版本的问题,重新安装了很多次。环境搭建主要参考了这两篇博客,详情请见

https://blog.csdn.net/red_stone1/article/details/71330101

https://blog.csdn.net/guiying712/article/details/68947747


二、语法和DEMO

因为我的程序任务是实时处理日志并计算后灌入到redis中,所以第一阶段先尝试读取日志文件并计算和灌入结果;第二阶段修改成实时处理。

第一阶段主要是仿照别人的程序编写,并修改代码,改成自己所需要的。我主要参照这篇博客,详情请见

https://blog.csdn.net/zfszhangyuan/article/details/52538108

这个作者的任务是用spark分析用户行为日志,并统计出每个用户的登录时间和登录次数。程序的流程是:读取日志文件→过滤不符合要求的日志→拆分日志中每一行为一个数组→分析一条日志形成的数组→导出结果。我先仔细研究他的代码,弄懂每句话是干什么后,修改他读取日志的函数,读取方式和输出结果的方式并没有改变。业务不同,用户日志也不相同,所以也没有必要贴代码了。

通过这个代码我只搞懂了两个地方:1sc的作用;2Rdd的基本用法。

sc是设置scala程序配置的变量,里面包括了spark服务器的地址、端口和程序所需要的一些其他设置。

Rddscala的重要概念,可以由文件读取而得到,我参照这篇博客,学习基本的用法,详情请见

https://www.cnblogs.com/sharpxiajun/p/5506822.html


三、数据处理静态

这一步是程序的主要部分:读取日志文件->滤不符合要求的日志->切割日志成数组。

过滤的时候需要用到rddfilter函数,比如我需要日志中包含字符串”pid=”的日志,则写成


切割字符串的时候和java的切割一样


四、数据计算

这一步的任务是根据每一条日志,解析出用户后,修改用户的属性。需要在用户的类中添加一个增量方法,里面用到了时间衰减函数。对时间进行log衰减。



五、数据输出

这一步的任务是将结果输出到存储中。在第一阶段,我把结果存放到了文件中,每个用户的模型数据拼接成json字符串,写到文件中。由于使用的json库没有成功把对象转化成json对象。所以自己手动拼成了json字符串。原因待查。


六、数据输入动态

经过上面的几步,我已经完成了读取日志,计算用户模型,结果保存。但是这离我的目标还有一步,我需要不断地处理用户日志,并实时地改变用户模型。需要的改变是将第二步的从本地读取日志,变成从kafka中读取数据。因为我们的服务器中已经有了kafka框架,并且相应的topic也已经存在。所以我只需要更改配置即可,但是从kafka中读取数据也困扰了我两天的时间。

第一个困难是scsetConf变成zookeeper的地址后,并没有接收到数据,但是在shell中使用kafka的工具是可以读取topic的数据。后来参考同事的代码把地址改成”yarn-client”,就能收到数据。原因待查。

第二个困难是,在IDEA使用sbt的配置文件,获得依赖库很麻烦,而同事都是使用maven的配置文件。常见的问题是我很难查清楚需要的spark-streaming的版本是多少,这个问题后来参考同事的配置文件也解决了。

第三个困难是,在scala中生成kafkastream对象总是失败。我第一次连接kafkastream的时候是使用网上流传很多的使用多线程的方式,其中主要参考了这个blog,详情请见

http://colobu.com/2015/03/13/kafka-example-in-scala/只要生成一个map结构就可以用来生成kafkaconsumer对象了,但是我的始终不能接收到数据。在确认配置和程序没有问题后,我只得放弃了这个方法。后来参照同事的代码,采用了直接连接的方式生成kafka就成功了。详情请见

https://www.jianshu.com/p/2369a020e604


七、数据输出动态

因为我需要把数据灌入到redis中方便其他程序来取数据,所以每次处理日志的时候,我需要把用户的原始属性从redis中取出来,然后再结合当前的日志更新用户的属性,最终把新的处理结果重新写到redis中,覆盖掉原来的属性。其中用到的redis库是jedis。里面遇到的一个困难是,每次都取用户模型的时候和redis进行连接的成本太高,最后改成了批量操作的形式。而且还有一个问题是,更新用户数据的时候,要采用连接池的形式,保证程序连续运行的时候,redis连接断了能够重新连接。



Ref

这个文件里面还可以找到jdk版本,flume版本,zookeeper版本。

http://www.aboutyun.com/thread-23252-1-1.html


这个作者的任务是用spark分析用户行为日志,并统计出每个用户的登录时间和登录次数。

https://blog.csdn.net/zfszhangyuan/article/details/52538108


Rdd基本的用法,

https://www.cnblogs.com/sharpxiajun/p/5506822.html


连接kafkastream的时候是使用网上流传很多的使用多线程的方式

http://colobu.com/2015/03/13/kafka-example-in-scala/


直接连接的方式生成kafka

https://www.jianshu.com/p/2369a020e604





阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页