sqoop是一款用於hadoop和關係型數據庫之間數據導入導出的工具。你可以通過sqoop把數據從數據庫(比如mysql,oracle)導入到hdfs中;也可以把數據從hdfs中導出到關係型數據庫中。sqoop通過Hadoop的MapReduce導入導出,因此提供了很高的並行性能以及良好的容錯性。
當然阿里開源的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()。
閱讀更多 從大數據說起 的文章