大数据实操篇 No.6-Sqoop 部署及使用

第1章 Apache Sqoop简介

Sqoop是一款开源的工具,主要用于hadoop(hive)与结构化的数据库(例如:关系型数据库mysql……)之间,进行高效的传输批量数据。

注意在官网还有一个版本:Sqoop2,这个Sqoop2官方说明不适用于生产环境部署。

Sqoop原理:将导入或导出命令转换成mapreduce程序,实现数据导入导出。在转换出的mapreduce中主要是对inputformat和outputformat进行定制。

第2章 Sqoop安装部署

2.1 下载解压

到官网进行下载:http://sqoop.apache.org/

笔者下载的是:sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/

2.2 修改配置文件

进入conf目录,修改sqoop-env.sh

$ mv sqoop-env-template.sh sqoop-env.sh
$ vi sqoop-env.sh

笔者这里只配置Hadoop和Hive的路径

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=$HADOOP_HOME

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=$HADOOP_HOME

#set the path to where bin/hbase is available
#export HBASE_HOME=

#Set the path to where bin/hive is available
export HIVE_HOME=$HIVE_HOME

#Set the path for where zookeper config dir is
#export ZOOCFGDIR=

第3章 Mysql安装配置

3.1 Mysql安装

笔者用sqoop将hive的数据导出到mysql,所以这里安装mysql,安装方法略。

3.2 放置jdbc驱动

放置mysql的jdbc jar包到sqoop的lib目录下,笔者用的是下面这个版本

mysql-connector-java-5.1.47.jar

注意:sqoop是在执行命令的时候指定mysql的配置参数。不需要单独配置 。

第4章 验证安装结果

sqoop直接用命令检查

$ bin/sqoop help

第5章 Sqoop使用

参考官方指南:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html

5.1 启动sqoop查看数据库

list-databases

$ sqoop list-databases --connect jdbc:mysql://webapp200:3306/ --username root --password 000000

5.2 导入数据

导入数据:指从非大数据集群(RDBMS)向大数据集群(HDFS、HIVE、HBASE)中传输数据。关键字import。

5.2.1 RDBMS到HDFS

  • 全部导入
$ bin/sqoop import \
--connect jdbc:mysql://webapp200:3306/offlinecalc \
--username root \
--password 000000 \
--table country \
--target-dir /user/country \
--num-mappers 1 \
--fields-terminated-by "\t"
  • 查询导入
$ bin/sqoop import \
--connect jdbc:mysql://webapp200:3306/offlinecalc \
--username root \
--password 000000 \
--target-dir /user/country \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,count from country where busidate<=getdate() and $CONDITIONS;'

注意:$CONDITIONS保证数据顺序的一个变量,在开启多个mappers(例如:--num-mappers 3)时,可以保证传输到hdfs上的数据顺序不乱。

如果query使用双引号,则需对$CONDITIONS做转义,在前面加“\”

\$CONDITIONS
  • 导入指定的列
$ bin/sqoop import \
--connect jdbc:mysql://webapp200:3306/offlinecalc \
--username root \
--password 000000 \
--table country \
--columns name,count \
--target-dir /user/country \
--num-mappers 1 \
--fields-terminated-by "\t"
  • 条件筛选导入数据
$ bin/sqoop import \
--connect jdbc:mysql://webapp200:3306/offlinecalc \
--username root \
--password 000000 \
--table country \
--where "id=1" \
--target-dir /user/country \
--num-mappers 1 \
--fields-terminated-by "\t"

注:“导入指定的列”和“条件筛选导入数据”可以结合使用

5.2.2 RDBMS到HIVE

$ bin/sqoop import \
--connect jdbc:mysql://webapp200:3306/offlinecalc \
--username root \
--password 000000 \
--table country \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-table country_hive

注意:这里是分两步实现:先导到hdfs,再迁移到hive;第一步默认临时目录是/user/[用户名]/表名

