一、概述

  1.sqoop是什么

    从其官网:http://sqoop.apache.org/

  Apache Sqoop(TM) is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases

    中文来说,就是:

sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。

  导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;

  导出数据:从Hadoop的文件系统中导出数据到关系数据库

    简而言之,sqoop是一个数据迁移工具!

  2.主要原理  

    将导入或导出命令翻译成mapreduce程序来实现

    在翻译出的mapreduce中主要是对inputformat和outputformat进行定制

二、安装与配置

    1.准备

      本地具备java与hadoop环境,下载sqoop,下载地址:http://archive.apache.org/dist/sqoop/1.4.6/

      // 这里的Alpha表示的是内测版

      将下载的sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz上传到服务器

    2.解压

[hadoop@mini1 ~]$ tar -zxvf sqoop-1.4..bin__hadoop-2.0.-alpha.tar.gz 

    // 位置可以按照自己的习惯进行定义

[hadoop@mini1 ~]$ mv sqoop-1.4..bin__hadoop-2.0.-alpha sqoop

    3.修改配置文件

[hadoop@mini1 ~]$ cd sqoop/
[hadoop@mini1 sqoop]$ cd conf/
[hadoop@mini1 conf]$ mv sqoop-env-template.sh sqoop-env.sh

    通过which/whereis 定位一下hadoop等目录

    打开 sqoop-env.sh,修改以下几项(打开注释,添加相关值):

export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.4/
export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.4/
export HIVE_HOME=/home/hadoop/apps/hive-1.2.

    4.加入Mysql的jdbc驱动包

      由于我们是向MySQL导数据,所以需要的是对应的驱动包到Lib目录(这里就直接从hive里面拿了)

[hadoop@mini1 sqoop]$ cp ~/apps/hive-1.2./lib/mysql-connector-java-5.1..jar ./lib/

    5.验证启动     

[hadoop@mini1 sqoop]$ bin/sqoop

    // 如果配置了环境变量,将可以直接通过sqoop启动

    6.查看帮助

[hadoop@mini1 sqoop]$ bin/sqoop help
usage: sqoop COMMAND [ARGS]

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.

三、sqoop数据导入

  “导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)

  1.数据库导入HDFS

    1.语法

$ sqoop import (generic-args) (import-args) 

  // 完整参数,参考:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_literal_sqoop_import_literal

    2.示例

bin/sqoop import \
--connect jdbc:mysql://mini1:3306/test \
--username root \
--password Zcc170821# \
--table girl \
--m

   -m,--num-mappers <n> Use n map tasks to import in parallel,其他完整参数,参考文档

   未指定--target-dir /user/sqoop/test1 则默认为/user/hadoop/表名,这里可以进行在HDFS上的查看:

[hadoop@mini1 lib]$ hadoop fs -cat /user/hadoop/girl/part-m-

  2.导入关系表到Hive

    其实基本上是从数据库到hdfs,再Load到hive的表,不过这里可以一步到位了

bin/sqoop import \
--connect jdbc:mysql://mini1:3306/test \
--username root \
--password Zcc170821# \
--table girl \
--target-dir /user/hadoop/girl2 \
--hive-import \
--m

 

   3.导入数据子集

    有时候只想导入数据表中的一部分数据,可以通过where来进行过滤筛选:

bin/sqoop import \
--connect jdbc:mysql://mini1:3306/test \
--username root \
--password Zcc170821# \
--where "id > 5" \
--target-dir /user/hadoop/girl3 \
--table girl \
--m

    当然,如果单纯where无法满足,可以使用自定义的query语句来筛选:——注意只要写了where则后面的 and \$CONDITIONS是死的,必须这么写!

bin/sqoop import \
--connect jdbc:mysql://mini1:3306/test \
--username root \
--password Zcc170821# \
--query "select * from girl where name='11' and id>6 and \$CONDITIONS" \
--target-dir /user/hadoop/girl3 \
--table girl \
--m

    也可以使用split by来指定切片字段,这样就结合--m参数分配了

--split-by id \
--m

    或者指定字段的分隔符,这样到HDFS就是这个分割符了。这样以后建表从hive映射就使用这个分隔符了:

--fields-terminated-by <char>

  4.增量导入 

    增量导入( Incremental Imports)是仅导入新添加的表中的行的技术。

    它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入

bin/sqoop import \
--connect jdbc:mysql://mini1:3306/test \
--username root \
--password Zcc170821# \
--table girl --m \
--target-dir /user/hadoop/girl4 \
--incremental append \
--check-column id \
--last-value

   // 如果不想一直因为已经存在target-dir而新建,可以使用参数delete-target-dir,这样就会自动删除已经存在的目录了!请选择性使用

  这样,targer-dir里面就是新增的数据了:

[hadoop@mini1 lib]$ hadoop fs -cat /user/hadoop/girl4/part-m-
,,aa
,,bb

四、sqoop数据导出 

   1.从HDFS中导出

   将数据从HDFS导出到RDBMS数据库

  导出前,目标表必须存在于目标数据库中

    默认操作是从将文件中的数据使用INSERT语句插入到表中

    更新模式下,是生成UPDATE语句更新表数据

  1.手动创建目标表

两种方法复制表结构:
1.create table B as select * from A where 1=2;
或者:
2.create table B like A;

  这里就复制上面的girl的表结构了

  2.执行导出命令

bin/sqoop export \
--connect jdbc:mysql://mini1:3306/test \
--username root \
--password Zcc170821# \
--table girl2 \
--export-dir /user/hadoop/girl/

  如果文件不是默认的,分隔符,则添加指定参数:

--fields-terminated-by '\t'

  2.sqoop作业

    sqoop也支持作业的形式

      --create创建

bin/sqoop job --create myimportjob -- import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1

      --list查看

$ sqoop job --list

      --show查看

$ sqoop job --show myjob

      --exec执行

$ sqoop job --exec myjob
它会显示下面的输出。
// :: INFO tool.CodeGenTool: Beginning code generation
...

    但是我们可以用shell脚本的方式来运行调度,所以这个意义并不是很大.

最新文章

  1. python api
  2. MAGENTO - APACHE SOLR INTEGRATION - PART II (SETUP)
  3. Magic CSS3 – 创建各种神奇的交互动画效果
  4. SVN 搭建
  5. MySql变量,
  6. jquery select选中项 赋值
  7. [你必须知道的.NET]第一回:恩怨情仇:is和as
  8. MFC中Edit Control值的获取与赋值
  9. Oracle DBA 的常用Unix参考手册(二)
  10. 爬虫实现(hpricot)
  11. SGU 246. Black &amp; White(数论)
  12. C语言-运算符与表达式
  13. JSON XML IO数据操作
  14. PHP源代码加密
  15. Postgres客户端编码问题
  16. 215. Kth Largest Element in an Array(QuickSort)
  17. GitLab 搭建与使用
  18. R1(上)—R关联规则分析之Arules包详解
  19. thinkphp 5.1/tp5.1 route路由bug
  20. 解决IIS设置多个工作进程中Session失效的问题

热门文章

  1. Ajax 滚动异步加载数据
  2. 使用ArcGIS Runtime 100 进行本地GIS数据处理的注意事项
  3. mongodb2.X添加权限
  4. SpringMVC在Controller层中注入request的坑
  5. python SMTP 发送邮件
  6. 通过递增快照备份 Azure 非托管 VM 磁盘
  7. 试试SQLServer 2014的内存优化表(转载)
  8. 【Redis数据库】再有人问你CAP理论是什么,就把这篇文章发给他
  9. Oracle中,时间的相关操作方法
  10. 安装 Scala