mysql中导入1000W条数据,哪种方式比较快

news/2024/11/16 16:52:18/

前言

 

背景

今天被妹子问到一个问题,往mysql中导入1000W条数据,哪种方式比较快,我居然被问到了,说实话我还真心不知道。

那就找数据呗,搞数据研发的好处就是,数据肯定是很多的,正好还有测试集群。开始在线上找数据。

由于我们很多mysql的表会通过sqoop抽到hdfs中,所有就直接在hdfs中把数据提出来了,不给线上mysql什么压力了。

 

对比实验

现在使用两种方式分别往mysql数据库中插入数据。 
- 一种是load data的形式, 
- 一种使用sqoop从hdfs中抽。

 

数据

  • 200W+条数据
  • 12个字段,int居多
  • 1.2G
  • ENGINE=InnoDB

 

测试环境

测试时,集群本身没什么数据,也没有任何任务,基本可以看成纯净的测试环境。

  • 5台hadoop集群,标准8G内存,1T硬盘,cdh5.4.7,各种组件齐全。
  • 1台单独mysql服务器。

用两种测试方法,分别使用独自的新表,互不影响。但是是在同一台mysql中。

 

MySQL load data

使用mysql自带的load工具

LOAD DATA INFILE '/tmp/dante/part-m-00000' INTO TABLE dante.tablename FIELDS TERMINATED BY ',';
1

结果

执行完成总共用了14分钟,感觉还能不错哦。

Query OK, 2106860 rows affected, 65535 warnings (14 min 7.19 sec)
Records: 2106860  Deleted: 0  Skipped: 0  Warnings: 4213720
1
2

遇到的错误信息

 

错误一

我是直接再hdfs中拿的数据,数据就是通过sqoop从mysql抽出来的,结果还是报了这个错误

ERROR 1406 (22001): Data too long for column 'is_receive' at row 1
1

其实这次此时我不太关注什么数据类型,那就把出问题的数据类型改成varchar。

 

错误二

ERROR 1261 (01000): Row 1 does not contain data for all columns
1

在 MySQL 中使用 load data infile 命令导入数据文件到 MySQL 数据库中的时候,如果遇到 MySQL 错误:“ERROR 1261 (01000)”,则很可能是由于数据文件中的列数跟 MySQL 数据表字段数目没有完全匹配,并且 sql_mode 设为 strict 模式的缘故。要想在这种情况下继续导入数据到 MySQL 表中,则需要设置 MySQL sql_mode 变量。

mysql> show variables like 'sql_mode';
+---------------+--------------------------------------------+
| Variable_name | Value                                      |
+---------------+--------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
1
2
3
4
5

把它改成了ANSI就行了。

set @@sql_mode=ANSI;
1

sqoop

从sqoop导入到mysql之前已经把数据放在了hdfs的/tmp/dante/test中。

sqoop-export --connect jdbc:mysql://mysql:3306/dante --username root --password root --table tablename --export-dir /tmp/dante/test --input-fields-terminated-by ',' 
1

结果

sqoop明显要比mysql自身的导入方式要多了,六七分钟就完成了导入。

错误

 

错误一

16/04/01 19:17:23 ERROR manager.SqlManager: Error executing statement: java.sql.SQLException: null,  message from server: "Host 'test' is not allowed to connect to this MySQL server"
java.sql.SQLException: null,  message from server: "Host 'test' is not allowed to connect to this MySQL server"at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:959)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1038)at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254)at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285)at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084)at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

 


http://www.ppmy.cn/news/735683.html

相关文章

MySQL批量插入1000w条数据

一、概述 在一些实际的测试、运维过程中&#xff0c;往往需要向数据库插入大量数据&#xff0c;利用存储过程是一个不错的选择 本次采用MySQL5.7&#xff0c;模拟实际批量插入1000w条随机数据 二、创建库 mysql -uroot -p密码create database bigdata;use bigdata三、创建表 …

MySQL线上环境单表1000w数据增加字段怎么玩

http://www.gameboys.cn/article/163 向一个 1000w 数据的线上业务表里新加字段&#xff0c;怎么操作&#xff1f; 本地测试及正确解决方案&#xff1a; 1.准备测试环境 MySQL 测试环境 系统&#xff1a;Linux centos 6.8 内存&#xff1a;2G 内存 CPU:2 核 CPU 硬盘&…

如何从数据库加载1000w数据

这篇文章主要讲解 如何从数据库加载1000w数据 加载大量数据 例子&#xff1a;将1000w的数据从数据库导入到redis中 在mysql中的实现方法&#xff1a;1、limit 分页 2、游标 limit 分页 问题&#xff1a; 当offset很大时&#xff0c;mysql需要做大量的文件排序操作&#x…

Mysql 数据库 第十六节 存储过程 1000w 数据的插入

存储过程 1. 一组 可编程的函数&#xff0c; 是为了完成特定功能的 SQL语句集 储存过程就是具有名字的 一段代码&#xff0c;用来完成特定功能 2. 为什么要是用 存储过程 将 重复性很高的一些操作&#xff0c;封装到一个存储过程中&#xff0c; 简化了 对这些 SQL 的调用 批量…

Redis 中 hash 存储和获取

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 前言 最近做了个需求&#xff0c;需要用到 Redis 中 hash 存储和获取&#xff0c;记录一下使用方法。 import com.a…

编译Android平台的OpenCV库并启用OpenCL及Contrib

1.下载好OpenCV与OpenCV_Contirb 版本: 4.7 编译主机系统: Ubuntu 20.04 LTS 准备环境与工具: ANDRIOD SDK 与 NDK ,CMAKE ,NINJA ,GCC,G++ ,MAKE 开始编译: ../opencv/platforms/android/build_sdk.py --extra_modules_path=../opencv_contrib/modules --no_samples_bu…

华硕 触摸板关闭以及开启

关闭&#xff1a;fnf9 开启&#xff1a;再次fnf9

关闭华硕笔记本触摸屏

刚开始用华硕专有的快捷键FnF9&#xff0c;尝试无效&#xff1b; 卸载鼠标驱动后&#xff0c;笔记本上的键盘功能也失效了&#xff1b; 重启电脑不能用键盘输入密码&#xff0c;启用屏幕键盘进去了&#xff0c;重装驱动&#xff1b; 在BIOS中关闭触屏键盘&#xff1a; 在advanc…