1.下载
https://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
2.上传安装包
sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
注意:sqoop安装包的选择,要选择安装包中含有
bin
字符的安装包,否则运行会报错:缺少文件!
使用Xshell工具的xftp插件上传sqoop安装包到
usr/local/
3.解压sqoop安装包
#解压安装包
[root@hadoop01 local]#tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
#重命名sqoop目录
[root@hadoop01 local]#mv sqoop-1.4.7 sqoop
4.配置环境变量
#编辑环境变量配置文件
[root@hadoop01 local]#vi /etc/profile
#向其中追加以下内容
export SQOOP_HOME=/usr/local/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
#重新加载配置文件
[root@hadoop01 local]#source /etc/profile
5.添加 JDBC驱动jar包
#将用于连接mysql的JDBC驱动包添加到sqoop目录下的lib目录中,以下命令从hive中复制而来
[root@hadoop01 local]#cp hive/lib/mysql-connector-java-5.1.49-bin.jar sqoop/lib/
6.修改配置文件
在 Sqoop 安装目录的 conf 子目录下,系统已经提供了一个环境变量文件模板sqoop-env-template.sh,使用 cp 操作复制一个副本,并改名为 sqoop-env.sh,修改sqoop-env.sh (可选,一般安装了Hadoop、HBase、Hive后可不配置此文件)
#修改sqoop运行的环境变量文件sqoop-env.sh
[root@hadoop01 local]#cd sqoop/conf/
[root@hadoop01 conf]#cp sqoop-env.template.sh sqoop-env.sh
[root@hadoop01 conf]#vi sqoop-env.sh
#追加以下内容到文件中
export HADOOP_COMMON_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
7.测试
(1)测试Sqoop是否配置成功
[root@hadoop01 conf]#cd
#查看sqoop的版本号
[root@hadoop01 ~]#sqoop version
#查看sqoop的命令参数
[root@hadoop01 ~]#sqoop help
(2)修改sqoop启动信息
启动的时候,有相关的警告信息,我们可以配置bin/configure-sqoop 文件,先注销对应的相关语句.
建议:使用notpad++进行编辑,使用其列模式:按住Alt键,垂直拖动鼠标即可以列模式编辑。
#注释掉对应行号 75~107 行的内容
#注释掉对应行号 129~147 行的内容
#注释掉对应行号 227~228 行的内容
#注释掉对应行号 230~231 行的内容
8.sqoop操作
连接对应MySQL数据库
- 交互式访问
[root@hadoop01 ~]#sqoop list-databases --connect jdbc:mysql://hadoop03:3306 --username root --password 123456
- 文件授权访问
#生成密码文件,为隐藏文件
[root@hadoop01 ~]#echo -n "123456" > .password
#查看文件
[root@hadoop01 ~]#ls -a
[root@hadoop01 ~]#cat .password
#修改文件访问权限为400
[root@hadoop01 ~]#chmod 400 .password
#将密码文件上传至HDFS
[root@hadoop01 ~]#hdfs dfs -put .password /
#使用密码文件访问mysql数据库
[root@hadoop01 ~]#sqoop list-databases --connect jdbc:mysql://hadoop03:3306 --username root --password-file /.password
**使用 Sqoop 获取指定 URL 数据库中所有表**
[root@hadoop01 ~]#sqoop list-tables --connect jdbc:mysql://hadoop03:3306/mysql?useSSL=false --username root --password 123456
sqoop导入数据
#使用xshell上传文件EMP.sql#在安装mysql的节点上登录mysql [root@hadoop03 ~]#mysql -u root -p 123456#在 MySQL 中新建一个sqoop_db 数据库 mysql>create database sqoop_db; mysql>use sqoop_db;#导入EMP.sql文件到sqoop_db 数据库中 mysql>source /root/EMP.sql;#查看数据 mysql>show tables; #查询数据 mysql>select * from EMP;
Import导入对应参数• 通用参数--connect <jdbc-url> : 指定JDBC连接串--username <username> : 用户名--password <password> : 密码--password-file: 包含密码的文件• 导入控制参数--append :追加数据至已存在的HDFS数据集--columns<col,col,col…> :指定导入的列-e,--query<statement> :执行SQL语句,查询结果将被导入--table<table-name> :读取的表名--target-dir<dir> :将导入的HDFS目录,用于单表路径指定--warehouse-dir :将导入的HDFS目录,用于多表路径指定--where<where express> :条件过滤--delete-target-dir :如果目录存在则删除目录-m,--num-mappers :导入时并行map任务数量-z,--compress :启用压缩--mapreduce-job-name<name> :作业名称• 输入格式控制参数--input-enclosed-by<char> :设置输入字符包围符--input-escaped-by<char> :设置输入转义符--input-fields-terminated-by<char> :设置输入字段分隔符--input-lines-terminated-by<char> :设置输入行分隔符• 输出格式控制参数--fields-terminated-by<char> :设置字段分隔符--lines-terminated-by<char> :设置行分隔符• Hive 参数--create-hive-table :自动创建Hive表--hive-database<database-name> :设置Hive数据库名--hive-import :导入RDBMS表至Hive--hive-overwrite :如果数据存在则覆盖--hive-partition-key :分区键--hive-partition-value :分区值--hive-table<table-name> :指定导入Hive的表• HBase 参数--column-family<family> :设置导入的目标列族--hbase-create-table :自动创建HBase表--hbase-row-key
:指定哪一列作为RowKey--hbase-table :指定导入的HBase表名--hbase-bulkload :启用批量加载 将mysql中的数据导入到HDFS
[root@hadoop01 ~]#sqoop import --connect jdbc:mysql://hadoop03:3306/sqoop_db?useSSL=false --username root --password 123456 --table EMP -m 1 --columns "EMPNO,ENAME,JOB,SAL,COMM" --target-dir sqoop_emp_column --mapreduce-job-name fromMySQLToHDFS --delete-target-dir
**查看导入HDFS的数据**
[root@hadoop01 ~]#hdfs dfs -ls /user/root/sqoop_emp_column
[root@hadoop01 ~]#hdfs dfs -text /user/root/sqoop_emp_column/part*
导入表数据并指定压缩格式以及存储格式
[root@hadoop01 ~]#sqoop import --connect jdbc:mysql://hadoop03:3306/sqoop_db?useSSL=false --username root --password 123456 --table EMP -m 1 --target-dir sqoop_emp_parquet --mapreduce-job-name fromMySQLToHDFS --as-parquetfile --compression-codec org.apache.hadoop.io.compress.SnappyCodec --delete-target-dir
--as-parquet :指定导出格式为 Parquet 格式,当然也可指定导出格式为 SequenceFile 等其他格式。
--compression-codec : 指定压缩使用的 codec 编码;因为在 Sqoop 中默认时使用压缩的,所以此次只须指定 codec 编码即可。
使用web方式查看导入HDFS的数据
打开浏览器,输入
hadoop01:5007
,查看sqoop_emp_parquet目录中的数据。
导入表数据并使用指定的分隔符和条件
[root@hadoop01 ~]#sqoop import --connect jdbc:mysql://192.168.242.131:3306/sqoop_db?useSSL=false --username root --password 123456 --table EMP -m 1 --target-dir sqoop_emp_split --mapreduce-job-name fromMySQLToHDFS --fields-terminated-by '\t' --lines-terminated-by '\n' --where 'sal>2000' --delete-target-dir
--fields-terminated-by :设置字段之间的分隔符
--lines-terminated-by :设置行之间的分隔符
--where :指定 emp 表中满足条件的数
查看导入的数据
[root@hadoop01 ~]#hdfs dfs -ls /user/root/sqoop_emp_split
[root@hadoop01 ~]#hdfs dfs -text /user/root/sqoop_emp_split/part*
导入指定查询语句的数据
[root@hadoop01 ~]#sqoop import --connect jdbc:mysql://hadoop1:3306/sqoop_db?useSSL=false --username root --password 123456 --target-dir sqoop_emp_query
--query 'select * from EMP where sal>2000 and deptno=20 and $CONDITIONS' -m 1
--delete-target-dir
--query :指定查询语句,将查询结果导入到HDFS 中,最后需要添加 AND $CONDITIONS ,这是固定写法。--table 可以省略不写了。
使用 eval 可以执行SQL语句并显示结果
[root@hadoop01 ~]# sqoop eval --connect jdbc:mysql://hadoop1:3306/sqoop_db?useSSL=false --username root --password 123456 --query 'select * from EMP where DEPTNO=10'
注意:查询的结果不会保存在HDFS上
导出mysql中所有的表到HDFS
[root@hadoop01 ~]#sqoop import-all-tables --connect jdbc:mysql://localhost:3306/test?useSSL=false --username root --password 123456 --warehouse-dir /mysql/tables -m 1
运行Sqoop脚本以封装 import操作
上面介绍的Sqoop 的使用方式都是直接运行 Sqoop 脚本,这种方式使用起来比较麻烦。在Sqoop中提供了 --options-file 参数,开发人员可以先将 Sqoop 脚本封装到一个文件中,然后使用 --options-file 参数来指定封装后的脚本并运行,这样可以方便后期的维护。
- 在 sqoop安装目录下创建一个 sqoop_data\emp.opt 文件,注意:每个参数和值均占单独一行。
- 编写emp.opt文件内容 注意:每个参数和值均占单独一行
import
--connect jdbc:mysql://hadoop03:3306/sqoop_db?useSSL=false
--username
root
--password
123456
--target-dir
sqoop_emp_options_file
--table
EMP
-m
1
--delete-target-dir
- 运行脚本文件
[root@hadoop01 sqoop_data]#sqoop --options-file emp.opt
导入 MySQL****数据到 Hive
将 MySQL数据导入到 Hive 的执行原理:先将 MySQL数据导入到HDFS 上,然后再使用 load 函数将 HDFS 的文件加载到 Hive 表中
**注意:需要再 Sqoop\lib 包下加入 Hive 的相关组件包,在hive/lib/目录中的两个jar包:
hive-common-1.2.1.jar hive-exec-1.2.1.jar
**
- Hive 参数说明:--create-hive-table :自动创建Hive表--hive-database<database-name> :设置Hive数据库名--hive-import :导入RDBMS表至Hive--hive-overwrite :如果数据存在则覆盖--hive-partition-key :分区键--hive-partition-value :分区值--hive-table<table-name> :指定导入Hive的表
- 导入数据到Hive,编写
emp1.opt
脚本
import
--connect
jdbc:mysql://hadoop03:3306/sqoop_db?useSSL=false
--username
root
--password
123456
--target-dir
sqoop_emp_options_file
--table
EMP
-m
1
--delete-target-dir
--hive-import
--create-hive-table
--hive-database
wise_db
--hive-table
emp_import
导出 HDFS 数据到 MySQL 上
在导出数据 (表) 前需要先创建待导出表的结构,如果待导出的表在数据库中不存在,则报错;
如果重复导出表,则表中的数据会重复。
- sqoop-export
//通用参数
Common arguments:
--connect <jdbc-uri>
--password <password>
--username <username>
// 导出控制参数
Export control arguments:
--batch
--columns <col,col,col...>
--direct
--export-dir <dir>
-m,--num-mappers <n>
--mapreduce-job-name <name>
--table <table-name>
// 输入文件参数配置
Input parsing arguments:
--input-fields-terminated-by <char>
--input-lines-terminated-by <char>
// 输出文件参数配置
Output line formatting arguments:
--fields-terminated-by <char>
--lines-terminated-by <char>
- 导出 HDFS 数据到 MySQL
#在mysql中创建表结构
mysql>use sqoop_db;
mysql>create table emp_demo as select * from EMP where 1=2;
mysql>select * from emp_demo;
#导出HDFS数据到mysql的表emp_demo
[root@hadoop01 ~]#sqoop export --connect jdbc:mysql://hadoop03:3306/sqoop_db?useSSL=false --username root --password 123456 --columns "EMPNO,ENAME,JOB,SAL,COMM,DEPTNO" --table emp_demo --export-dir /user/root/emp -m 1
--export-dir :指出将要导出的数据目录。注意:每运行一次上述代码,就会重新插入数据到MySQL
版权归原作者 Saddam_J 所有, 如有侵权,请联系我们删除。