Java 多线程案例分析

2017-03-19 18:48:39 +08:00
 xsank

开题

设定有如下需求:
现要从hbase中导出 2016 年整年的,大约10w只股票行情数据,数据总量约100t
导出成如下格式:

2016-01-01/facebook.txt linkedin.txt amazon.txt google.txt...
...
2016-12-31/facebook.txt linkedin.txt amazon.txt google.txt...

汇总到hdfs中供需求方使用

分析

已知数据量规模大概是100t,那么单台机器处理肯定不是不行的,先不说大多数磁盘都没这么大,即便磁盘有这么大,单台机器处理对于内存和 cpu 要求也很高,所以我们将问题一般化,使用数量有限的低配机器。
那么接下来要处理的就是如何对任务进行分割,最容易想到的有两种:

  1. 按照时间分割
    2016 年共 365 天,那么最多拆分成 365 组,粒度足够细。再按照小时拆分又涉及到数据合并,先不考虑。
  2. 按照股票分割
    一共 10w 只,粒度可以拆分的更细。

以上两种都可以,都涉及到最后汇总 hdfs 的情况,不过按照股票分割粒度更细,更便于控制,这里我们选用后者。

选定分割方式后又会遇到一个问题,如果将任务分割给多台机器,这里先说两种:

  1. 按照机器数平均分配
    事先将股票裁剪分配好到一台中心机器上,每台机器设定只读取其中一部分或者直接将裁剪好的股票信息分配到对应的机器 这种做否有两个缺点:
    • 这会导致机器状态相关,不便于横向扩展
    • 任务平均分配可能存在不均,资源利用率不够
  2. 由机器实际处理能力决定
    事先将股票信息保存在一台中心机器上,每台机器从这里统一消费

很明显方案二比方案一要好,这里我们选用方案二

现在机器已经分配好了,剩下的就只有单机处理了,剩下的就只有并发的知识了
应到每台机器上的逻辑就是:对于获取到的每只股票,扫描整年的数据,然后写本地,写好之后 copy 到 hdfs 即可,再细化下去后大概会遇到如下几个问题:

  1. 需要添加生产者-消费者模型
    获取股票后要扫取一天的数据,生产者及是hbase数据读取方,消费者便是数据处理方
  2. 本地磁盘大小有限,数据要及时清理
    假设我们的机器磁盘都只有100g的空间,那么必须考虑本次可存的文件最大上线,一旦告警必须等待磁盘数据拷贝完成再继续处理
  3. 保证数据完整性
    这里的任何一条数据都是不能丢弃的,你可以block任务,但是不能reject
  4. 扫取范围
    对于这种类TSDB的存储,当然最好只扫描一次,但是扫出来的数据都必须根据时间判断,会浪费性能,多线程写还需要考虑文件锁,进一步降低性能,另外如果程序判断按照天截止,又容易造成数据遗漏,不按照天截止缓存整年的数据之后再拷贝到hdfs又会增加时间开销
    所以这里最好按照天的粒度再分区间scan,每个线程仅控制一天,避免多线程写,同时便于单文件写好之后立即通知上传线程将文件汇总过去

知识点

第三方系统的掌握

如已经明确相关的hbasehdfs,其他包含可能会用到的组件如:消息队列,缓存等

多线程控制

会涉及到BlockingQueue,ThreadPool,CountdownLatch,Lockconcurrent知识运用,举个具体例子:

总结

这就是一种比较常见的,用到“大数据”处理和并发知识的场景,如果网友有更好的思路,欢迎留言讨论~

2572 次点击
所在节点    Java
3 条回复
billlee
2017-03-19 21:19:43 +08:00
没太看懂,这个直接用 mapreduce 不可以吗?
xsank
2017-03-20 09:43:34 +08:00
@billlee ,这个也是可以的,但无奈没写过 hadoop job ,所以本文重点强调 java 多线程的使用
log4geek
2017-03-22 14:31:12 +08:00
说到多线程,还要搞清楚 Java 中的 synchronized 、 Object.wait()、 Object.notify()/notifyAll()原理
传送门
http://log4geek.cc/2017/02/java%e4%b8%ad%e7%9a%84synchronized%e3%80%81object-wait%e3%80%81object-notifynotifyall%e5%8e%9f%e7%90%86/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/348640

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX