sqoop 知识及安装配置说明--hadoop安装系列之四

来源:互联网 发布:厦门千象品牌策划 知乎 编辑:程序博客网 时间:2024/06/04 17:41

    Sqoop是一种用于在Hadoop和关系数据库或数据仓库之间传输数据的工具。 您可以使用Sqoop将数据从关系数据库管理系统(RDBMS)(如MySQL或Oracle)或主机导入Hadoop分布式文件系统(HDFS),将数据转换为Hadoop MapReduce,然后将数据导出到RDBMS 。

        Apache Sqoop是一种用于有效传输结构化,半结构化和非结构化数据源之间数据的工具。 关系数据库是结构化数据源的示例,其存储的数据具有明确的模式。 Cassandra,Hbase是半结构化数据源的示例,HDFS是Sqoop可以支持的非结构化数据源的示例。

        Sqoop自动化操作导入导出的大部分过程,依靠数据库来描述要导入的数据的模式。 Sqoop使用MapReduce导入和导出数据,这提供并行操作以及容错功能。

       可以通过Hadoop提供的程序启动功能来调用Sqoop。 sqoop命令行程序是运行Hadoop附带的bin/ hadoop脚本的包装器。 如果您的计算机上存在多个Hadoop安装,则可以通过设置$ HADOOP_COMMON_HOME和$ HADOOP_MAPRED_HOME环境变量来选择Hadoop安装。

     一、导入过程解析

        导入进程的输入是数据库表或主机数据集。 对于数据库,Sqoop将逐行读取表格到HDFS。 对于主机数据集,Sqoop将从每个主机数据集读取记录到HDFS。 此导入过程的输出是一组文件,其中包含导入的表或数据集的副本。 导入过程是并行执行的。 因此,输出将在多个文件中。 这些文件可以是分隔的文本文件(例如,分隔每个字段的逗号或制表符),或包含序列化记录数据的二进制Avro或SequenceFiles。

        导入进程的副产品是一个生成的Java类,可以封装一行导入的表。 此类在Sqoop本身的导入过程中使用。 此类的Java源代码也提供给您,用于随后的MapReduce处理数据。

二、导出过程解析

       在操作导入的记录之后(例如,使用MapReduce或Hive),您可能有一个结果数据集,然后可以将其导出回关系数据库。 Sqoop的导出过程将从HDFS并行读取一组分隔的文本文件,将它们解析为记录,并将它们作为新行插入到目标数据库表中,供外部应用程序或用户使用。

      Sqoop包括一些其他命令,允许您检查正在使用的数据库。 例如,您可以列出可用的数据库模式(使用sqoop-list-databases工具)和模式中的表(使用sqoop-list-tables工具)。 Sqoop还包括一个原始的SQL执行shell(sqoop-eval工具)。

      对于数据库,您可以控制导入的特定行范围或列。 您可以为数据的基于文件的表示以及所使用的文件格式指定特定的分隔符和转义字符。 您还可以控制生成代码中使用的类或包名称。

        在使用Sqoop之前,必须安装并配置Hadoop的一个版本。 目前Sqoop正在支持4个主要的Hadoop版本 - 0.20,0.23,1.0和2.0。

       本文档提供如何下载sqoop1.4*版本,并提供相关安装及配置步骤

三、安装详细步骤

   1、下载sqoop1.4.6,链接地址如下,我是准备把文件在master上直接下载

http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz

[hadoop@master ~]$ wget http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz

   2、移动下载sqoop安装文件到/home/hadoop/bigdata目录下,准备安装

mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz  /home/hadoop/bigdata/

   3、解压安装sqoop

[hadoop@master bigdata]$ tar -xvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 

mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop

    4、修改环境变量

[hadoop@master ] vim .bashrc

export SQOOP_HOME=/home/hadoop/bigdata/sqoop
export CATALINA_HOME=$SQOOP_HOME/server
export LOGDIR=$SQOOP_HOME/logs
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:
$SQOOP_HOME/bin:$PATH

