分享

Spark新人关于Spark Stream应用的一些疑问,望大神帮忙解答,不胜感激~


    大家好,我是spark新人,有问题想向大家请教~    小白我最近在做实时报文的解码、处理与分析的工作,因为看中了spark streaming的实时数据处理能力和mllib机器学习库,所以想用其作为开发框架。问题如下:
    1)我所处理的报文有些是一条报文表达全部意思,有些是需要连续的多条报文拼接在一起才能解析出全部内容,但spark stream是微批次处理数据,而我需要拼接的多条报文若分到了不同的处理批次中,我该怎么办呢?
    2)由于接收到的报文是暗码形式的,需要非常复杂的解译程序去解译成明码,但我看很多实例的代码多是将数据变成rdd然后做相关的统计分析,看了about云里的帖子其他大公司也多是将它用在数据的统计分析与推荐上,是不是spark不适合用来做实时的这种计算呢?
    3)如果我想用之前写好的解析程序去处理报文,那我直接用rdd.map(解译函数)去处理rdd中的每条报文吗?还是我要将原先的解译程序进行改写,才能分布式的在集群上运行呢?
    4)对于我的这些需求是不是用Storm做更合适呢,storm这种一条一条处理数据的机制是否更适合解决我的第一条问题呢?(sorry,我对storm也不太了解)
    希望大家不要感觉我的问题太弱智,也希望大家可以按条回答我的问题,十分感激!

已有(2)人评论

跳转到指定楼层
nextuser 发表于 2016-12-31 08:19:14
主要还是看场景,如果是实时的,用spark或则storm都是可以的。
对于spark和storm其实都面临的一个难题,就是分割是无序的,否则译出来的信息是不连续的,没有顺序的。
对于spark来说,楼主需要研究下分区。在分区的时候,最好能编个号。自己定义一个分区函数。并且最好对于分割的数据打上标记或则序号。
这样根据标记或则序号,通过程序拼接起来。这个还是挺复杂的。
##############
下面是关于分区的例子

实现一个自定义spark分区的demo

实现的功能是根据key值的最后一位数字,写到不同的文件

例如:

10写入到part-00000

11写入到part-00001

.

.

.

19写入到part-00009

自定义分区:

[mw_shl_code=java,true]import org.apache.spark.{Partitioner, SparkContext, SparkConf}

//自定义分区类,需继承Partitioner类
class UsridPartitioner(numParts:Int) extends Partitioner{
  //覆盖分区数
  override def numPartitions: Int = numParts
  
  //覆盖分区号获取函数
  override def getPartition(key: Any): Int = {
    key.toString.toInt%10
  }
}

object Test {
  def main(args: Array[String]) {
    val conf=new SparkConf()
    val sc=new SparkContext(conf)

    //模拟5个分区的数据
    val data=sc.parallelize(1 to 10,5)
   
    //根据尾号转变为10个分区,分写到10个文件
    data.map((_,1)).partitionBy(new UsridPartitioner(10)).saveAsTextFile("/chenm/partition")
  }
}[/mw_shl_code]更多楼主搜索一下,挺多的












回复

使用道具 举报

AaronCheung 发表于 2016-12-31 22:04:45
nextuser 发表于 2016-12-31 08:19
主要还是看场景,如果是实时的,用spark或则storm都是可以的。
对于spark和storm其实都面临的一个难题,就 ...


真的十分感谢大侠给我提供思路,例子很详细、很受用。我如果想对rdd中的元素都执行之前编写的函数,直接rdd.map(func)就可以了吗?需不需要改写一下之前的函数以满足分布式计算的要求呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条