一次kettle性能优化

将2.04G的数据导入到mysql数据库中,数据格式是json格式,由于包含不同类型的数据,需要将不同类型的数据进行拆分操作,提取出目标数据。其中涉及值替换,json解析,字段选择等操作。刚开始运行的过程发现很慢,而且解析到最后出现OOM的情况,完全崩溃,运行了几个小时OOM了,泪流满面。

既然OOM,当然第一想到的是,那肯定内存不够啊,立马给加内存。好歹也学了一段时间深入虚拟机内存,打开jvisualvm,通过visualGC看各个区域的内存占用情况。事实证明还是too naive。内存占用居然超过了13g,而且基本上是处于old区。大部分内存占用得不到释放,dump出来的prof也显示基本是char[]数组的数据。此时才想起我应该注意一下执行步骤,果真还是太年轻,没经验,执行步骤基本上卡在json input那一步,导致大量的数据读入进来之后,json解析处理不及时,数据堆在json input的上流,最后只好oom了。

既然定位出瓶颈在哪,就好办些。但是怎么优化json解析速度呢?此时就需要万能的google大神上场了。原来json input是通过javascript脚本实现的,性能上肯定比不上java的实现。还好,graphiq的一位工程师开源了,他们自己写的插件FastJson。作者在这篇博客中做了详细的性能对比和分析。同时,FastJson还支持移除源字段,以便解析完释放内存,还有支持对不存在字段的处理,设置default为null。插件github开源地址,但是作者是基于5.0.9 kettle-core编译的,笔者无法直接使用,只好下载代码自己编译,笔者使用的kettle-core版本是6.1.0.1-169,同时增加了swt,commons-vfs2的包,所以做了如下修改:

    <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-core</artifactId>
            <version>6.1.0.1-196</version>
        </dependency>
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-engine</artifactId>
            <version>6.1.0.1-196</version>
        </dependency>
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-ui-swt</artifactId>
            <version>6.1.0.1-196</version>
        </dependency>
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-test</artifactId>
            <version>6.1.0.1-196</version>
        </dependency>
        <dependency>
            <groupId>pentaho</groupId>
            <artifactId>metastore</artifactId>
            <version>6.1.0.1-196</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>jsonpath</groupId>
            <artifactId>jsonpath</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>net.minidev</groupId>
            <artifactId>json-smart</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>net.minidev</groupId>
            <artifactId>asm</artifactId>
            <version>1.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-vfs2</artifactId>
            <version>2.1-20150824</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.swt</groupId>
            <artifactId>org.eclipse.swt</artifactId>
            <version>3.1</version>
        </dependency>

然后就是愉快的按照作者的方式打包插件。等等。。好想忘了什么事,插件?怎么安装插件啊?还好领悟能力可以,直接放到plugins目录下,怎么找不到新的插件啊?笔者摸索了半天,才发现自己需要重新启动kettle,先前一直是通过快捷方式启动,不知道怎么回事,就是一直看不到,然后到安装目录中重新启动,果断看到了FastJson。泪奔啊。。。。

但是好像没有我预想的那么快,不过解析速度还是比json input快些的。发现瓶颈基本上还在Json解析这块。想想不对啊,这么慢的东东,不可能那么多人用,肯定还有什么地方不对。果断google了一下,kettle性能优化。发现了问题。原来我是暴殄天物啊,所有步骤都是一个线程在运行,人家可是支持多线程的。你这不是浪费资源吗?果断右击步骤 -> change number of copies to start..”并输入合适的线程数8(笔者的电脑是8核的),有些步骤会提示得现增加一个dummy才能修改线程数,直接按照提示操作即可。至此,重新启动转换,发现速度立马飙升上去了。性能瓶颈基本上的数据库写入上了。

那么数据库我们还能不能优化呢?由于笔者这里都是插入操作,就去看了下表结构,果断去除索引。其实到此,笔者已经较为满意,原先3,4个小时的导入,半个小时不到就搞定了。

还有个能够优化的地方,鉴于环境限制,笔者还没有去实践,那就是上集群。有兴趣的朋友可以去试试。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,406评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,976评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,302评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,366评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,372评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,457评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,872评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,521评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,717评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,523评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,590评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,299评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,859评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,883评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,127评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,760评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,290评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,577评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,357评论 25 707
  • window/show view / 找到svn资源库,显示查看项目属性中svn版本控制,找到url在svn资源库...
    玲珑花阅读 1,463评论 0 0
  • 宋秀红 (开篇) 非常荣幸有机会和自治州群教办的各位领导、同志一起学习、探讨、分享公文写作的一些心得和...
    香露草阅读 600评论 0 2
  • 生,如一场梦。 带来那所谓的,悲伤,烦恼,忧愁的夜。 却又让那黎明,冲散这一切。 白天,黑夜,交织着生活的悲与喜。...
    无言心阅读 190评论 0 0