SQOOP可能会导致HDFS分片数量过多的总结

使用多少个mapreduce来进行移植数据,例如:

./sqoop import --create-hive-table  --hive-import --hive-overwrite   --connect jdbc:oracle:thin:@XXX.XXX.XXX.XXX:1521:orcl --username name --password pwd --table tablename --hive-database hivedatabasename -m 5

上面使用了5个任务,然后数据在每个任务不满128M的时候,存储文件也会分成5份,在数据量不是很大的情况下,还是应该只用1个任务来跑,这样文件的分片比较少,为什么要分片数量少呢?

比如下面就是用1个任务跑的

当后面用sparksql进行表数据的清洗、筛选和合并的时候,

例如我们把每日的数据最终合并到年表中,当使用

insert into tableyear select * from tableday的方式在sparksql中执行时,hive会自动把日表的文件拷贝到年表中,就会出现以下奇景:

我们发现全部是拷贝的

然后当我们在sparksql中执行某些任务的时候,那么就需要从每个数据分片查询,这都是时间,以2个月为例,每天用5个mapreduce进行sqoop移植数据,最终产生了300多个数据分片,然后执行的sparksql的count表数据的时候,我们就会发现产生了300多个Task

当存在300多个数据分片的时候进行count,我们发现就算那个分片就算是0B,至少也会损耗将近10ms的时间,如果能将分片变成1/5,比如少200个分片,以上面例子为例节省的时间就可能是2s,当然这种计算不一定合理,但至少印证了数据分片数量过多对速度上的影响。

上面的数据量大概是600万,花了5秒。

而我们另外一个数据600多万,比它还多一点数据,执行的时候第一次2秒左右,后面每次执行都1秒钟都不到,就是因为数据分片少

因为执行的任务数量少了,所以效率大幅度提高了:

总结:

如果数据比较少的情况下,我们更加建议,在关系型数据库将数据合并之后再使用sqoop移植,比如oracle我们上面的表,1天的数据本身就只有10万条左右,大小在70M左右,根本没满128M,这个时候就算一天一个HDFS文件,在后续合并区间段(比如历史所有5年的数据全部放在一个表)太长的情况下,都会显得浪费,不如把1个月的数据300万条首先的关系型数据库合并到大表,大小总共就1个G,如果分配合理,最终在hdfs中只需要产生10个左右的数据分片,2个月产生20个,相比上面我们产生了300多个数据分片,最终的效率肯定不可同日而语!!!

当数据量比较多,比如一天数据本身本身就有500万甚至上千万数据的时候,一天的大小可能就会与几个G甚至几十个G,那么这个时候我们就算用多个mapreduce任务也没关系,当然任务还是不能太多,不然很可能出现每个任务的最后产生的文件离128M差距太多,还是会对性能产生一定的影响!!!

性能优化看来是一条疯狂的道路!!!

时间: 2024-10-05 16:25:17

SQOOP可能会导致HDFS分片数量过多的总结的相关文章

Seele元一首席架构师刘文思:分片技术是把双刃剑,单纯看TPS或分片数量毫无意义

导语:近日, seele团队成立了"Seele最前线"媒体平台,希望可以通过此平台向全球社区伙伴实时同步团队动态与工作进展.正值Seele元一技术团队对测试网进行了新一轮测试,"Seele最前线"第一期内容便邀请到Seele元一首席架构师刘文思,并针对分片技术同大家进行交流. 事实上,区块链的扩展性问题一直是大多数公链发展过程中难以避开的拦路石,随着数字货币的集体性下跌,区块链技术正逐渐回归理性,公链的吞吐量问题再次成为焦点.比特币网络平均每秒只可以处理7-10笔交

container在运行的时候重启 docker 服务, 可能会导致 container无法启动

如果有container在运行的时候重启 docker 服务, 可能会导致 container无法启动, 错误信息类似于 Error response from daemon: Cannot start container zookeeper: Error getting container ddf1dd91bbf46dc648268327f8f7c6fffaf2f19cda5cf1d97fdc701016d4332c from driver devicemapper: Error mounti

对“demo!demo.Index+HookProc::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活

对"demo!demo.Index+HookProc::Invoke"类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢失.向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们. 解救办法: //保持活动 避免 回调过程 被垃圾回收 GCHandle.Alloc(委托); 对"demo!demo.Index+HookProc::Invoke"类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢

servlet请求编码与响应编码问题(编码不一致可能会导致乱码)

html中的编码 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">这里不设置成中文编码无法写中文. jsp中的编码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> conte

sqoop操作之HDFS导出到ORACLE

注意:在导出前需要先创建待导出的表结构.如果导出的表在数据库中不存在则会报错:如果重复导出多次,表中的数据会重复: create table EMP_DEMO as select * from EMP where 1=2; create table SALGRADE_DEMO as select * from SALGRADE where 1=2; 导出表的所有字段 sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL

编写高质量代码改善C#程序的157个建议——建议78:应避免线程数量过多

建议78:应避免线程数量过多 在多数情况下,创建过多的线程意味着应用程序的架构设计可能存在着缺陷.经常有人会问,一个应用程序中到底含有多少线程才是合理的.现在我们找一台PC机,打开Windows的任务管理器,看看操作系统中正在运行的程序有多少个线程. 在笔者当前的PC机上,线程数最多的一个应用程序是某款杀毒软件,它一共拥有116个线程数:其次是Windows自身的System进程,当前共有104个线程:第三多的进程是Sqlservr.exe,锐减到了35个线程:剩下还有63个进程,估计它们平均约

如果两段内存重叠,用memcpy函数可能会导致行为未定义

如果两段内存重叠,用memcpy函数可能会导致行为未定义,改进: void* memmove(void* str1,const void* str2,size_t n) { char* pStr1= (char*) str1; const char* pStr2=(const char*)str2; if (pStr1 < pStr2 ) { for(size_t i=0;i!=n;++i) { *(pStr1++)=*(pStr2++); } } else { pStr1+=n-1; pStr

ef core code first 模式提示&quot;可能会导致循环或多重级联路径&quot;问题

执行命令 dotnet ef mirations add "xxxxxx" dotnet ef database update 报错 将 FOREIGN KEY 约束 'FK_SkuPropertyItem_Sku_SkuId' 引入表 'SkuPropertyItem' 可能会导致循环或多重级联路径.请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束.无法创建约束.请参阅前面的错误消息 修改项目定义的d

360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法

360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法     同事办公室的打印机是网线接口的那种网络打印机,不是直接连到电脑的那种,他电脑安装了360和金山毒霸,WIN10下安装网络打印机死活安装不上,提示“数据无效”.百度了下找到了解决办法:https://jingyan.baidu.com/article/a948d6513ef4200a2ccd2e50.html 右击桌面上我的电脑→管理→服务→把device install service和device setup