热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Sqoop2从MySQL导入数据到HadoopHDFS

前言ApacheSqoop(TM)isatooldesignedforefficientlytransferringbulkdatabetweenApache

前言

Apache Sqoop(TM) is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases.
Sqoop是一个在Hadoop与关系数据库之间进行高效传输大量数据的工具。也即是可进行导入和导出操作。
翻译的不太好见谅哈。
而Sqoop2是最新版本,但并不兼容Sqoop1。Sqoop2相比之前的版本添加了很多新的东西。具体的可参看官方文档,这里不过多介绍了。
对了,Sqoop2还可以在非关系数据库之间进行导入和导出,如:HBase等

环境
  • OS Debian 8.7
  • Hadoop 2.6.5
  • Sqoop 1.99.7
  • MySQL 5.7.17

这里除了Hadoop和Sqoop版本需要注意一下,其他的都差不多就行。

配置

关于Hadoop的集群基本配置,我会在另外一篇文章再介绍。这里只说下跟Sqoop2有关的配置。

Hadoop相关配置

因为sqoop访问Hadoop的MapReduce使用的是代理的方式,必须在Hadoop中配置所接受的proxy用户和组。
编辑hadoop-2.6.5/etc/hadoop/core-site.xml文件。
在里面添加如下内容:

      
<property>
<name>hadoop.proxyuser.hadoop.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.hadoop.groupsname>
<value>*value>
property>

其中hadoop.proxyuser.hadoop.hosts(groups)的格式应该是:hadoop.proxyuser.${SYSTEM_USER}.hosts表示运行hadoop的系统用户名,这里我就是使用hadoop用户运行的,所以就这样配置。

Sqoop2相关配置

  • 修改sqoop classpath配置,编辑sqoop-1.99.7-bin-hadoop200/bin/sqoop.sh文件
    找到sqoop_server_classpath_set函数,修改内容如下:
