SQOOP安装及使用

sqoop安装

1、上传并解压
tar -zxvf sqoop-1.4.7.bin__hadoop-2.0.4-a.gz -C ../
2、修改文件夹名字
mv sqoop-1.4.7.bin__hadoop-2.0.4-a.gz/ sqoop-1.4.7
3、修改配置文件
# 切换到sqoop配置文件目录
cd /usr/local/soft/sqoop-1.4.7/conf
# 复制配置文件并重命名
cp sqoop-env-template.sh sqoop-env.sh
# vim sqoop-env.sh 编辑配置文件,并加入以下内容
export HADOOP_COMMON_HOME=/usr/local/soft/hadoop-2.7.6
export HADOOP_MAPRED_HOME=/usr/local/soft/hadoop-2.7.6/share/hadoop/mapreduce
export HBASE_HOME=/usr/local/soft/hbase-1.4.6
export HIVE_HOME=/usr/local/soft/hive-1.2.1
export ZOOCFGDIR=/usr/local/soft/zookeeper-3.4.6/conf
export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6
​
# 切换到bin目录
cd /usr/local/soft/sqoop-1.4.7/bin
# vim configure-sqoop 修改配置文件,注释掉没用的内容

image.png

4、修改环境变量
vim /etc/profile
# 将sqoop的目录加入环境变量
5、添加MySQL连接驱动
# 从HIVE中复制MySQL连接驱动到$SQOOP_HOME/lib
cp /usr/local/soft/hive-1.2.1/lib/mysql-connector-java-5.1.49.jar /usr/local/soft/sqoop-1.4.7/lib/
6、测试
# 打印sqoop版本
sqoop version
# 测试MySQL连通性
sqoop list-databases -connect jdbc:mysql://master:3306/ -username root -password xxx

准备MySQL数据

登录MySQL数据库
mysql -u root -pxxx;
创建student数据库
create database studentdb;
切换数据库并导入数据
# mysql shell中执行
use studentdb;
source /usr/local/soft/bigdata30/student.sql;
source /usr/local/soft/bigdata30/score.sql;
导出MySQL数据库
mysqldump -u root -pxxxxxx 数据库名>任意一个文件名.sql

import

从传统的关系型数据库导入HDFS、HIVE、HBASE......

MySQLToHDFS
编写脚本,保存为MySQLToHDFS.conf
sqoop执行脚本有两种方式:第一种方式:直接在命令行窗口中直接输入脚本;第二种方式是将命令封装成一个脚本文件,然后使用另一个命令执行
第一种方式:

import \
--append \
--connect jdbc:mysql://master:3306/sqoopdb \
--username root \
--password xxxxxx \
--table student \
--m 1 \
--split-by id \
--target-dir /bigdata30/sqoopdata/studentOne/ \
--fields-terminated-by ','
​
第二种方式:使用脚本文件的形式  mysql2hdfs.conf
import
--append
--connect
jdbc:mysql://master:3306/
--username
root
--password
xxxxxx
--table
student
--m
1
--split-by
id
--target-dir
/bigdata30/sqoopdata/student2/
--fields-terminated-by
','
​
 
执行脚本
sqoop --options-file mysql2hdfs.conf
注意事项:

1、--m 表示指定生成多少个Map任务,不是越多越好,因为MySQL Server的承载能力有限

2、当指定的Map任务数>1,那么需要结合--split-by参数,指定分割键,以确定每个map任务到底读取哪一部分数据

3、如果指定的分割键数据分布不均,可能导致数据倾斜问题

4、分割的键最好指定数值型的,而且字段的类型为int、bigint这样的数值型

5、编写脚本的时候,注意:username参数,参数值不能和参数名同一行

--username root  // 错误的
​
// 应该分成两行
--username
root

6、运行的时候会报错InterruptedException,hadoop2.7.6自带的问题,忽略即可

WARN hdfs.DFSClient: Caught exception 
java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
    at java.lang.Thread.join(Thread.java:1252)
    at java.lang.Thread.join(Thread.java:1326)

7、实际上sqoop在读取mysql数据的时候,用的是JDBC的方式,所以当数据量大的时候,效率不是很高

8、sqoop底层通过MapReduce完成数据导入导出,只需要Map任务,不许需要Reduce任务 part-m-00000

9、每个Map任务会生成一个文件

MySQLToHive

