共計 5632 個字符,預計需要花費 15 分鐘才能閱讀完成。
這篇文章主要為大家分析了 Sqoop 的原理分析是什么的相關知識點,內容詳細易懂,操作細節合理,具有一定參考價值。如果感興趣的話,不妨跟著跟隨丸趣 TV 小編一起來看看,下面跟著丸趣 TV 小編一起深入學習“Sqoop 的原理分析是什么”的知識吧。
一簡介
Sqoop 是一個用來將 Hadoop 和關系型數據庫中的數據相互轉移的工具,可以將一個關系型數據庫(例如:MySQL ,Oracle ,Postgres 等)中的數據導進到 Hadoop 的 HDFS 中,也可以將 HDFS 的數據導進到關系型數據庫中。
二特點
Sqoop 中一大亮點就是可以通過 hadoop 的 mapreduce 把數據從關系型數據庫中導入數據到 HDFS。
三 Sqoop 命令
Sqoop 大約有 13 種命令, 和幾種通用的參數 (都支持這 13 種命令),這里先列出這 13 種命令。
接 著列出 Sqoop 的各種通用參數, 然后針對以上 13 個命令列出他們自己的參數。Sqoop 通用參數又分 Common arguments,Incremental import arguments,Output line formatting arguments,Input parsing arguments,Hive arguments,HBase arguments,Generic Hadoop command-line arguments, 下面一一說明:
1.Common arguments
通用參數, 主要是針對關系型數據庫鏈接的一些參數
四 sqoop 命令舉例
1)列出 mysql 數據庫中的所有數據庫
sqoop list-databases –connect jdbc:mysql://localhost:3306/ –username root –password 123456
2) 連接 mysql 并列出 test 數據庫中的表
sqoop list-tables –connect jdbc:mysql://localhost:3306/test –username root –password 123456
命令中的 test 為 mysql 數據庫中的 test 數據庫名稱 username password 分別為 mysql 數據庫的用戶密碼
3) 將關系型數據的表結構復制到 hive 中, 只是復制表的結構,表中的內容沒有復制過去。
sqoop create-hive-table –connect jdbc:mysql://localhost:3306/test
–table sqoop_test –username root –password 123456 –hive-table
test
其中 –table sqoop_test 為 mysql 中的數據庫 test 中的表 –hive-table
test 為 hive 中新建的表名稱
4) 從關系數據庫導入文件到 hive 中
sqoop import –connect jdbc:mysql://localhost:3306/zxtest –username
root –password 123456 –table sqoop_test –hive-import –hive-table
s_test -m 1
5) 將 hive 中的表數據導入到 mysql 中, 在進行導入之前,mysql 中的表
hive_test 必須已經提前創建好了。
sqoop export –connect jdbc:mysql://localhost:3306/zxtest –username
root –password root –table hive_test –export-dir
/user/hive/warehouse/new_test_partition/dt=2012-03-05
6)從數據庫導出表的數據到 HDFS 上文件
./sqoop import –connect
jdbc:mysql://10.28.168.109:3306/compression –username=hadoop
–password=123456 –table HADOOP_USER_INFO -m 1 –target-dir
/user/test
7)從數據庫增量導入表數據到 hdfs 中
./sqoop import –connect jdbc:mysql://10.28.168.109:3306/compression
–username=hadoop –password=123456 –table HADOOP_USER_INFO -m 1
–target-dir /user/test –check-column id –incremental append
–last-value 3
五 Sqoop 原理(以 import 為例)
Sqoop 在 import 時,需要制定 split-by 參數。Sqoop 根據不同的 split-by 參數值來進行切 分, 然后將切分出來的區域分配到不同 map 中。每個 map 中再處理數據庫中獲取的一行一行的值,寫入到 HDFS 中。同時 split-by 根據不同的參數類 型有不同的切分方法,如比較簡單的 int 型,Sqoop 會取最大和最小 split-by 字段值,然后根據傳入的 num-mappers 來確定劃分幾個區 域。比如 select max(split_by),min(split-by) from 得到的 max(split-by) 和 min(split-by) 分別為 1000 和 1,而 num-mappers 為 2 的話,則會分成兩個區域 (1,500) 和 (501-100), 同時也會分成 2 個 sql 給 2 個 map 去進行導入操作,分別為 select XXX from table where split-by =1 and split-by 500 和 select XXX from table where split-by =501 and split-by =1000。最后每個 map 各自獲取各自 SQL 中的數據進行導入工作。
六 mapreduce job 所需要的各種參數在 Sqoop 中的實現
1) InputFormatClass
com.cloudera.sqoop.mapreduce.db.DataDrivenDBInputFormat
2) OutputFormatClass
1)TextFile
com.cloudera.sqoop.mapreduce.RawKeyTextOutputFormat
2)SequenceFile
org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat
3)AvroDataFile
com.cloudera.sqoop.mapreduce.AvroOutputFormat
3)Mapper
1)TextFile
com.cloudera.sqoop.mapreduce.TextImportMapper
2)SequenceFile
com.cloudera.sqoop.mapreduce.SequenceFileImportMapper
3)AvroDataFile
com.cloudera.sqoop.mapreduce.AvroImportMapper
4)taskNumbers
1)mapred.map.tasks(對應 num-mappers 參數)
2)job.setNumReduceTasks(0);
這里以命令行:import –connect jdbc:mysql://localhost/test –username root –password 123456 –query“select sqoop_1.id as foo_id, sqoop_2.id as bar_id from sqoop_1 ,sqoop_2 WHERE $CONDITIONS”–target-dir /user/sqoop/test -split-by sqoop_1.id –hadoop-home=/home/hdfs/hadoop-0.20.2-CDH3B3 –num-mappers 2
1)設置 Input
DataDrivenImportJob.configureInputFormat(Job job, String tableName,String tableClassName, String splitByCol)
a)DBConfiguration.configureDB(Configuration conf, String driverClass, String dbUrl, String userName, String passwd, Integer fetchSize)
1).mapreduce.jdbc.driver.class com.mysql.jdbc.Driver
2).mapreduce.jdbc.url jdbc:mysql://localhost/test
3).mapreduce.jdbc.username root
4).mapreduce.jdbc.password 123456
5).mapreduce.jdbc.fetchsize -2147483648
b)DataDrivenDBInputFormat.setInput(Job job,Class ? extends DBWritable inputClass, String inputQuery, String inputBoundingQuery)
1)job.setInputFormatClass(DBInputFormat.class);
2)mapred.jdbc.input.bounding.query SELECT MIN(sqoop_1.id), MAX(sqoop_2.id) FROM (select sqoop_1.id as foo_id, sqoop_2.id as bar_id from sqoop_1 ,sqoop_2 WHERE (1 = 1) ) AS t1
3)job.setInputFormatClass(com.cloudera.sqoop.mapreduce.db.DataDrivenDBInputFormat.class);
4)mapreduce.jdbc.input.orderby sqoop_1.id
c)mapreduce.jdbc.input.class QueryResult
d)sqoop.inline.lob.length.max 16777216
2)設置 Output
ImportJobBase.configureOutputFormat(Job job, String tableName,String tableClassName)
a)job.setOutputFormatClass(getOutputFormatClass());
b)FileOutputFormat.setOutputCompressorClass(job, codecClass);
c)SequenceFileOutputFormat.setOutputCompressionType(job,CompressionType.BLOCK);
d)FileOutputFormat.setOutputPath(job, outputPath);
3)設置 Map
DataDrivenImportJob.configureMapper(Job job, String tableName,String tableClassName)
a)job.setOutputKeyClass(Text.class);
b)job.setOutputValueClass(NullWritable.class);
c)job.setMapperClass(com.cloudera.sqoop.mapreduce.TextImportMapper);
4)設置 task number
JobBase.configureNumTasks(Job job)
mapred.map.tasks 4
job.setNumReduceTasks(0);
七 大概流程
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()
關于“Sqoop 的原理分析是什么”就介紹到這了, 更多相關內容可以搜索丸趣 TV 以前的文章,希望能夠幫助大家答疑解惑,請多多支持丸趣 TV 網站!