您当前的位置:首页 > 互联网教程

怎么通过sqoop将hdfs上数据导入到mysql

发布时间:2025-05-21 01:46:25    发布人:远客网络

怎么通过sqoop将hdfs上数据导入到mysql

一、怎么通过sqoop将hdfs上数据导入到mysql

sqoop是一个能把数据在关系型数据库和HDFS之间互相传输的工具。在这里,我写一下用java程序来实现sqoop把数据从HDFS写入到MYSQL。

在接触sqoop之前,我自己写了一个传输类来实现数据从HDFS到MYSQL。这里简单说一下时间的思想:

1、在MYSQL中创建一个参数表A,用来记录要传输的表的表名B和字段。

2、HDFS上的数据的格式和MYSQL中参数表A中B表的字段的数量一样。

3、从MYSQL的参数表A中,读取要传输的表B。把这些字段拼凑成一个insert语句,例如

,拼凑为insert into b(column1,column2..) values(value1,value2...)

4、从HDFS相应的目录逐行读取数据,通过JDBC,把数据批量导入到MYSQL的B表中。

我现在用sqoop来代替原来传输的那个功能。先做一下准备工作:

1、hadoop的每个节点下lib文件夹中要有mysql的jar包和sqoop的jar包。

2、在HDFS的某个目录上的数据格式和MYSQL相应的表中的字段数量一致。

import org.apache.hadoop.conf.Configuration;

import org.apache.sqoop.Sqoop;

import org.apache.sqoop.tool.ExportTool;

*用SQOOP来把数据从HDFS导入到MYSQL。

