sqoop1入門介紹

sqoop是一款用於hadoop和關係型數據庫之間數據導入導出的工具。你可以通過sqoop把數據從數據庫(比如mysql,oracle)導入到hdfs中;也可以把數據從hdfs中導出到關係型數據庫中。sqoop通過Hadoop的MapReduce導入導出,因此提供了很高的並行性能以及良好的容錯性。

sqoop1入門介紹

當然阿里開源的datax也是不錯的產品,會在未來介紹。

1.hdfs與關係型數據庫交換數據

文本轉換方案

自寫Java程序 從數據庫中讀出數據,再寫到hadoop

Sqoop

廠商提供的解決方案

2.Sqoop

Sqoop中一大亮點就是可以通過hadoop的mapreduce把數據從關係型數據庫中導入數據到HDFS。

sqoop架構非常簡單,其整合了Hive、Hbase和Oozie,通過map-reduce任務來傳輸數據,從而提供併發特性和容錯。

sqoop主要通過JDBC和關係數據庫進行交互。理論上支持JDBC的database都可以使用sqoop和hdfs進行數據交互。

但是,只有一小部分經過sqoop官方測試,如下:

Database version --direct support connect string matches

HSQLDB 1.8.0+ No jdbc:hsqldb:*//

MySQL 5.0+ Yes jdbc:mysql://

Oracle 10.2.0+ No jdbc:oracle:*//

PostgreSQL 8.3+ Yes (import only) jdbc:postgresql://

3.sqoop大概流程

1.讀取要導入數據的表結構,生成運行類,默認是QueryResult,打成jar包,然後提交給Hadoop

2.設置好job,主要也就是設置好的各個參數

3.這裡就由Hadoop來執行MapReduce來執行Import命令了,

1)首先要對數據進行切分,也就是DataSplit

DataDrivenDBInputFormat.getSplits(JobContext job)

2)切分好範圍後,寫入範圍,以便讀取

DataDrivenDBInputFormat.write(DataOutput output) 這裡是lowerBoundQuery and upperBoundQuery

3)讀取以上2)寫入的範圍

DataDrivenDBInputFormat.readFields(DataInput input)

4)然後創建RecordReader從數據庫中讀取數據

DataDrivenDBInputFormat.createRecordReader(InputSplit split,TaskAttemptContext context)

5)創建Map

TextImportMapper.setup(Context context)

6)RecordReader一行一行從關係型數據庫中讀取數據,設置好Map的Key和Value,交給Map

DBRecordReader.nextKeyValue()

7)運行map

TextImportMapper.map(LongWritable key, SqoopRecord val, Context context)最後生成的Key是行數據,由QueryResult生成,Value是NullWritable.get()。


分享到:


相關文章: