`
kwenge
  • 浏览: 2481 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

为何ODPS DSHIP导入和JDBC批量写库速度超快?

阅读更多

阿里数据云ODPS无法在命令行窗口使用传统的INSERT语句插入数据信息,究其原因,主要是其命令行窗口实现过于简单,并为实现真正意义上的INSERT插入语句解析。

在需要对ODPS某表插入一条语句的时候,通常采用如下方式:

INSERT   INTO  TABLE  DES_TABLE
SELECT C1,C2,C3,....
FROM(
      SELECT COUNT(1) FROM DES_TABLE
)A

 在这种方式下,ODPS会将此SQL放入ODPS进行解析,生成DAG作业,然后一步步地执行。这种方式插入数据,其响应时间通常是单笔数据5到10秒左右,如果是插入大量数据,显然无法容忍。此时,需要采用文件导入的方式进行,例如通过DSHIP进行数据导入。

sh ./odps-dship/dship upload -p project_test aa.dat TABLE_AA -s true -fd "," -ni "NULL";

 ODPS导入的速度是非常快的,通常至少可达到5000笔/秒。

DSHIP和ODPS命令行窗口同样是基于ODPS的API进行开发,为何差距如此之大呢?经过对DSHIP的源码了解,其实现原理本质上是采用ODPS Tunnel直接将数据经过Profobuf批量数据写入ODPS,无需像ODPS命令行窗口执行SQL那样需要进行作业解析,DAG作业一步步地慢慢执行。

与DSHIP相类似地,ODPS-JDBC也采用了ODPS Tunnel进行数据批量写入。因此,如果需要从应用程序向ODPS插入数据,建议采用ODPS-JDBC批量写的方式,这种方式的写入效率可与DSHIP批量导入的效率相同。

话又说回来,为何ODPS-JDBC可以实现数据批量INSERT,而ODPS命令行窗口却不可以呢?原来,ODPS要求在将数据写入ODPS前,需要对数据进行预先的验证,因此INSERT过程需要分为两步:第一步,对INSERT语句进行简单验证;第二步,将数据通过Tunnel写入到ODPS。即,先提交预编译SQL(注意:ODPS要求INSERT语句中的?出现的个数必须与表的列数相同):

INSERT  INTO  TABLE  DEST_DATE VALUES(?,?,?,?);

 然后在提交待插入的数据。ODPS命令行并没有实现INSERT语句中带VALUE值的情况。(其实不难实现。)

因此,ODPS命令行窗口必须采用折中的SQL语句才能实现数据插入。进而导致ODPS写入数据非常缓慢的假象。实际上,基于ODPS Tunnel的JDBC批量插入、DSHIP导入速度是非常快速的。

希望ODPS命令行窗口能够改善为可基于ODPS Tunnel进行数据插入。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics