分享

如何同步数据:使用Sqoop job工具同步数据

本帖最后由 pig2 于 2014-5-15 12:32 编辑
问题导读:
1.如何使用Sqoop在异构平台之间同步数据 ?
2.Sqoop job相关的命令有几个,该如何写?
3.sqoop.metastore.client.record.password的作用是什么?
4.通过什么配置可以设置是否自动连接到外部metastore数据库?





我们使用的是Sqoop-1.4.4,在进行关系型数据库与Hadoop/Hive数据同步的时候,如果使用--incremental选项,如使用append模式,我们需要记录一个--last-value的值,如果每次执行同步脚本的时候,都需要从日志中解析出来这个--last-value的值,然后重新设置脚本参数,才能正确同步,保证从关系型数据库同步到Hadoop/Hive的数据不发生重复的问题。

而且,我们我们需要管理我们使用的这些脚本,每次执行之前可能要获取指定参数值,或者修改参数。Sqoop也提供了一种比较方面的方式,那就是直接创建一个Sqoop job,通过job来管理特定的同步任务。就像我们前面提到的增量同步问题,通过创建sqoop job可以保存上一次同步时记录的--last-value的值,也就不用再费劲去解析获取了,每次想要同步,这个job会自动从job保存的数据中获取到。



sqoop job命令使用

Sqoop job相关的命令有两个:

bin/sqoop job
bin/sqoop-job

使用这两个都可以。我们先看看sqoop job命令的基本用法:
创建job:--create
删除job:--delete
执行job:--exec
显示job:--show
列出job:--list

下面,我们基于增量同步数据这个应用场景,创建一个sqoop job,命令如下所示:
  1. bin/sqoop job --create your-sync-job -- import --connect jdbc:mysql://10.95.3.49:3306/workflow --table project --username shirdrn -P --hive-import --incremental append --check-column id --last-value 1 -- --default-character-set=utf-8
复制代码

创建了job,id为“your-sync-job”,它是将MySQL数据库workflow中的project表同步到Hive表中,而且--incremental append选项使用append模式,--last-value为1,从MySQL表中自增主键id=1开始同步。然后我们根据这个job的id去查询job详细配置情况:
  1. bin/sqoop job --show your-sync-job
复制代码

这里由于,结果示例输出信息过多,不便贴出来,请见谅。


通过incremental.last.value = 1可以看到,通过该选项来控制增量同步开始记录。
接着,可以使用创建的这个job id来运行它,执行如下命令:
  1. bin/sqoop job --exec your-sync-job
复制代码

可以查询,MySQL数据库workflow中的project表中的数据被同步到Hive表中。
这时,可以通过bin/sqoop job --show your-sync-job命令,查看当前的sqoop job配置情况,可以看到如下变化:
  1. incremental.last.value = 7
复制代码

从MySQL表中增量同步的起始id变为7,下次同步就会把id大于7的记录同步到Hive表中。可以在MySQL表中再INSERT一条记录,再次执行your-sync-job,能够正确地进行增量同步。




Sqoop job安全配置
默认情况下,创建的每个job在运行的时候都不会进行安全的认证。如果我们希望限制指定的sqoop job的执行,只有经过认证以后才能执行,这时候可以使用sqoop job的安全选项。Sqoop安装目录下,通过修改配置文件conf/sqoop-site.xml可以对job进行更高级的配置。实际上,我们使用了Sqoop的metastore工具,它能够对Sqoop进行细粒度的配置。
我们要将MySQL数据库中的数据同步到Hive表,每次执行sqoop job都需要输入访问MySQL数据库的连接账号信息,可以设置sqoop.metastore.client.record.password的值为true。如果在conf/sqoop-site.xml中增加如下配置,会将连接账号信息存储到Sqoop的metastore中:

  1. <property>
  2.      <name>sqoop.metastore.client.record.password</name>
  3.      <value>true</value>
  4.      <description>If true, allow saved passwords in the metastore. </description>
  5. </property>
复制代码

如果想要限制从外部调用执行Sqoop job,如将Sqoop job提交给Oozie调度程序,也会通过上面Sqoop的metastore配置的内容来进行验证。
另外,Sqoop的metastore工具,可以允许我们指定为外部,例如使用外部主机上的MySQL数据库来存储元数据,可以在conf/sqoop-site.xml配置如下:

  1. <property>
  2.     <name>sqoop.metastore.client.autoconnect.url</name>
  3.     <value>jdbc:mysql://10.95.3.49:3306/sqoop_metastore</value>
  4.     <description>The connect string to use when connecting to a
  5.         job-management metastore. If unspecified, uses ~/.sqoop/.
  6.         You can specify a different path here.
  7.     </description>
  8. </property>
  9. <property>
  10.     <name>sqoop.metastore.client.autoconnect.username</name>
  11.     <value>shirdrn</value>
  12.     <description>The username to bind to the metastore.
  13.     </dscription>
  14. </property>
  15. <property>
  16.     <name>sqoop.metastore.client.autoconnect.password</name>
  17.     <value>108loIOL</value>
  18.     <description>The password to bind to the metastore.
  19.     </description>
  20. </property>
复制代码

还有一个可与选择的配置项是,可以设置是否自动连接到外部metastore数据库,通过如下配置指定:

  1. <property>
  2.      <name>sqoop.metastore.client.enable.autoconnect</name>
  3.      <value>false</value>
  4.      <description>If true, Sqoop will connect to a local metastore for job management when no other metastore arguments are provided.
  5.      </description>
  6. </property>
复制代码


这样,你可以通过MySQL的授权机制,来限制指定的用户和主机(或IP地址)访问Sqoop的metadata,也能起到一定的安全访问限制。




已有(5)人评论

跳转到指定楼层
不许笑 发表于 2014-7-23 14:52:27
我想问问版主,Sqoop肯定可以用mysql存储元数据么?
回复

使用道具 举报

wubaozhou 发表于 2015-1-1 19:03:40
回复

使用道具 举报

allenswf 发表于 2015-3-24 06:21:37
谢谢LZ 点赞点赞
回复

使用道具 举报

ainubis 发表于 2015-3-29 04:40:33
O(∩_∩)O谢谢~\(≧▽≦)/~啦啦啦
回复

使用道具 举报

ainubis 发表于 2015-3-29 04:41:20
O(∩_∩)O谢谢~\(≧▽≦)/~啦啦啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条