为什么用Java开发Spark应用
众所周知, Spark的大部分代码(到目前为止是73%)都是用scala开发的, 所以学习Spark的很多朋友第一步就是学scala, 学着学着就放弃了.说好的我是来学Spark的呢? 说实话, 我一开始没事想学下Spark的时候也是这种情况, 我学语言的天赋比较弱, 入门一门语言心理包袱比较大, 而且在两门编程语言的切换的过渡时间需要比较长.比如写了2天的scala, 再让我回去写Java, 编码的出错概率就很高了, 比如变量类型Java是在左边的, scala是在右边的.这就好比你在大陆是秋名山车神, 到了香港也是挂逼.
直到有一天业务上需要用Spark去做点事情了, 翻看了Spark文档, 基本上都有提供Java接口的用例,而基于Java8的stream api也是挺简洁的. 再看看源码的接口(org.apache.spark.api.java), 大部分都是有提供对Java的兼容, 毕竟目前Java才是主流的JVM语言嘛.而且理论上Java是能很方便得调用Scala的接口的.所以用Spark的第一步完全没有必要被Scala这座大山挡着啊.
再说说其他方面的考虑
- 类库
学习一门语言不单是学习他的语法, 对类库的熟练的话, 写起代码得心应手,毫无顿挫感. 学scala的时候, 写了一些demo, 发现scala调用java实现的类库有问题, 比如常用的json库fastjson,lombok 当然scala里面也有一些代替品, 但是替换成本还是有的. 毕竟我们的核心问题还是学习Spark去处理数据.相反, 大部分scala库是有为Java考虑的, 比如大数据领域常用的Kafka, 没有兼容老大哥, 怎么去推广呢?如果之前你已经是Java小能手的话, 用Java来写Spark程序, 就把Spark当做Java的类库来使用, 其他之前熟悉的东西该怎么用, 就怎么用, 学习成本只有熟悉Spark的api. 刚入门学习的时候, 大数据的东西本来就非常多了, 新手尽量把精力放在核心问题上.当然另一个观点是Spark是用scala写的, 不学scala, 怎么深入研究Spark. 其实这是另一个问题,你先把Spark的用法熟悉了, 应用写起来了, 把数据跑起来了, 出现问题了, 自然而然会去学Scala,会去看Spark的实现, 带着实际问题学习也更快.我们前期基本上是用Java的, 后面部分测试代码和udf的实现也尝试开始用Scala.
- 团队
当时开发这个业务, 是我和团队的另外一个人, 两个人日常用的最多的就是Java, 为了开发这个东西, 两个人去学习Scala, 进度不可控.加上全公司的后端技术栈基本是Java, 中间件几乎也是Java的, 内部的中间件不像开源软件一样, 可没有特意为Scala去兼容一些接口, 出现问题, 解决的周期比较长.
- 代码可读性和维护性
Java这方面目前来说肯定是最优解,很多人会说Java臃肿啰嗦, 臃肿的另一面就是把事情描述得够具体,不容易产生歧义, 大部分互联网公司用这门语言作为主力开发语言很大一部分原因也是这个, 毕竟底层码农的交(fang)接(yang)时间一般就是一个月, 人员流动又是比较高频的. 出了线上问题, 解决的时候遇到一堆语法糖, 对于不懂scala语法的接盘侠来说那种感觉不知道有多痛苦.我们的业务目标是基于Spark封装一些应用,各种抽象, 模块化的东西会多一点,如果是main函数写到底300行之内的代码解决简单逻辑, 肯定还是用scala合适.
在用Java写Spark的过程中,个人体验整体学习曲线是比较平滑的, 当然Spark的api也并不是全部兼容了Java的, 一些接口需要用一些小技巧去填一下坑, 所以接下里的文章都是基于Java去开发Spark应用的一些实践,由点带面,里面也会夹带其他的一些工程实践技巧.如果你刚好也是跟我一样的考虑, 可以持续关注接下来的一些文章.