--此处一定注意要把shell执行环境变量脚本时是按照顺序执行,path需要写在最后面,否则就会出现虽然指定了环境变量,但是无法找到路径的尴尬。

  5、复制hive下mysql的jdbc驱动jar包到sqoop的lib目录下

[hadoop@master ~]$ cp ~/bigdata/hive/lib/mysql-connector-java-5.1.7-bin.jar ~/bigdata/sqoop/lib/

--确认复制是否成功,以及权限是否正确

[hadoop@master ~]$ ll ~/bigdata/sqoop/lib/mysql-connector-java-5.1.7-bin.jar 
-rw-rw-r-- 1 hadoop hadoop 709922 Apr 15 11:22 /home/hadoop/bigdata/sqoop/lib/mysql-connector-java-5.1.7-bin.jar

  6、查看sqoop在master节点上安装是否成功

[hadoop@master ~]$ sqoop version
Warning: /home/hadoop/bigdata/sqoop/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /home/hadoop/bigdata/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/bigdata/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
Warning: /home/hadoop/bigdata/sqoop/../zookeeper does not exist! Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
17/04/15 11:26:05 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6
git commit id c0c5a81723759fa575844a0a1eae8f510fa32c25
Compiled by root on Mon Apr 27 14:38:36 CST 2015

--此处如果输入sqoop version没有出现上面的显示,请检查第四步环境变量是否修改成功,如果修改成功,你需要关闭当前终端窗口,新开一个终端窗口,因为环境变量在当前终端窗口没有生效。

 7、将sqoop复制到集群的每台机器上,方便从集群的任意一台机器发起sqoop

[hadoop@master ~]$ scp ~/.bashrc hadoop@slave01:~/
.bashrc                                              100%  609     0.6KB/s   00:00    
[hadoop@master ~]$ scp ~/.bashrc hadoop@slave02:~/
.bashrc                                              100%  609     0.6KB/s   00:00    

[hadoop@master ~]$ scp -r ~/bigdata/sqoop hadoop@slave01:~/bigdata/

[hadoop@master ~]$ scp -r ~/bigdata/sqoop hadoop@slave02:~/bigdata/

 8、在集群slave01上验证sqoop是否部署成功

[hadoop@slave01 ~]$ sqoop version
Warning: /home/hadoop/bigdata/sqoop/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /home/hadoop/bigdata/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/bigdata/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
Warning: /home/hadoop/bigdata/sqoop/../zookeeper does not exist! Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
17/04/15 11:34:57 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6
git commit id c0c5a81723759fa575844a0a1eae8f510fa32c25
Compiled by root on Mon Apr 27 14:38:36 CST 2015

9、在slave01上验证查看master主机上的mysql数据库

--这一步操作需要你已经完成了hadoop安装系列之三才可以测试成功,目标是显示master上hive的元数据数据库hivemeta中有那些表格,sqoop利用mysql的jdbc驱动连接到master的3306端口

[hadoop@slave01 ~]$ sqoop list-tables --connect jdbc:mysql://master:3306/hivemeta --username hive --password mysql123
Warning: /home/hadoop/bigdata/sqoop/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /home/hadoop/bigdata/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/bigdata/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
Warning: /home/hadoop/bigdata/sqoop/../zookeeper does not exist! Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
17/04/15 11:39:14 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
17/04/15 11:39:14 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
17/04/15 11:39:14 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
BUCKETING_COLS
CDS
COLUMNS_V2
DATABASE_PARAMS
DBS
DB_PRIVS
FUNCS
FUNC_RU
GLOBAL_PRIVS
PARTITIONS
PARTITION_KEYS
PARTITION_KEY_VALS
PARTITION_PARAMS
PART_COL_STATS
ROLES
SDS
SD_PARAMS
SEQUENCE_TABLE
SERDES
SERDE_PARAMS
SKEWED_COL_NAMES
SKEWED_COL_VALUE_LOC_MAP
SKEWED_STRING_LIST
SKEWED_STRING_LIST_VALUES
SKEWED_VALUES
SORT_COLS
TABLE_PARAMS
TAB_COL_STATS
TBLS
VERSION

