sqoop增量导入数据到hive,生成太多的小文件,如何合并

coffeewar 2014-10-19 01:38:16
初学sqoop hive,定时增量导入花了几天时间终于搞好,但还是有个问题.我用sqoop创建了job增量导入mysql数据到hive,并开启cron定时器,测试时一分钟运行一次.实际mysql的数据可能是一小时更新一次,即sqoop一分钟运行的job导入时数据都是空的.问题是就算数据是空的也会生成两个文件,一个是_SUCCESS_copy_x,另一个是part-m-0000_copyx,这两个文件大小都是0字节.如图:



就算mysql里有数据,实际上也是很少的,应该需要合并,
我看hive文档里有个合并小文件的属性,但配了没用.配置如下:
hive.merge.mapfiles=true
hive.merge.mapredfiles=true

请高手指点.
...全文
2443 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
coffeewar 2014-10-21
  • 打赏
  • 举报
回复
谢谢了,结分
skyWalker_ONLY 2014-10-20
  • 打赏
  • 举报
回复
如果是mysql导出,再导入到hive中的话,需要将mysql的结果保存为文件,然后使用load data语句,具体可参考http://blog.csdn.net/column/details/hive-home.html
skyWalker_ONLY 2014-10-20
  • 打赏
  • 举报
回复
要想添加到sh中,可以使用
hive -e 'insert into table a select * from b'
coffeewar 2014-10-20
  • 打赏
  • 举报
回复
引用 10 楼 sky_walker85 的回复:
[quote=引用 9 楼 coffeewar 的回复:] [quote=引用 8 楼 sky_walker85 的回复:] [quote=引用 7 楼 coffeewar 的回复:] [quote=引用 4 楼 sky_walker85 的回复:] [quote=引用 3 楼 coffeewar 的回复:] 哦,那像我这样多次作业生成的小文件怎么合并呢
你可以试试insert语句,从原始表中查询数据然后插入到新表中[/quote] 刚接触hadoop不熟啊,能不能具体指导一下,怎么合并[/quote] 比如现存表为a,新建表为b,使用下面的语句:
insert into table a SELECT * FROM b
。 我在实际中没有使用sqoop而是使用的hive jdbc客户端,过程与你的使用情况相反,从hive导出到mysql中,具体可参考 http://blog.csdn.net/skywalker_only/article/details/38366347 [/quote] 谢谢耐心回答 问题是我现在不是hive中的表b导入到表a,而是从mysql中导入的,那就不能用 insert into了吧。 估计还要如wulinshishen所说的,需要定时清理空文件,合并小文件。清除简单,但不知道如何合并,是不是要自己写map-reduce合并呢,我对map-reduce不是特别熟,还停留在wordcount阶段。[/quote] 如何合并,就是我说的insert啊,你现在不是想清理掉小文件吗,当你运行insert的时候,会执行作业,而你又设置了当文件小时自动合并的参数,这样就合并了。然后你删除原表就可以了。或者你改变策略,直接从mysql查询然后倒入到hive中。[/quote] 如果直接从mysql查询然后导入到 hive中,是不是从mysql中查询出来后,在通过 hive2 jdbc连接一条一条插入呢?这个insert 该怎么写,像这样吗
insert into a select 1,2,3
相对完整代码:
Class.forName(DRIVERNAME);
Connection con = DriverManager.getConnection("jdbc:hive2://master:10000/default", "hadoop", "");
String sql = "insert into table a select 1,2 ,3";
Statement stmt = con.createStatement();
stmt.execute(sql);
coffeewar 2014-10-20
  • 打赏
  • 举报
回复
引用 10 楼 sky_walker85 的回复:
[quote=引用 9 楼 coffeewar 的回复:] [quote=引用 8 楼 sky_walker85 的回复:] [quote=引用 7 楼 coffeewar 的回复:] [quote=引用 4 楼 sky_walker85 的回复:] [quote=引用 3 楼 coffeewar 的回复:] 哦,那像我这样多次作业生成的小文件怎么合并呢
你可以试试insert语句,从原始表中查询数据然后插入到新表中[/quote] 刚接触hadoop不熟啊,能不能具体指导一下,怎么合并[/quote] 比如现存表为a,新建表为b,使用下面的语句:
insert into table a SELECT * FROM b
。 我在实际中没有使用sqoop而是使用的hive jdbc客户端,过程与你的使用情况相反,从hive导出到mysql中,具体可参考 http://blog.csdn.net/skywalker_only/article/details/38366347 [/quote] 谢谢耐心回答 问题是我现在不是hive中的表b导入到表a,而是从mysql中导入的,那就不能用 insert into了吧。 估计还要如wulinshishen所说的,需要定时清理空文件,合并小文件。清除简单,但不知道如何合并,是不是要自己写map-reduce合并呢,我对map-reduce不是特别熟,还停留在wordcount阶段。[/quote] 如何合并,就是我说的insert啊,你现在不是想清理掉小文件吗,当你运行insert的时候,会执行作业,而你又设置了当文件小时自动合并的参数,这样就合并了。然后你删除原表就可以了。或者你改变策略,直接从mysql查询然后倒入到hive中。[/quote] 貌似有点明白了,是不是这样: 1、通过sqoop定时从mysql中导入数据到hive中的表b。 2、导入完成后,在通过
insert into table a select * from b;
3、删除表b; 如果这样的话,实际上数据是写入两次了,不过问题也不大。但问题是我不知道怎么从.sh脚本中调用hive命令。 如我新建一个脚本文件inc_import.sh,然后通过cron定时执行。 inc_import.sh如下:

