一、导数据
1、import和export
Sqoop可以在HDFS/Hive和关系型数据库之间进行数据的导入导出,其中主要使用了import和export这两个工具。这两个工具非常强大, 提供了很多选项帮助我们完成数据的迁移和同步。比如,下面两个潜在的需求: 1、业务数据存放在关系数据库中,如果数据量达到一定规模后需要对其进行分析或同统计,单纯使用关系数据库可能会成为瓶颈, 这时可以将数据从业务数据库数据导入(import)到Hadoop平台进行离线分析。 2、对大规模的数据在Hadoop平台上进行分析以后,可能需要将结果同步到关系数据库中作为业务的辅助数据,这时候需要 将Hadoop平台分析后的数据导出(export)到关系数据库。
[root@hadoop-senior sqoop-1.4.5-cdh5.3.6]# bin/sqoop help import
[root@hadoop-senior sqoop-1.4.5-cdh5.3.6]# bin/sqoop help export
2、import参数
##sqoop通用参数 --connect <jdbc-uri>:指定JDBC连接字符串。 --connection-manager <class-name>:指定要使用的连接管理器类。 --driver <class-name>:手动指定要使用的JDBC驱动程序类。 --hadoop-mapred-home <dir>:覆盖$ HADOOP_MAPRED_HOME。 --help:打印使用说明。 --password-file:为包含认证密码的文件设置路径。 -P:从控制台读取密码。 --password <password>:设置验证密码。 --username <username>:设置验证用户名。 --verbose:在运行时打印更多信息。 --connection-param-file <filename>:提供连接参数的可选属性文件。 --relaxed-isolation:将mapper的连接事务隔离设置为只读。 ##import参数 --append 将数据追加到HDFS上一个已存在的数据集上 --as-avrodatafile 将数据导入到Avro数据文件 --as-sequencefile 将数据导入到SequenceFile --as-textfile 将数据导入到普通文本文件(默认) --boundary-query <statement> 边界查询,用于创建分片(InputSplit) --columns <col,col,col…> 从表中导出指定的一组列的数据 --delete-target-dir 如果指定目录存在,则先删除掉 --direct 使用直接导入模式(优化导入速度) --direct-split-size <n> 分割输入stream的字节大小(在直接导入模式下) --fetch-size <n> 从数据库中批量读取记录数 --inline-lob-limit <n> 设置内联的LOB对象的大小 -m,--num-mappers <n> 使用n个map任务并行导入数据 -e,--query <statement> 导入的查询语句 --split-by <column-name> 指定按照哪个列去分割数据 --table <table-name> 导入的源表表名 --target-dir <dir> 导入HDFS的目标路径 --warehouse-dir <dir> HDFS存放表的根路径 --where <where clause> 指定导出时所使用的查询条件 -z,--compress 启用压缩 --compression-codec <c> 指定Hadoop的codec方式(默认gzip) --null-string <null-string> 果指定列为字符串类型,使用指定字符串替换值为null的该类列的值 --null-non-string <null-string> 如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值
3、在MySQL中准备一些数据
mysql> use test; Database changed mysql> CREATE TABLE `my_user` ( -> `id` tinyint(4) NOT NULL AUTO_INCREMENT, -> `account` varchar(255) DEFAULT NULL, -> `passwd` varchar(255) DEFAULT NULL, -> PRIMARY KEY (`id`) -> ); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO `my_user` VALUES ('1', 'admin', 'admin'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('2', 'pu', '12345'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('3', 'system', 'system'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('4', 'zxh', 'zxh'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('5', 'test', 'test'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('6', 'pudong', 'pudong'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('7', 'qiqi', 'qiqi'); Query OK, 1 row affected (0.00 sec)
4、将mysql表导出到hdfs
##这里没有指定存到hdfs哪里,会默认存储hdfs用户主目录下以表名为目录存储 bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user ##默认存储,默认用了4个map [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -ls -R /user/root 19/05/06 15:55:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable drwxr-xr-x - root supergroup 0 2019-05-06 15:53 /user/root/my_user -rw-r--r-- 1 root supergroup 0 2019-05-06 15:53 /user/root/my_user/_SUCCESS -rw-r--r-- 1 root supergroup 25 2019-05-06 15:53 /user/root/my_user/part-m-00000 -rw-r--r-- 1 root supergroup 26 2019-05-06 15:53 /user/root/my_user/part-m-00001 -rw-r--r-- 1 root supergroup 12 2019-05-06 15:53 /user/root/my_user/part-m-00002 -rw-r--r-- 1 root supergroup 28 2019-05-06 15:53 /user/root/my_user/part-m-00003
指定存储目录,设置用1个map:
## bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/root/sqoop/imp_my_user \ --num-mappers 1 ## [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -ls -R /user/root/sqoop 19/05/06 16:01:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable drwxr-xr-x - root supergroup 0 2019-05-06 16:01 /user/root/sqoop/imp_my_user -rw-r--r-- 1 root supergroup 0 2019-05-06 16:01 /user/root/sqoop/imp_my_user/_SUCCESS -rw-r--r-- 1 root supergroup 91 2019-05-06 16:01 /user/root/sqoop/imp_my_user/part-m-00000
二、执行流程
sqoop 底层的实现就是MapReduce,对import来说,仅仅运行Map Task
三、设置数据存储格式为parquet
1、先把mysql的数据导出到hdfs
## bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/root/sqoop/imp_my_user_parquet \ --fields-terminated-by ',' \ --num-mappers 1 \ --as-parquetfile
2、再将数据从hdfs导入到hive
##在hive中先创建一张表 drop table if exists default.hive_user_orc ; create table default.hive_user_orc( id int, username string, password string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS parquet ; ##导入数据 hive (default)> load data inpath '/user/root/sqoop/imp_my_user_parquet' into table default.hive_user_orc ; #查询,此时数据都为空,格式为parquet文件,这是sqoop1.4.5的一个bug,1.4.6已经修复; hive (default)> select * from default.hive_user_orc ;
四、导入数据使用query
1、选择导出所需的列
##只导出 id和account这两列 bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/root/sqoop/imp_my_user_column \ --num-mappers 1 \ --columns id,account ## [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -text /user/root/sqoop/imp_my_user_column/part-m-00000 19/05/06 16:39:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 1,admin 2,pu 3,system 4,zxh 5,test 6,pudong 7,qiqi
2、query
* 在实际的项目中,要处理的数据,需要进行初步清洗和过滤 * 某些字段过滤 * 条件 * join
##--query参数,直接写一条select语句 bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --query 'select id, account from my_user where $CONDITIONS' \ --target-dir /user/root/sqoop/imp_my_user_query \ --num-mappers 1 ## [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -text /user/root/sqoop/imp_my_user_query/part-m-00000 19/05/06 16:58:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 1,admin 2,pu 3,system 4,zxh 5,test 6,pudong 7,qiqi
五、import hdfs设置数据压缩为sanppy
1、设置hadoop支持sanppy压缩
[root@hadoop-senior cdh]# tar zxf cdh5.3.6-snappy-lib-natirve.tar.gz [root@hadoop-senior lib]# rm -rf /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/native [root@hadoop-senior lib]# cp -r native/ /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/ ##查看是否已经支持 [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hadoop checknative 19/05/06 17:13:56 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native 19/05/06 17:13:56 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library Native library checking: hadoop: true /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/native/libhadoop.so.1.0.0 zlib: true /lib64/libz.so.1 snappy: true /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/native/libsnappy.so.1 lz4: true revision:99 bzip2: true /lib64/libbz2.so.1
2、
bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/root/sqoop/imp_my_sannpy \ --delete-target-dir \ --num-mappers 1 \ --compress \ --compression-codec org.apache.hadoop.io.compress.SnappyCodec #--delete-target-dir 目标目录存在则删除 #--compress 启用压缩
转自:https://www.cnblogs.com/weiyiming007/p/10820932.html