sqoop将mysql数据导入hdfs和hive学习笔记

本文详细介绍如何使用SQLOOP工具将MySQL数据导入HDFS和HIVE,包括配置步骤、命令参数解析及常见错误处理。通过实例演示,帮助读者掌握数据迁移技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#安装好以后将mysql驱动mysql-connector-java-5.1.21-bin.jar放到sqoop安装目录的lib下面

一、将mysql数据导入hdfs,命令如下:

[root@master bin]# /apps/sqoop-1.4.7/bin/sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password xxxxxx \
--table t_user \
--target-dir /sqoop/localhost/sqoop/t_user \
--delete-target-dir \
--num-mappers 1 \
--compress \
--compression-codec org.apache.hadoop.io.compress.SnappyCodec \
--fields-terminated-by '|'

导入成功:

–append				将数据追加到hdfs中已经存在的dataset中。使用该参数,sqoop将把数据先导入到一个临时目录中,
				然后重新给文件命名到一个正式的目录中,以避免和该目录中已存在的文件重名。

–as-avrodatafile		将数据导入到一个Avro数据文件中

–as-sequencefile		将数据导入到一个sequence文件中

–as-textfile			将数据导入到一个普通文本文件中,生成该文本文件后,可以在hive中通过sql语句查询出结果。

–boundary-query <statement>	边界查询,也就是在导入前先通过SQL查询得到一个结果集,然后导入的数据就是该结果集内的数据,
				格式如:–boundary-query ‘select id,creationdate from person where id = 3’,表示导入的数据为id=3的记录,
				或者select min(<split-by>), max(<split-by>) from <table name>,注意查询的字段中不能有数据类型为字符串的字段,
				否则会报错:java.sql.SQLException: Invalid value for getLong()目前问题原因还未知

–columns<col,col,col…>		指定要导入的字段值,格式如:–columns id,username

–direct				直接导入模式,使用的是关系数据库自带的导入导出工具。官网上是说这样导入会更快

–direct-split-size		在使用上面direct直接导入的基础上,对导入的流按字节数分块,特别是使用直连模式从PostgreSQL导入数据的时候,
				可以将一个到达设定大小的文件分为几个独立的文件。

–inline-lob-limit		设定大对象数据类型的最大值

-m,–num-mappers			启动N个map来并行导入数据,默认是4个,最好不要将数字设置为高于集群的节点数

–query,-e<statement>		从查询结果中导入数据,该参数使用时必须指定–target-dir、–hive-table,在查询语句中一定要有where条件且在where条件中需要包含$CONDITIONS,
				示例:–query ‘select * from person where $CONDITIONS ‘ –target-dir /user/hive/warehouse/person –hive-table person

–split-by<column-name>		表的列名,用来切分工作单元,一般后面跟主键ID

–table <table-name>		关系数据库表名,数据从该表中获取

–target-dir <dir>		指定hdfs路径

–warehouse-dir <dir>		与–target-dir不能同时使用,指定数据导入的存放目录,适用于hdfs导入,不适合导入hive目录

–where				从关系数据库导入数据时的查询条件,示例:–where ‘id = 2′

-z,–compress			压缩参数,默认情况下数据是没被压缩的,通过该参数可以使用gzip压缩算法对数据进行压缩,适用于SequenceFile, text文本文件, 和Avro文件

–compression-codec		Hadoop压缩编码,默认是gzip

–null-string <null-string>	可选参数,如果没有指定,则字符串null将被使用

–null-non-string<null-string>	可选参数,如果没有指定,则字符串null将被使用

二、将mysql数据导入hive,命令如下:

/apps/sqoop-1.4.7/bin/sqoop import \
-Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password xxxxxx \
--table sx_hospital \
--target-dir /sqoop/localhost/sqoop/sx_hospital \
--delete-target-dir \
--num-mappers 1 \
--hive-import \
--hive-database hadoop_dw \
--hive-table sx_hospital \
--hive-drop-import-delims \
--create-hive-table \
--hive-overwrite \
--fields-terminated-by '|'

导入过程中可能遇到的错误及解决办法:

执行报错:
19/03/05 17:48:25 ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
19/03/05 17:48:25 ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
	at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:50)
	at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392)
	at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.java:379)
	at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337)
	at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)
	at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:537)
	at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628)
	at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
	at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
	at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:264)
	at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44)
	... 12 more
解决办法:
1、将sqoop安装目录下的conf目录中的sqoop-env-template.sh复制为sqoop-env.sh
并且指定

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/apps/hadoop-2.8.0

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/apps/hadoop-2.8.0

#set the path to where bin/hbase is available
export HBASE_HOME=/apps/hbase-1.2.6

#Set the path to where bin/hive is available
export HIVE_HOME=/apps/hive-1.2.1

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/apps/zookeeper-3.4.10

2、解决办法
在/etc/profile中添加:
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*:$HIVE_CONF_DIR
记得source /etc/profile

在~/.bash_profile中添加:
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*:$HIVE_CONF_DIR
记得source ~/.bash_profile

mysql数据样例:

/*
 Navicat Premium Data Transfer

 Source Server         : localhost-mysql
 Source Server Type    : MySQL
 Source Server Version : 50722
 Source Host           : localhost:3306
 Source Schema         : hadoop_dw

 Target Server Type    : MySQL
 Target Server Version : 50722
 File Encoding         : 65001

 Date: 04/03/2019 09:24:33
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sx_hospital
-- ----------------------------
DROP TABLE IF EXISTS `sx_hospital`;
CREATE TABLE `sx_hospital`  (
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `latlng` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `province` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `city` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `area` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`latlng`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sx_hospital
-- ----------------------------
INSERT INTO `sx_hospital` VALUES ('济民医院', '110.31956,34.646432', '山西省', '运城市', '芮城县', '风陵渡镇');
INSERT INTO `sx_hospital` VALUES ('蒲州医院', '110.335746,34.837638', '山西省', '运城市', '永济市', '山西省运城市永济市张风线蒲州镇中心卫生院');
INSERT INTO `sx_hospital` VALUES ('健民医院', '110.435347,34.886854', '山西省', '运城市', '永济市', '涑水西街283号');
INSERT INTO `sx_hospital` VALUES ('永济黄河中医院', '110.449017,34.896502', '山西省', '运城市', '永济市', '舜都大道');
INSERT INTO `sx_hospital` VALUES ('永济市忠愍医院', '110.450128,34.894908', '山西省', '运城市', '永济市', '山西省运城市永济市舜都大道');
INSERT INTO `sx_hospital` VALUES ('康宁医院', '110.455258,34.89246', '山西省', '运城市', '永济市', '828县道附近');
INSERT INTO `sx_hospital` VALUES ('永济市人民医院', '110.458271,34.868693', '山西省', '运城市', '永济市', '山西省运城市永济市银杏东街9号');
INSERT INTO `sx_hospital` VALUES ('万荣县第二人民医院', '110.554863,35.362433', '山西省', '运城市', '万荣县', '荣河镇');
INSERT INTO `sx_hospital` VALUES ('临猗县第二人民医院', '110.560605,35.10071', '山西省', '运城市', '临猗县', '临晋镇西街26号');
INSERT INTO `sx_hospital` VALUES ('山西省芮城县大王医院', '110.564027,34.693207', '山西省', '运城市', '芮城县', '山西省运城市芮城县新兴曹风线大王镇中心卫生院');
INSERT INTO `sx_hospital` VALUES ('万荣福祯医院', '110.566621,35.360069', '山西省', '运城市', '万荣县', '福祯创伤骨科医院附近');

SET FOREIGN_KEY_CHECKS = 1;

如果该表没有主键运行一个map执行导入Hive的命令(如果Hive中没有存在对应的hive表,则会依据mysql 的表来创建对应的表,字段属性也跟mysql的一致)

导入成功:

### 回答1: sqoop是一个用于在Hadoop关系型数据库之间传输数据的工具。以下是将MySQL数据导入HDFS的步骤: 1. 首先,需要安装sqoop并配置好MySQL的连接信息。 2. 然后,使用以下命令将MySQL导入HDFSsqoop import --connect jdbc:mysql://localhost:3306/mydatabase --username myuser --password mypassword --table mytable --target-dir /myhdfsdir 其中,mydatabase是MySQL数据库名称,myusermypassword是MySQL登录用户名密码,mytable是要导入MySQL表名,/myhdfsdirHDFS上的目标目录。 3. 执行命令后,sqoop将会自动创建一个HDFS目录,并将MySQL表的数据导入到该目录中。 4. 如果需要将MySQL表的数据导入Hive中,可以使用以下命令: sqoop import --connect jdbc:mysql://localhost:3306/mydatabase --username myuser --password mypassword --table mytable --hive-import --hive-table myhivetable 其中,myhivetable是要创建的Hive表名。 5. 执行命令后,sqoop将会自动创建一个Hive表,并将MySQL表的数据导入到该表中。 以上就是使用sqoopMySQL数据导入HDFS的步骤。 ### 回答2: Sqoop是Hadoop中非常实用的工具集之一,它的主要功能是在Hadoop中进行结构化的数据转移,它有两个核心组件:导入导出。本文将讨论Sqoop如何将Mysql数据库中的数据导入到Hadoop的分布式文件系统(HDFS)中。 在开始Sqoop导入MySQL数据HDFS之前,您需要确保已安装好Sqoop以及Hadoop集群MySQL数据库。如果您没有安装,请首先安装这些工具。 以下是使用Sqoop导入MySQL数据HDFS的步骤: 1.设置MySQL数据库用户密码: 在导入数据之前,必须设置MySQL的用户名密码。可使用以下命令创建一个授权用户: create user 'username'@'localhost' identified by 'password'; grant all privileges on *.* to 'username'@'localhost' with grant option; 2.运行Sqoop: 启动Sqoop的命令如下: sqoop-import --connect jdbc:mysql://localhost:3306/test --username username --password password --table tablename --target-dir /path/to/hdfs/directory -m 1 其中,--connect是指定数据库的连接URL,--username--password是指定数据库的用户名密码,--table是指定要导入的表名称,--target-dir是指定将数据导入到的HDFS目录,-m是指定使用的MapReduce任务的数量。 3.执行导入任务: 在运行Sqoop命令后,Sqoop将执行导入任务,并将MySQL数据库中的数据导入HDFS目录中。您可以使用以下命令来查看导入数据: hadoop fs -cat /path/to/hdfs/directory/part-m-00000 在本文中,我们介绍了如何使用SqoopMySQL数据库中的数据导入HDFS中。Sqoop是Hadoop生态系统中非常实用的工具,可以帮助用户快速地从各种数据源中导入结构化数据,并将其转换为Hadoop所需的格式。无论您是在进行数据分析、数据挖掘还是其他用途,都可以使用Sqoop来实现您的需求。 ### 回答3: Sqoop是一个用于在Apache Hadoop关系型数据库之间传输数据的工具,可以将关系型数据库中的数据导入到Hadoop分布式文件系统(HDFS)中或将HDFS中的数据导出到关系型数据库中。 对于将MySQL数据导入HDFS中的流程,首先需要安装好SqoopMySQL数据库,并保证它们可以正常工作。接下来,可以按照下面的步骤进行操作: 1. 首先,需要创建一个导入任务,可以使用Sqoop Import语法来创建任务。例如,sqoop import -connect jdbc:mysql://localhost/test -username root -password xxxx -table students -target-dir /user/hadoop/students可以将MySQL的students表中的数据导入HDFS中的/user/hadoop/students目录中。 2. 在运行Sqoop之前,还需要确保在Hadoop集群中创建了目标目录。可以使用以下命令创建目录:hadoop fs -mkdir /user/hadoop/students。 3. 接下来,运行Sqoop命令以从MySQL数据库中提取数据并将其写入HDFS中的目标目录。在这个过程中,Sqoop使用Java数据库连接(JDBC)来读取MySQL数据并将其转换为适合HDFS存储的格式。 4. Sqoop还可以支持将数据进行压缩并将其导入HDFS中。根据需要,可以使用如下命令实现数据压缩:sqoop import -connect jdbc:mysql://localhost/test -username root -password xxxx -table students --compression-codec org.apache.hadoop.io.compress.GzipCodec -m 1 --target-dir /user/hadoop/students/gzip。 5. 最后,可以使用HDFS命令hadoop fs -ls /user/hadoop/students来验证数据已经成功导入HDFS中。 总之,使用SqoopMySQL数据导入HDFS中的过程比较简单,只需要遵循上述步骤即可。使用Sqoop可以大大简化数据传输的过程,并且支持许多可配置选项,以便根据数据的不同需要进行灵活的设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值