先会将MySQL的数据导出来并在HDFS上找个目录临时存放,默认为:/user/用户名/表名

然后再将数据加载到Hive中,加载完成后,会将临时存放的目录删除

编写脚本,并保存为MySQLToHive.conf文件
import
--connect
jdbc:mysql://master:3306/sqoopdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
--username
root
--password
xxxxx
--table
student
--m
1
--hive-import
--hive-overwrite
--hive-database
bigdata30
--create-hive-table
--hive-table
sqoop_students1
--fields-terminated-by
','
执行脚本
sqoop --options-file mysql2hive.conf

需要将master上的/usr/bin/mysqldump分发至 node1、node2的/usr/bin目录下

scp /usr/bin/mysqldump node1:/usr/bin/
scp /usr/bin/mysqldump node2:/usr/bin/

sqoop在导入数据时,可以使用--e搭配sql来指定查询条件,并且还需在sql中添加

MySQLToHBase
编写脚本,并保存为MySQLToHBase.conf
import
--connect
jdbc:mysql://master:3306/sqoopdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
--username
root
--password
xxxxxx
--query
"select * from student where clazz='理科一班' "
--target-dir
/shujia/history/hbase_student
--m
1
--hbase-create-table
--hbase-table
mysql2hbase1
--column-family
info
--hbase-row-key
id
在HBase中创建student表
create 'studentsq','cf1'
执行脚本
sqoop --options-file MySQLToHBase.conf
export
HDFSToMySQL
编写脚本,并保存为HDFSToMySQL.conf

在往关系型数据库中导出的时候我们要先在关系型数据库中创建好库以及表,这些sqoop不会帮我们完成。

export
--export-dir  //导出目录
/user/hive/warehouse/emp1/
--columns
empno,ename,job,mgr,hiredate,sal,comm,deptno
--fields-terminated-by
','
--connect
jdbc:mysql://master:3306/sqoopdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
--username
root
--password
xxxxx
--table
sqoop_teacher
--num-mappers
1
先清空MySQL student表中的数据,不然会造成主键冲突
执行脚本
sqoop --options-file HDFSToMySQL.conf
查看sqoop help
sqoop help
​
Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information
​
See 'sqoop help COMMAND' for information on a specific command.
# 查看import的详细帮助
sqoop import --help
1、并行度不能太高,就是 -m
2、如果没有主键的时候,-m 不是1的时候就要指定分割字段,不然会报错,如果有主键的时候,-m不是1 可以不去指定分割字段,默认是主键,不指定 -m 的时候,Sqoop会默认是分4个map任务。

总结

RDBMS-->HDFS     import
HDFS(分布式文件管理系统)--->RDBMS(关系型数据管理系统)    export
​
Mysql--->HDFS(hive)
要知道你要数据的来源和数据的目的地
mysql:
--connect
jdbc:mysql://master:3306/sqoopdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
--username
root
--password
xxxxxx
--table
clazz30
--m
1
​
hdfs:
--target-dir
/user/hive/warehouse/sqooptest.db/from_mysql_student
--fields-terminated-by
'\t'
​
hive:
1)
--hive-import
--hive-overwrite
--create-hive-table 
--hive-database
bigdata30
--hive-table
from_mysql_student
--fields-terminated-by
','
2)
--target-dir
/user/hive/warehouse/bigdata30.db/sqoop_stu2
--fields-terminated-by
','
​
sqoop --options-file mysql2hive2.conf
# 增量需要添加的参数
--incremental 
append 
--check-column
id
--last-value
3
------------------------------------------------------------
--fields-terminated-by
'\t'
--check-column (hive的列名)
last_mod
--incremental
lastmodified
--last-value
"2024-06-26 23:11:09"
--m
1
-------------------------------------
--merge-key
name   (这里是根据姓名去重,可以改成自己的去重列名)
​
​
​
hbase:(如果hbase导入要创建表的话,需要将--hbase-create-table参数放到hbase参数的第一个才会生效)
--hbase-create-table
--hbase-table
students
--column-family
info
--hbase-row-key
id  (mysql中的列名)
--m
1
​
​
​
HDFS--->mysql
​
hdfs:
--columns
id,name,age,gender,clazz
--export-dir
/usr/local/soft/bigdata30/sqoopinput/
--fields-terminated-by
','
# 如果数据分割出来的字段值有空值,需要添加以下参数
--null-string 
'\\N' 
--null-non-string 
'\\N'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值