function sqoop_server_classpath_set {

#HADOOP_COMMON_HOME=${HADOOP_COMMON_HOME:-${HADOOP_HOME}/share/hadoop/common}
#HADOOP_HDFS_HOME=${HADOOP_HDFS_HOME:-${HADOOP_HOME}/share/hadoop/hdfs}
#HADOOP_MAPRED_HOME=${HADOOP_MAPRED_HOME:-${HADOOP_HOME}/share/hadoop/mapreduce}
#HADOOP_YARN_HOME=${HADOOP_YARN_HOME:-${HADOOP_HOME}/share/hadoop/yarn}
HADOOP_COMMON_HOME=${HADOOP_HOME}/share/hadoop/common
HADOOP_HDFS_HOME=${HADOOP_HOME}/share/hadoop/hdfs
HADOOP_MAPRED_HOME=${HADOOP_HOME}/share/hadoop/mapreduce
HADOOP_YARN_HOME=${HADOOP_HOME}/share/hadoop/yarn

就是改一些环境变量的配置,在这之前需要先配置好HADOOP_HOME的环境变量,也即是hadoop的解压安装目录。

  • 继续修改配置文件:sqoop-1.99.7-bin-hadoop200/conf/sqoop.properties
    修改以下属性:
    org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/home/hadoop/hadoop-2.6.5/etc/hadoop
    这个值就是为hadoop的配置目录。
    打开以下配置:
org.apache.sqoop.security.authentication.type=SIMPLE
org.apache.sqoop.security.authentication.handler=org.apache.sqoop.security.authentication.SimpleAuthenticationHandler
org.apache.sqoop.security.authentication.anonymous=true

这里只简单的配置一下,可根据需求进行更多的配置。

  • 验证配置是否有效
    sqoop-1.99.7-bin-hadoop200/bin/sqoop2-tool verify
    当出现以下语句时,就表示成功了,可以开始运行。
Verification was successful.
  • 添加MySQL驱动
    这篇主要是从MySQL数据库导入数据,所以需要添加MySQL官方的JDBC驱动。
    从官网下载:https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.41.zip
    解压下其中的jar包文件,将其放到Sqoopserver/libshell/lib目录下。

好了,基本配置就完成。

运行
  • 首先需要先运行Hadoop服务,进入hadoop-2.6.5/sbin/。启动dfsyarn
$ ./start-dfs.sh 
$ ./start-yarn.sh
  • 启动sqoop2服务,进入sqoop-1.99.7-bin-hadoop200/bin/
$ ./sqoop.sh server start
  • 检查启动是否成功
    运行jps命令:
6980 Jps
18020 ResourceManager
5813 SqoopJettyServer
17785 SecondaryNameNode
17550 NameNode

当都出现以上进程时就表示启动成功了。

导入

Sqoop2相比Sqoop1不仅有命令行工具,还可以通过Java等编程接口进行操作。这里为了演示方便,只用命令行的形式进行操作了。
进入sqoop-1.99.7-bin-hadoop200/bin目录,执行以下命令进入sqoop2命令行交互界面:

$ ./sqoop2-shell

Tips:当然添加到全局PATH环境变量中,更方便。

连接服务端,配置参数

sqoop:000> set server --host 127.0.0.1 --port 12000 --webapp sqoop

运行命令查看客户端和服务端的版本信息,确保已正确连接成功了:

sqoop:000> show version -all

sqoop2导入数据需要配置两条链接的,一条链接到数据库,一条链接到目的地(HDFS)。
而每一条链接都是要基于一个Connector的。
我们先查看一下,sqoop服务中已有的Connector

sqoop:000> show connector

connector

可以看到默认就已经有支持jdbchdfs的connector了。

  • 创建MySQL链接
sqoop:000> create link -connector generic-jdbc-connector

执行以上命令就会进入到一个交互界面了,依次会提示输入以下数据:

Name:标示这个link的字符串,如MySQL
Driver Class:指定jdbc启动时所需要加载的driver类,我们这里使用的是MySQL,那么就是com.mysql.jdbc.Driver

Connection String:就是使用jdbc连接时所需要的url参数了。如:jdbc:mysql://localhost:3306/hadoop,hadoop就是数据库名称。

Username:链接数据库的用户名,也就是mysql客户端传入的-u参数。如:root

Password:链接数据库的用户密码。

FetchSize:这个与jdbc中的fetchSize参数一样。当需要更多行时应该从数据库获取的行数。直接回车了,使用默认值。

entry# 这时候可以手动指定很多JDBC属性的值。本例只覆盖了一个protocol值为tcp:
protocol=tcp

Identifier enclose: 指定SQL中标识符的定界符,也就是说,有的SQL标示符是一个引号:select * from "table_name",这种定界符在MySQL中是会报错的。这个属性默认值就是双引号,所以不能使用回车,必须将之覆盖,可使用空格覆盖了这个值。

最后出现New link was successfully就表示创建成功了。

可以通过show link命令查看刚刚创建的link,如果不想要了也可以通过命令删除这个Link
delete link -name MySQL

  • 创建Hadoop链接Link
    创建命令同上类似,只是指定的connector需要改为hdfs的。
sqoop:000> create link -connector hdfs-connector

然后进入交互界面,这个只提示四个输入:

Name:标示这个link的字符串,如HDFS
URI: 集群URI,这个是在Hadoop中配置的,可找到/etc/hadoop/core-site.xml文件中的fs.defaultFS属性,输入对应的value值即可。
Conf directory: hadoop的配置文件目录,如:/home/hadoop/hadoop-2.6.5/etc/hadoop
entry# 覆写hadoop中的配置值,这里我们不需要覆盖,直接回车即可

返回这个表示已成功创建:New link was successfully

创建传输 Job

链接已经有了,现在就需要创建一个sqoop的Job用于提交到MapReduce框架平台运行了。

sqoop:000> create job -f "link-name1" -t "link-name2"  
  • link-name1表示FROM从哪获取数据的链接,这里就是MySQL了
  • link-name2表示TO导入到哪个位置去,这里就是HDFS了

执行以上命令就会进入到一个交互界面了,依次会提示输入以下数据:

Name: 标示这个job的字符串,如mysqlTOhdfs

Schema name: 数据库的schema,这里使用MySQL也就是数据库的名称了,如:hadoop

Table name: 数据库中的表名

SQL statement: 就是sql查询语句,可选的,直接回车就好

element# 重写数据相关的一些参数,可选,直接回车就好

Partition column: 分割的列,也就是将最终文件分割为多个,默认导入到一个文件。

Partition column nullable: (可选直接回车)

Boundary query: (可选直接回车)

Check column: (可选直接回车)

Last value: (可选直接回车)

Override null value: 覆盖值为空的列 (可选直接回车)
Null value: 覆盖的值为什么 (可选直接回车)

File format: 文件格式,这里选择0,TEXT_FILE

Compression codec: 压缩编码器,这里不压缩,选择0

Custom codec: 自定义的编码器,这里也不需要,直接回车

Output directory: 导入的输出目录,这里需要注意指定存储在HDFS文件系统中的路径,需要指定一个存在的路径,或者存在但路径下是空的,貌似这样才能成功。

Append mode: 用于指定是否是在已存在导出文件的情况下将新数据追加到数据文件中。可选回车

Extractors: 可选,对应 mapreduce 的 job 中 map 的数量。这里直接回车

Loaders: 可选,对应 mapreduce 的 job 中的 reduce 的数量。这里直接回车

element# Classpath配置,如:需要添加任务额外的jar包,这里直接回车

以上有些参数还需要另外进行试验分析,因为官方文档也说的挺少的。。

最后出现:New job was successfully
表示Job创建成功了

启动Job

启动job很简单,使用命令start job -n name
这里就是:

sqoop:000> start job -n mysqlTOhdfs

查看
  • 查看link
    sqoop:000> show link

  • 查看connector
    sqoop:000> show connector

  • 查看job
    sqoop:000> show job

  • 查看job进度
    sqoop:000> status job -n mysqlTOhdfs

  • 查看导入后的数据
    $ hadoop fs -ls sqoop
    这个sqoop目录必须要先创建,之后才能导入。

问题解析
  • sqoop2 shell操作总是提示如下警告信息:
0    [main] WARN  org.apache.hadoop.util.NativeCodeLoader  - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

在系统的/etc/profile或者hadoop用户的~/.bashrc中添加以下环境变量即可:

export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
或者添加下面的这个也行(没试过)
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

后记

断断续续折腾这个也有好几天了,当然都是晚上下班回来搞的。趁着周末又花了半天的时间,终于是搞定了。在这里留个笔记吧。

参考资料:
http://blog.csdn.net/u012842205/article/details/52346595
https://sqoop.apache.org/docs/1.99.7/user/Sqoop5MinutesDemo.html


推荐阅读
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • Apache Hadoop HDFS QJournalProtocol 中 getJournalCTime 方法的应用与代码实例分析 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • 安装hadoop2.9.2jdk1.8centos7
    安装JDK1.8查看JDK1.8的安装https:www.cnblogs.comTJ21p13208514.html安装hadoop上传hadoop下载hadoop地址http:m ... [详细]
  • 环境:centos6.5,hadoop2.6.4集群1.解压安装sqoop从官网下载好安装包,发送到集群中任意一台主机即可。相信大家已经看到,1.99.7跟1.4.6是不兼容的,而 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • Zookeeper作为Apache Hadoop生态系统中的一个重要组件,主要致力于解决分布式应用中的常见数据管理难题。它提供了统一的命名服务、状态同步服务以及集群管理功能,有效提升了分布式系统的可靠性和可维护性。此外,Zookeeper还支持配置管理和临时节点管理,进一步增强了其在复杂分布式环境中的应用价值。 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
author-avatar
caozhizhao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有