四、sqoop常用命令说明

      请注意,通用的Hadoop参数先于单个破折号字符( - ),而sqoop工具特定的参数以两个破折号( - )开头,除非它们是单字符参数,如-P。

      -conf,-D,-fs和-jt参数控制配置和Hadoop服务器设置。 例如,-D mapred.job.name = <job_name>可用于设置Sqoop启动的MR作业的名称(如果未指定),该名称将默认为该作业的jar名称,该名称来自 用过的表名。

     通过文件的形式导入参数,如下例:

$ sqoop import --connect jdbc:mysql://localhost/db --username foo --table TEST
     把上面的参数放置到一个本地的文本文件/home/hadoop/bigdata/import.txt 中,然后通过sqoop调用,如下所示:

$ sqoop --options-file /home/hadoop/bigdata/import.txt --table TEST
--显示import.txt文件内容

vim /home/hadoop/bigdata/import.txt

# Specifies the tool being invoked
import
# Connect parameter and value
--connect
jdbc:mysql://localhost/db
# Username parameter and value
--username
foo

Sqoop也可以导入任意SQL查询的结果集。 而不是使用--table,-columns和--where参数,您可以使用--query参数指定一个SQL语句。

For example:

$ sqoop import \  --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \  --split-by a.id --target-dir /user/foo/joinresults

导入过程将使用JDBC,它提供了合理的跨供应商导入渠道。 一些数据库可以通过使用数据库特定的数据移动工具以更高性能的方式执行导入。 例如,MySQL提供了可以很快将MySQL数据从MySQL导出到其他系统的mysqldump工具。 通过提供--direct参数,您将指定Sqoop应尝试直接导入通道。 该通道可能比使用JDBC更高的性能。

当使用直接模式时,您可以指定应传递给底层工具的其他参数。 如果参数 - 在命令行中给出,则后续参数将直接发送到底层工具。 例如,以下调整使用的字符集

mysqldump:

$ sqoop import --connect jdbc:mysql://server.foo.com/db --table bar \    --direct -- --default-character-set=latin1
五、sqoop导入分隔符

    分隔符可以指定为:
       一个字符(-fields-terminated-by X)

一个转义字符(-fields-terminated-by \ t)。 支持的转义字符是:
\ b(退格)
\ n(换行)
\ r(回车)
\ t(标签)
\“(双引号)
\\'(单引号)
\\(反斜杠)
\ 0(NUL)--这将在字段或行之间插入NUL字符,或者如果用于--enclosed-by,--optionally-surround-around-by或--escaped-by参数之一,则将禁用包围/转义。

默认分隔符是字段的逗号(,),记录的换行符(\ n),无引号字符,无转义字符。 请注意,如果您在字段数据中导入包含逗号或换行符的数据库记录,则可能会导致模糊/不可读记录。 对于明确的解析,必须启用两者。 例如,通过--mysql-delimiters。

UTF-8字符的代码点的八进制表示。 这应该是\ 0ooo的形式,其中ooo是八进制值。 例如,--fields-terminated-by \ 001将产生^ A字符。
UTF-8字符的代码点的十六进制表示形式。 这应该是\ 0xhhh,其中hhh是十六进制值。 例如,--fields-terminated-by \ 0x10将产生回车字符。

 分隔符关于HIVE的要求:

     即使Hive支持转义字符,但它不能处理转义的新行字符。 而且,它不支持在包含的字符串中包含字段分隔符的字符。 因此,建议您选择明确的字段和记录终止分隔符,而无需在使用Hive时转义和包含字符; 这是由于Hive的输入解析能力的限制。

分隔符参数说明:

--input-enclosed-by <char>- 由<char>设置必填字段包围
--input-optionally-enclosed-by <char>
- 可选包围的<char>设置字段包围字符
--input-escaped-by <char>设置输入转义字符
--input-fields-terminated- by <char>设置输入字段分隔符
--input-lines-terminated-by <char>设置输入行尾字符


0 0
原创粉丝点击