public static void main(String[] args){

List<String> generatedJarsList= new ArrayList<String>();

Configuration conf= new Configuration();

conf.set("fs.default.name","hdfs://master:9000");

conf.set("hadoop.job.ugi","hadooper,hadoopgroup");

conf.set("mapred.job.tracker","master:9001");

ArrayList<String> list= new ArrayList<String>();//定义一个list

list.add("a_baat_client");//mysql中的表。将来数据要导入到这个表中。

list.add("/tmp/datathree/");//hdfs上的目录。这个目录下的数据要导入到a_baat_client这个表中。

list.add("jdbc:mysql://192.168.1.10:3306/report");//mysql的链接

list.add("root");//mysql的用户名

list.add("root");//mysql的密码

list.add("--lines-terminated-by");

list.add("\\n");//数据的换行符号

list.add("1");//定义mapreduce的数量。

ExportTool exporter= new ExportTool();

Sqoop sqoop= new Sqoop(exporter);

arg= list.toArray(new String[0]);

int result= Sqoop.runSqoop(sqoop, arg);

System.out.println("res:"+ result);//打印执行结果。

这个导出类执行过程中,可以在浏览器中看一下页面。会发现导出数据也是一个把任务转换为mapreduce执行的过程。

当然,上面的java代码,也可以用命令行来实现。命令如下:

bin/sqoop export--connect jdbc:mysql://192.168.1.10:3306/report\

--table a_baat_client--username root--password root\

--export-dir/tmp/datathree/-m 1

关于sqoop把数据从HDFS导入到MYSQL就说这么多。把数据从HIVE导入到MYSQL,其实可以理解为把HIVE表所对应的HDFS路径的数据导入到MYSQL,这里就不多说了。

二、sqoop export导入任务失败但部分数据入库成功能问题

1、借助Azkaban进行大数据任务调度时,遭遇sqoop export导入任务失败,但部分数据成功入库的困境。任务失败告警显示“Job failed as tasks failed. failedMaps:1 failedReduces:0”,但Azkaban页面信息不详,仅提示错误,无具体原因。开发反馈指出,与之前相比,业务数据量减少了一半。

2、深入分析后,发现sqoop export任务从Hive导出数据至MySQL。查看MySQL表,记录量少于预期,Hive表则显示正确数据量。排除数据源问题后,通过执行分页查询发现,第101条数据的字段合并,导致数据不一致。怀疑是字段合并导致字段数量不匹配。进一步排查,排除数据源问题,但在不同环境下查询,问题依然存在,最终意识到是sqoop的使用不当。

3、了解到,sqoop export将任务转化为Hadoop的MapReduce作业执行。Azkaban的日志中已显示失败原因,只是未引起注意。通过Yarn管理页面,可定位到具体执行节点,进而获取详细执行日志。在NodeManager上执行命令获取日志,发现数据库字段长度不足,应修改为mediumtext类型,清理异常数据后重新执行任务,成功恢复数据量至预期。

4、总结而言,azkaban任务执行失败时,应首先关注azkaban提供的错误日志,其中可能隐藏关键信息。大数据任务最终由Yarn调度与执行,可通过Hadoop Job管理页面追踪任务执行情况。在Yarn节点上获取执行日志,有助于排查问题。

5、扩展:Yarn架构由ResourceManager、APPlicationMaster、NodeManager和Container四大组件组成。ResourceManager负责处理客户端请求、启动监控ApplicationMaster、监控NodeManager以及资源分配与调度。APPlicationMaster负责程序切分、申请资源分配任务,以及任务监控与容错。NodeManager管理单个节点资源,处理来自ResourceManager的命令与来自ApplicationMaster的命令。Container对任务运行环境进行抽象,封装资源与任务运行相关信息。

6、部分失败任务日志详情参见相关博客链接。

三、ETL工具之Sqoop、Kettle和DataX

1、ETL工具是数据处理过程中的关键组件,用于在不同数据源之间传输、转换数据。本文将详细介绍三种主流ETL工具:Sqoop、Kettle和DataX,探讨它们的背景、核心功能、使用场景以及优缺点。

2、**Sqoop**是一款由Apache提供,专门用于关系型数据库和Hadoop之间传输数据的工具。其主要作用是解决企业中大量关系型数据库表数据需要同步到Hadoop文件存储系统的问题。Sqoop的核心功能包括导入和导出数据,支持大量结构化或半结构化数据的自动传输。使用案例涵盖了从MySQL等数据库到HDFS、Hive、HBase的导入,以及从Hadoop系统导出到关系型数据库的操作。

3、**Kettle**是Pentaho公司开发的一款ETL工具,带有图形化界面,方便开发者设计ETL任务。Kettle支持管理来自多种源端的数据,包括关系数据库、FTP、HTTP等传统源端的数据,以及Hadoop文件存储系统的数据。其核心组件包括Spoon、Pan和Kitchen,分别用于任务设计、转换执行和任务执行。Kettle的特色在于丰富的数据清洗和转换功能,支持数据清洗、转换和复杂逻辑操作,支持多种类型数据转换控件和脚本语言处理。使用场景不仅限于传统数据源之间的ETL,也适用于大数据领域,与Hadoop集群结合使用时,支持从HDFS、Hive和HBase抽取或加载数据,以及在集群内部执行转换任务。

4、**DataX**是阿里开源的一款异构数据源离线同步工具,旨在实现包括关系型数据库、HDFS、Hive、HBase、FTP等各种异构数据源之间的数据同步。DataX的核心架构采用“Framework+ plugin”模式,将数据源读取和写入抽象为插件。其优势在于较高的性能和稳定性,特别是在读取数据库数据时对数据库压力较小,全量读取速度较快。DataX在使用方面支持通过.json配置描述任务信息,通过python命令行启动。

5、**总结**:每款ETL工具都有其独特的优势和应用场景。Sqoop专为Hadoop集群设计,适合数据同步需求。Kettle功能全面,适用于广泛的数据处理场景,尤其是传统数据源之间以及与Hadoop集群的集成。DataX则凭借其高性能和稳定性,在大数据领域具有优势。选择合适的ETL工具,需根据具体的数据环境、需求以及技术栈来决定。