最近在做一个大数据类项目,用到了Hadoop Hive SparkStreaming kafka等技术,整体面很广,本片仅介绍在开发过程中遇到的大数据量写入遇到的写入特别慢的解决过程。
说明: 我之前没接触过Hive相关,所以可能有些地方不是很准确,或者是还有其它解决方案,欢迎大家指出以备完善。
场景: 现在有个场景:50W数据写入hive库,会使用哪种方案。我之前没接触过Hive相关知识,最开始的方法是将数据转换为SQL,使用jdbc直接insert到Hive里面。我做了个测试一晚上跑了不到30W,速度太慢。
具体的jdbc方式代码就不贴出来了,就是将数据转为插入SQL。
Hive内部表外部表
- 创建表:Hive创建内部表时,会将数据移动到数据仓库指向的路径,hive管理数据的生命周期;Hive创建外部表时,仅记录数据所在的路径,不对数据的位置做任何改变。
- 删除表:Hive删除内部表时,内部表的元数据和数据会一起被删除,同时对于一些hive操作不适应于外部表,比如单个查询语句创建表并向表中插入数据;Hive删除外部表时,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。创建外部表时,甚至不需要知道外部数据是否存在,可以把创建数据推迟到创建表之后才进行。
- 选择:内部表与外部表没有太大区别。如果所有的数据都由hive处理,则创建内部表;如果数据的处理由hive和其他工具一起处理,则创建外部表。但是,管理表不方便和其他工作共享数据,一些数据操作数据维护等不适合,所以使用外部表会更加灵活一些。
Hive数据导入方式
- 从本地文件系统中导入数据到Hive表;
load data [local] inpath ‘’ [overwrite] into table t_user;
local : 如果想把本地的数据加载到表中 请加Local ‘’ 放的就是数据所在的目录 - 从HDFS上导入数据到Hive表;
hadoop fs -put /home/lyl/a.txt /user/lyl/input/b.txt; - 从别的表中查询出相应的数据并导入到Hive表中;
insert overwrite [local] directory ‘’ select … 注意 : 该目录不能有子目录 - 在创建表的时候从别的表中查询出相应的记录并插入到所创建的表中。
create table test4 as select id, name, tel from wyp;
我用的是第一种,先将50w数据生成txt文件,然后上传到本地文件系统,通过执行load将文件中的数据加载到表中。实测十秒内就可以完成。
简单贴下代码,代码没法直接拿来用,仅提供思路
File file = transFile(dataList);
String path = uploadHDFS(file);
String sql = "load data inpath '" + path + "' into table " + tableName;
log.info(sql);
developUtil.executeSql(sql, dbName);
- dataList即为要写入Hive的数据,通过dataList生成File。
- 将File上传Hdfs,获取上传路径。
- 拼接Hive的load命令。
- 执行命令,将文件中数据load到Hive中。
这是我用到的方式,如果大家有其他更好的方式可以评论或者私信我。