##从mysql中导入数据到hive表b
sqoop job --exec b_inc

##连接hiveserver2将表b中的数据插入到表a(这里不知道怎么写)
hive > insert into table a select * from b;

##连接hiveserver2删除表b(这里不知道怎么写)
hive > drop table b;
skyWalker_ONLY 2014-10-20
  • 打赏
  • 举报
回复
引用 9 楼 coffeewar 的回复:
[quote=引用 8 楼 sky_walker85 的回复:] [quote=引用 7 楼 coffeewar 的回复:] [quote=引用 4 楼 sky_walker85 的回复:] [quote=引用 3 楼 coffeewar 的回复:] 哦,那像我这样多次作业生成的小文件怎么合并呢
你可以试试insert语句,从原始表中查询数据然后插入到新表中[/quote] 刚接触hadoop不熟啊,能不能具体指导一下,怎么合并[/quote] 比如现存表为a,新建表为b,使用下面的语句:
insert into table a SELECT * FROM b
。 我在实际中没有使用sqoop而是使用的hive jdbc客户端,过程与你的使用情况相反,从hive导出到mysql中,具体可参考 http://blog.csdn.net/skywalker_only/article/details/38366347 [/quote] 谢谢耐心回答 问题是我现在不是hive中的表b导入到表a,而是从mysql中导入的,那就不能用 insert into了吧。 估计还要如wulinshishen所说的,需要定时清理空文件,合并小文件。清除简单,但不知道如何合并,是不是要自己写map-reduce合并呢,我对map-reduce不是特别熟,还停留在wordcount阶段。[/quote] 如何合并,就是我说的insert啊,你现在不是想清理掉小文件吗,当你运行insert的时候,会执行作业,而你又设置了当文件小时自动合并的参数,这样就合并了。然后你删除原表就可以了。或者你改变策略,直接从mysql查询然后倒入到hive中。
coffeewar 2014-10-20
  • 打赏
  • 举报
回复
引用 8 楼 sky_walker85 的回复:
[quote=引用 7 楼 coffeewar 的回复:] [quote=引用 4 楼 sky_walker85 的回复:] [quote=引用 3 楼 coffeewar 的回复:] 哦,那像我这样多次作业生成的小文件怎么合并呢
你可以试试insert语句,从原始表中查询数据然后插入到新表中[/quote] 刚接触hadoop不熟啊,能不能具体指导一下,怎么合并[/quote] 比如现存表为a,新建表为b,使用下面的语句:
insert into table a SELECT * FROM b
。 我在实际中没有使用sqoop而是使用的hive jdbc客户端,过程与你的使用情况相反,从hive导出到mysql中,具体可参考 http://blog.csdn.net/skywalker_only/article/details/38366347 [/quote] 谢谢耐心回答 问题是我现在不是hive中的表b导入到表a,而是从mysql中导入的,那就不能用 insert into了吧。 估计还要如wulinshishen所说的,需要定时清理空文件,合并小文件。清除简单,但不知道如何合并,是不是要自己写map-reduce合并呢,我对map-reduce不是特别熟,还停留在wordcount阶段
skyWalker_ONLY 2014-10-20
  • 打赏
  • 举报
回复
引用 7 楼 coffeewar 的回复:
[quote=引用 4 楼 sky_walker85 的回复:] [quote=引用 3 楼 coffeewar 的回复:] 哦,那像我这样多次作业生成的小文件怎么合并呢
你可以试试insert语句,从原始表中查询数据然后插入到新表中[/quote] 刚接触hadoop不熟啊,能不能具体指导一下,怎么合并[/quote] 比如现存表为a,新建表为b,使用下面的语句:
insert into table a SELECT * FROM b
。 我在实际中没有使用sqoop而是使用的hive jdbc客户端,过程与你的使用情况相反,从hive导出到mysql中,具体可参考 http://blog.csdn.net/skywalker_only/article/details/38366347
coffeewar 2014-10-20
  • 打赏
  • 举报
回复
引用 4 楼 sky_walker85 的回复:
[quote=引用 3 楼 coffeewar 的回复:] 哦,那像我这样多次作业生成的小文件怎么合并呢
你可以试试insert语句,从原始表中查询数据然后插入到新表中[/quote] 刚接触hadoop不熟啊,能不能具体指导一下,怎么合并
coffeewar 2014-10-20
  • 打赏
  • 举报
回复
引用 4 楼 sky_walker85 的回复:
[quote=引用 3 楼 coffeewar 的回复:] 哦,那像我这样多次作业生成的小文件怎么合并呢
你可以试试insert语句,从原始表中查询数据然后插入到新表中[/quote] 实际上我这里就一个表的数据,因为是定时导入的,所以会生成很多小文件。
  • 打赏
  • 举报
回复
自己写个程序定时清理空文件,合并小文件
skyWalker_ONLY 2014-10-20
  • 打赏
  • 举报
回复
引用 3 楼 coffeewar 的回复:
哦,那像我这样多次作业生成的小文件怎么合并呢
你可以试试insert语句,从原始表中查询数据然后插入到新表中
coffeewar 2014-10-20
  • 打赏
  • 举报
回复
哦,那像我这样多次作业生成的小文件怎么合并呢
skyWalker_ONLY 2014-10-19
  • 打赏
  • 举报
回复
每次sqoop作业是否只输出了一个文件?上面的参数针对的是一个作业有多个输出文件的情况,像你这种情况是多次作业产生多个文件

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