Sqoop-1.4.6安装部署及详细使用介绍

发布时间:2023-04-27 09:14:27

Sqoop1之所以被选中,是因为目前Sqoop2存在太多问题。不能正常使用,综合比较后选择Sqoop1。

Sqoop1安装配置简单

一、安装部署

(1)、下载地址:http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.5.2.tar.gz

解压到/opt/cdh5/sqoop

(2)、jdbc驱动包mysql复制MySQL-connector-Java-5.1.31-bin.jar到sqoop/lib目录下。

(3)、配置环境变量

#sqoop

export SQOOP_HOME=/opt/cdh5/sqoop

export PATH=$PATH:$SQOOP_HOME/bin

(4)、复制sqoop/conf/sqoop-env-template.sh为sqoop-env.sh

添加相关配置

#Setpath to where bin/Hadoopis available

exportHADOOP_COMMON_HOME=/opt/cdh5/hadoop

#Setpath to where hadoop-*-core.jar isavailable

exportHADOOP_MAPRED_HOME=/opt/cdh5/hadoop

#setthe path to where bin/hbase isavailable

exportHBASE_HOME=/opt/cdh5/hbase

#Setthe path to where bin/hive is available

exportHIVE_HOME= /opt/cdh5/hive

#Setthe path for where zookeper config diris

exportZOOCFGDIR= /opt/cdh5/zookeeper

(5)、测试Sqoop

发现有警告

修改$SQOOP_HOME/bin/configure-sqoop

注释HCatalog、Accumulo检查(除非您准备使用HCatalog、Accumulo等HADOP上的组件)

## Moved to be a runtime check in sqoop.

#if [ ! -d "${HCAT_HOME}" ]; then

#echo "Warning: $HCAT_HOME does not exist! HCatalog jobs willfail."

#echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'

#fi

#if [ ! -d "${ACCUMULO_HOME}" ];then

#echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports willfail."

#echo 'Please set $ACCUMULO_HOME to the root of your Accumuloinstallation.'

#fi

sqoop再次执行 version

您还可以查看命令的使用说明:

$ sqoopimport --help

$ sqoophelp import

sqoop import 一个例子如下:

$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS

您还可以使用它--options-file可以用这种方法重用一些配置参数来传输文件:

$ sqoop --options-file /users/homer/work/import.txt --table TES

/users/homer/work/import.txt 文件如下:

import

--connect

jdbc:mysql://192.168.56.121:3306/metastore

--username

hiveuser

--password

redhat

二、Sqoop使用说明书 1、测试连接:

(1)显示mysql数据库列表

sqoop list-databases –connect jdbc:mysql:///hadoop00030003:3306/--username root –P

(2)显示数据库中的所有表格:

sqoop list-tables --connectjdbc:mysql:///hadoop00030003:3306/EDW --username root -P

2、Mysql和HDFS互导

(1)mysql导入hdfss

fin___cashier_order导入hdfs,导入前查询fin_cashier_order表中的数据

共:199条

sqoop import --connectjdbc:mysql:///hadoop00030003:3306/ssa --username root --password ***** --table fin_cashier_order --target-dir/user/hadoop/databases/ssa/fin_cashier_order -m 4

-M表示Map并发数

若是不写--target-dir默认为hdfs上的user//username/tablename 路径

如果重复执行,会提示目录已经存在,可以手动删除

运行mapreduce后,去HDFS检查

验证hdfs导入的数据:

hadoop fs -ls /user/hadoop/databases/ssa/fin_cashier_order

hadoop fs -cat /user/hadoop/databases/ssa/fin_cashier_order/part-m-00000

(2)HDFS导入mysql

将HDFS中的数据导入Mysql表中,需要提前在mysql中建立空表fin_cashier_order2,此时此表为空

sqoop export --connectjdbc:mysql:///hadoop00030003:3306/ssa --table fin_cashier_order2 --username root--password ****** --export-dirhdfs://jrtestcluster/user/hadoop/databases/ssa/fin_cashier_order/

运行完显示

16/02/25 16:23:39 INFOmapreduce.ExportJobBase: Transferred 70.4619 KB in 48.3235 seconds (1.4581KB/sec)

16/02/25 16:23:39 INFO mapreduce.ExportJobBase:Exported 199 records.

显示导出199条记录。

到表fin_______cashier_order2查看

而且正好是199条。

到目前为止,Mysql和HDFS的互导功都是用Sqop验证的

您还可以指定其他参数:

参数

说明

--append

将数据添加到hdfs中现有的dataset中。使用此参数,sqoop将数据导入临时目录,然后将文件重新命名为正式目录,以避免与目录中现有的文件重名。

--as-avrodatafile

将数据导入Avro数据文件

--as-sequencefile

将数据导入sequence文件

--as-textfile

将数据导入普通文本文件,生成文本文件后,可以通过hive中的sql语句查询结果。

--boundary-query <statement>

边界查询,即在导入前通过SQL查询获得结果集,然后导入的数据是结果集中的数据,格式如下:--boundary-query 'select id,no from t where id = 3',导入的数据是id=3的记录,或者select min(<split-by>), max(<split-by>) from <table name>,注意查询字段中不能有字符串字段的数据类型,否则会报错

--columns<col,col>

指定要导入的字段值,格式如下:--columns id,username

--direct

直接导入模式使用与数据库相关的导入和导出工具。官方网站表示,这种导入将更快

--direct-split-size

在使用上述direct直接导入的基础上,根据字节数对导入的流量进行分块,特别是当使用直接连接模式从PostgresQL导入数据时,可以将达到设定大小的文件分为几个独立的文件。

--inline-lob-limit

设置大对象数据类型的最大值

-m,--num-mappers

启动N个map并行导入数据,默认为4个,最好不要将数字设置为高于集群的节点数

--query,-e <sql>

在使用该参数时,必须指定从查询结果中导入数据–target-dir–hive-table,where条件必须包含在查询语句中,where条件必须包括在内\$CONDITIONS,示例:--query 'select * from t where \$CONDITIONS ' --target-dir /tmp/t –hive-table t

--split-by <column>

表中的列名用于分割工作单元,一般跟随主键ID

--table <table-name>

关系数据库表名,数据从表中获取

--delete-target-dir

删除目标目录

--target-dir <dir>

指定hdfs路径

--warehouse-dir <dir>

--target-dir指定数据导入的存储目录不能同时使用,适用于hdfs导入,不适用于hive目录导入

--where

从关系数据库导入数据时的查询条件,例如:--where "id = 2"

-z,--compress

压缩参数,默认情况下数据没有压缩,Gzip压缩算法可用于压缩数据,适用于SequenceFile, text文本文件, 以及Avro文件

--compression-codec

Hadoop压缩编码默认为gzip

--null-string <null-string>

如果没有指定可选参数,将使用字符串null

--null-non-string <null-string>

如果没有指定可选参数,将使用字符串null

示例程序:

$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --columns "tbl_id,create_time" --where "tbl_id > 1" --target-dir /user/hive/result

使用 sql 语句

参照上表,使用 sql 语句查询时,需要指定$CONDITIONS

$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --query 'SELECT * from TBLS where \$CONDITIONS ' --split-by tbl_id -m 4 --target-dir /user/hive/result

上述命令通过-m 1

使用 direct 模式:

$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --delete-target-dir --direct --default-character-set UTF-8 --target-dir /user/hive/result

指定文件输出格式:

$sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by"\t"--lines-terminated-by"\n"

这时候查看 hdfs 中间数据(观察分隔符是否为制表符):

$ hadoop fs -ls resultFound 5 items-rw-r--r--   3 root hadoop          0 2014-08-04 16:07 result/_SUCCESS-rw-r--r--   3 root hadoop         69 2014-08-04 16:07 result/part-m-00000-rw-r--r--   3 root hadoop          0 2014-08-04 16:07 result/part-m-00001-rw-r--r--   3 root hadoop        142 2014-08-04 16:07 result/part-m-00002-rw-r--r--   3 root hadoop         62 2014-08-04 16:07 result/part-m-00003$ hadoop fs -cat result/part-m-0000034  1406784308  8   0   root    0   45  test1   EXTERNAL_TABLE  null    null    null$ hadoop fs -cat result/part-m-0000240  1406797005  9   0   root    0   52  test2   EXTERNAL_TABLE  null    null    null42  1407122307  7   0   root    0   59  test3   EXTERNAL_TABLE  null    null    null