5.2.3 RDBMS到HBASE

$ bin/sqoop import \
--connect jdbc:mysql://webapp200:3306/offlinecalc \
--username root \
--password 000000 \
--table country \
--columns "id,name,sex" \
--columns-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_country" \
--num-mappers 1 \
--split-by id

-- split-by id 按id字段切分工作单元

注意:sqoop和hbase之间的版本问题,例如:sqoop1.4.6只支持HBase1.0.1之前的版本自动创建HBase表的功能。

5.3 导出数据

导出数据:指从大数据集群(HDFS、HIVE)向非大数据集群(RDBMS)中传输数据。关键字export。

5.3.1 HIVE/HDFS到RDBMS

$ bin/sqoop export \
--connect jdbc:mysql://webapp200:3306/offlinecalc \
--username root \
--password 000000 \
--table country \
--num-mappers 1 \
--export-dir /user/hive/warehouse/country_hive \
--input-fields-terminated-by "\t"

Hive和hdfs两者命令一样;

--export-dir /user/hive/warehouse/country_hive \ 为hive目录或者hdfs目录。

第6章 脚本打包

使用opt格式的文件打包sqoop命令,然后执行

6.1 创建一个.opt文件

$ touch exportdata.opt

6.2 编写sqoop脚本

$ vi /opt/shell/covid19/exportdata.opt

脚本如下(以下脚本是笔者在环境中使用过的):

export
--connect
jdbc:mysql://webapp200:3306/offline
--username
root
--password
000000
--table
t_infectstatistics
--num-mappers
1
--export-dir
/user/hive/warehouse/covid19count.db/t_infectstatistics/cty=china
--input-fields-terminated-by
","
--update-mode
allowinsert
--update-key
country,area

注意格式:每个属性于属性值必须换行,不能有任何空格。

6.3 执行脚本文件

$ sqoop --options-file /opt/shell/covid19/exportdata.opt

以上脚本可用crontab、azkaban、oozie等定时任务框架进行调用,设置定时执行。

Azkaban案例:创建job文件:sqoop.job

type=command
command=sqoop --options-file /opt/shell/covid19/exportdata.opt

sqoop.job文件和exportdata.opt文件一起压缩成zip包,导入到azkaban中进行任务设置,即可执行。

第7章 常见错误

下面的错误是笔者自己使用时候碰到的,仅供参考,具体的错误自己对错误信息和日志进行分析,都能得到解决。

7.1 错误一

错误信息

2020-07-12 17:37:13,282 ERROR tool.ExportTool: Error during export: 
Export job failed!
        at org.apache.sqoop.mapreduce.ExportJobBase.runExport(ExportJobBase.java:445)
        at org.apache.sqoop.manager.MySQLManager.upsertTable(MySQLManager.java:145)
        at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:73)
        at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:99)
        at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:252)

根据集群日志得到一些信息:

is running 232651264B beyond the 'VIRTUAL' memory limit. Current usage: 48.3

由于内存不足,导致mapreduce经常被kill

如果调整mapreduce运行内存配置,修改mapred-site.xml,添加如下内容:

<property>
  <name>mapreduce.map.memory.mb</name>
  <value>512</value>
</property>
<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Xmx512M</value>
</property>
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>512</value>
</property>
<property>
  <name>mapreduce.reduce.java.opts</name>
  <value>-Xmx512M</value>
</property>

7.2 错误二

错误信息

 
Caused by: java.lang.NumberFormatException: For input string: "china"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.lang.Integer.parseInt(Integer.java:580)
        at java.lang.Integer.valueOf(Integer.java:766)
        at t_infectstatistics.__loadFromFields(t_infectstatistics.java:360)
        ... 12 more

看提示应该是和mysql字段对应错误了,在Sqoop导出文件内添加指定列

--columns id,country,area,count

猜你喜欢

转载自blog.csdn.net/dzh284616172/article/details/107826760