spark和jstorm的一些经验(坑)

原创
2018/01/10 17:36
阅读数 3K

jstorm

  • jstorm项目目前貌似停止了,提issue也没人解决,一些插件,比如jstorm-kafka支持的kafka版本较低,而且没有打包好的二进制jar,需要自己下代码进行编译,虽然最新版本jstorm2.4发布很久了,但是始终没有推送到maven仓库中,仓库中的最新版本为2.2.1
  • 虽然maven仓库的版本比较旧,但在开发过程仍然可以进行引用,编程接口和2.4版本一样,而且我们的代码只需编译,打包时是要去掉jstorm的包的,所以可以开发时用2.2.1,实际跑2.4是没问题的
  • 我们使用storm-kafka:0.10.2插件,可以跑在jstorm中,无论是storm-kafka还是jstorm-kafka都必须开启ack,如果不开启会导致内存泄漏
  • 接上条,问题来了,在2.4版本中,瞬时数据太大的话会出现奇怪的异常,使用Config.TOPOLOGY_MAX_SPOUT_PENDING_参数来限流没用,但是在2.2.1版本中,该参数有效,可以进行限流,从而避免发生异常
  • jstorm是类似流水线作业的模式,把任务分配到不同的机器去处理,尽量不要分组,可以避免shuffle操作时数据在不同机器间的传输
  • jstorm程序开始了就不会回头了,没有汇总之类的操作,这需要你自己去做
  • 既然用了jstorm就不要用传统的sql了,否则会降低效率,应该使用nosql,如redis,hbase,influxdb等
  • jstorm的trident类似spark的rdd,支持一些聚合操作,但性能较低
  • 2.2.1的UI有问题,找到相关jsp页面,修改autoFlush为true即可

redis

  • redis的并发数一般在几万,不到十万,所以不要把redis当做无所不能,在大数据处理过程中,一秒处理几十万几百万的数据很正常,这对于redis来说是个瓶颈,所以可以缓存数据在本地,再定时flush到redis中

kafka

  • kafka可以再公网中使用,但是要注意权限的问题,可以用./kafka-acls.sh参数来添加访问列表
  • kafka在公网中效率较低,且会发生数据丢失的状况,应该尽量在内网中使用,吞吐量很大,消息队列的利器
  • 如果有大量持续消息的话,可以把消息保留的时间调小点,默认是7天,因为太耗磁盘空间了
  • kafka默认不支持删除topic,可以在配置文件中修改使其支持,然后可以愉快的用命令来删除topic

spark

  • spark开发过程中会使用到类似jdk8中的lambda表达式,这需要一些学习成本,当然也可以直接使用匿名内部类的方式,lambda表达式参考java lambda 且行且珍惜
  • 一旦你熟悉spark的编程方式,你会感谢他提供简洁的api让你去做复杂的事
  • spark-streaming并不是真正的流式计算,而是流式批处理计算,对一个时间段内的数据收集起来,作为一个RDD,再处理。需要指定一个执行的间隔时间
  • 接上文,这个间隔时间不好确定,太小了导致频繁提交作业,太大了又导致处理不及时
  • 默认同一时间只会一个提交的任务,如果该任务耗时较长,而间隔时间又较短,则后续的任务将会一直堆积而得不到处理,可以设置spark.streaming.concurrentJobs该参数,使其可以同时处理多个任务,但是不能在kafka环境中使用,会出现多线程问题
  • 就是因为spark采用rdd模式,你可以在这个批次里对这些数据方便的进行聚合等操作
  • spark的UI功能很丰富,提供一些报表可以查看处理效率和耗时等metric
  • spark的master支持zookeeper做主备切换
  • spark的配置项可以在提交的时候指定,即执行spark-submit的时候指定,而不需要硬编码在代码中,如果有相同的参数,代码中的参数会覆盖提交时指定的参数
  • 使用spark处理文件时,一定要是分布式文件系统中的文件,比如HDFS,不能是本地文件
  • spark的处理模式和总的slave的cpu核心数息息相关,你每提交一个应用就会占用一部分CPU,当把所有的CPU都占满后,提交的应用就处于waiting状态而不能执行
  • 默认启动slave后,会启动一个worker,并占用该机器的所有CPU
  • 在spark-env.sh中可以加入:SPARK_WORKER_CORESSPARK_WORKER_INSTANCES参数来调整每个work占用的核心数,以及slave中启动的work数目。注意的是,第二个参数在官网文档spark-standalon中木有,木有,木有
  • spark-submit中比较有用的参数有:spark.default.parallelismspark.serializer=org.apache.spark.serializer.KryoSerializerspark.executor.coresspark.cores.max
  • spark.cores.max参数可以用来限制应用程序最多使用的cpu核心数,这样方便同时提交多个应用。否则提交第一个应用时就会占用所有可用的CPU
  • spark支持三种部署模式,Standalone Deploy Mode,Mesos,YARN,对hadoop熟悉可以用YARN模式,直接用Standalone也是可以的

粗略对比

  • 在我们的环境中,测试效率,发送jstorm和spark效率差不多,只做计数操作的话都能达到每秒处理200w条数据,其中每条数据平均大小为340B
  • 一些业务用jstorm和spark都可以,spark生态较为丰富,spark-core离线批处理,spark-sql交互式查询,spark-streaming开发实时计算,如果用不到直接jstorm也是可以的
  • 两者编程风格也不一样,jstorm提供类的方式,让你去实现接口,而spark则是提供map-reduce函数让你去操作
展开阅读全文
打赏
0
0 收藏
分享
加载中
打赏
6 评论
0 收藏
0
分享
返回顶部
顶部