指定空字符串:

$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" --delete-target-dir --null-string '\\N' --null-non-string '\\N' --target-dir /user/hive/result

若需要指定压缩:

附:可选文件参数如下表所示。

参数

说明

--enclosed-by <char>

在字段值前后加入指定的字符,如双引号、示例:--enclosed-by '\"',显示例:“3”,“jimsss","dd@dd.com"

--escaped-by <char>

对于双引号进行转义处理,如字段值为“测试”--escaped-by "\\"hdfs处理后的显示值为:\"测试\"",对单引号无效

--fields-terminated-by <char>

设置每个字段以什么符号结束,默认为逗号,也可以改为其他符号,如句号.,示例如:--fields-terminated-by

--lines-terminated-by <char>

设置每个记录行之间的分隔符,默认是换行串,但也可以设置自己需要的字符串,例如:--lines-terminated-by "#"以#号分隔

--mysql-delimiters

Mysql默认设置分隔符,字段之间设置,隔开,行间换行\n隔离,默认转义符号为\,字段值为单引号'包含起来。

--optionally-enclosed-by <char>

enclosed-by强制在每个字段值前后添加指定的符号,而--optionally-enclosed-by只需将指定的符号添加到具有双引号或单引号的字段值中,即可选

3、Mysql和Hive互导

以下错误:

错误1:

ERROR tool.ImportTool: EncounteredIOException running import job: java.io.IOException: DataStreamer Exception:

atorg.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:796)

Caused by: java.lang.OutOfMemoryError:unable to create new native thread

at java.lang.Thread.start0(Native Method)

at java.lang.Thread.start(Thread.java:714)

atorg.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.initDataStreaming(DFSOutputStream.java:581)

at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:669)

解决方法:

net.ipv4.ip_local_port_range = 1024 65000

修改系统参数

echo "100000" > /proc/sys/kernel/threads-max

echo "100000" > /proc/sys/kernel/pid_max(默认32768)

echo "200000" > /proc/sys/vm/max_map_count(默认65530)

修改/etc/security/limits.conf

* - nproc 999999* -nofile 999999PS:nproc是修改系统的max user processes大小;nofile 修改open files的大小,以及linux 2.6.在25内核之前,有一个宏定义,定义了这个值的最大值,1024*1024,正好是100万,而在2.6.25内核及其后,此值可通过/proc/sys/fs/nr_open设置,但是,99999就够了。很多人可能会遇到,只能启动32000多个线程,就不能再启动更多的线程。其实是pid_max = 32768 给限制住了

通过sqoopp增加map的数量 -m 选项指定更多的map。通过更多的map,减少每个子过程占用的heap space,避免超过hadoop设置的java heap space 大小sqoop ... -m <map 数量>

错误2:

Caused by: java.lang.RuntimeException:java.sql.SQLException: Access denied for user 'root@hadoop03 (usingpassword: YES)

atorg.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:220)

atorg.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:165)

... 9 more

程序正常运行,结果正确。说明数据库连接是正确的,也可以单独用mysql连接。报告这个异常错误。

查询数据库中的用户信息

 

JDBC连接的机器名称是hadoop03,虽然已经赋予root所有机器远程访问权限(”%),但hadoop03账户可能无法打开机器的远程权限。因此,为hadoop03机器打开远程权限。

GRANT ALL PRIVILEGES ON *.* TO'root@hadoop03 IDENTIFIED BY ******** WITH GRANT OPTION;

 

再次执行导入命令。成功。上述错误不再出现。

 

错误3:

从mysql导入到Hive报告如下错误:

ERROR hive.HiveConfig: Could not loadorg.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.

16/02/26 14:43:47 ERROR tool.ImportTool:Encountered IOException running import job: java.io.IOException:java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf

数据已导入HDFS。从HDFS移动到Hive时出错。提示HIVE_CONF_DIR配置不正确。

但是,HIVE_CONF_DIR添加到sqopp中-env.sh、hadoop-env.sh、hive-env.sh不起作用。

最终正确的解决方案:

在/etc/profile 添加下面一句话

exportHADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*

Sqoop-1.4.7版本似乎解决了这个问题。期待这个版本

上一篇 解决 Failed to create the Java Virtual Machine
下一篇 Java8 Lambda表达式教程

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题