久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Sqoop的原理分析是什么

160次閱讀
沒有評論

共計 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 網站!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計5632字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 交城县| 秭归县| 绿春县| 库尔勒市| 景洪市| 内黄县| 安丘市| 措勤县| 榆林市| 滨海县| 马山县| 江门市| 建水县| 望都县| 阿克陶县| 苏尼特左旗| 涟水县| 乌拉特前旗| 邹平县| 遂宁市| 香格里拉县| 南皮县| 东宁县| 岑溪市| 霸州市| 大兴区| 彭泽县| 马公市| 永定县| 河南省| 通化县| 安阳县| 沙田区| 田东县| 武宁县| 县级市| 尉犁县| 措美县| 青龙| 故城县| 连州市|