1. 程式人生 > >使用Sqoop job工具同步資料

使用Sqoop job工具同步資料

我們使用的是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

結果示例,如下所示:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

Job: your-sync-job

Tool: import

Options:

----------------------------

verbose = false

incremental.last.value = 1

db.connect.string = jdbc:mysql://10.95.3.49:3306/workflow

codegen.output.delimiters.escape = 0

codegen.output.delimiters.enclose.required = false

codegen.input.delimiters.field = 0

hbase.create.table = false

db.require.password = true

hdfs.append.dir = true

db.table = project

import.fetch.size = null

codegen.input.delimiters.escape = 0

codegen.input.delimiters.enclose.required = false

db.username = shirdrn

codegen.output.delimiters.record = 10

import.max.inline.lob.size = 16777216

hcatalog.create.table = false

db.clear.staging.table = false

incremental.col = id

codegen.input.delimiters.record = 0

enable.compression = false

hive.overwrite.table = false

hive.import = true

codegen.input.delimiters.enclose = 0

hive.drop.delims = false

codegen.output.delimiters.enclose = 0

hdfs.delete-target.dir = false

codegen.output.dir = .

codegen.auto.compile.dir = true

mapreduce.num.mappers = 4

import.direct.split.size = 0

export.new.update = UpdateOnly

codegen.output.delimiters.field = 1

incremental.mode = AppendRows

hdfs.file.format = TextFile

codegen.compile.dir = /tmp/sqoop-shirdrn/compile/a1ed2c6097c4534d20f2ea981662556e

direct.import = false

hive.fail.table.exists = false

tool.arguments.0 = --default-character-set=utf-8

db.batch = false

通過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

2

3

4

5

<property>

     <name>sqoop.metastore.client.record.password</name>

     <value>true</value>

     <description>If true, allow saved passwords in the metastore. </description>

</property>

如果想要限制從外部呼叫執行Sqoop job,如將Sqoop job提交給Oozie排程程式,也會通過上面Sqoop的metastore配置的內容來進行驗證。
另外,Sqoop的metastore工具,可以允許我們指定為外部,例如使用外部主機上的MySQL資料庫來儲存元資料,可以在conf/sqoop-site.xml配置如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

<property>

    <name>sqoop.metastore.client.autoconnect.url</name>

    <value>jdbc:mysql://10.95.3.49:3306/sqoop_metastore</value>

    <description>The connect string to use when connecting to a

        job-management metastore. If unspecified, uses ~/.sqoop/.

        You can specify a different path here.

    </description>

</property>

<property>

    <name>sqoop.metastore.client.autoconnect.username</name>

    <value>shirdrn</value>

    <description>The username to bind to the metastore.

    </description>

</property>

<property>

    <name>sqoop.metastore.client.autoconnect.password</name>

    <value>108loIOL</value>

    <description>The password to bind to the metastore.

    </description>

</property>

還有一個可與選擇的配置項是,可以設定是否自動連線到外部metastore資料庫,通過如下配置指定:

1

2

3

4

5

6

<property>

     <name>sqoop.metastore.client.enable.autoconnect</name>

     <value>false</value>

     <description>If true, Sqoop will connect to a local metastore for job management when no other metastore arguments are provided.

     </description>

</property>

這樣,你可以通過MySQL的授權機制,來限制指定的使用者和主機(或IP地址)訪問Sqoop的metadata,也能起到一定的安全訪問限制。

參考連結