Sqoop實現 Hadoop(Hive)與Mysql間數據傳遞

sqoop中文手冊:http://blog.csdn.net/myrainblues/article/details/43673129html

 

1、準備

1.sqoop1.4.6安裝包:https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.6/java

2.sqoop-1.4.6 jar包: http://central.maven.org/maven2/org/apache/sqoop/sqoop/1.4.6/mysql

3.mysql-connector-java.jar:http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.25/sql

4.Hadoop版本:5.7.1數據庫

2、安裝

1.解壓apache

tar -zxvf sqoop-1.4.6.tar.gzvim

配置sqoop環境變量(可不配):服務器

vim /etc/profileapp

export SQOOP_HOME=/opt/soft/sqoop-1.4.6
export PATH=$SQOOP_HOME/bin:$PATHmaven

使環境變量生效source /etc/profile

2.將下載好的sqoop-1.4.6 jar,mysql-connector-java.jar移動到 sqoop-1.4.6/lib下

注意:sqoop-1.4.6.jar不導入啓動會報錯,mysql-connector-java.jar作MySQL數據庫連接用

3、測試

1.導入功能:數據庫中的數據導入到HDFS系統

命令: sqoop import -connect jdbc:mysql://192.168.20.8:3306/qf_db -username root -password root -table student -target-dir /qf_db/student2 -m 1  -fields-terminated-by '\t'

參數介紹: ./sqoop是操做sqoop最經常使用的命令也是功能最強大的命令

import是導入的意思;

-connect jdbc:mysql://192.168.220.8:3306意思是以jdbc的方式鏈接數據庫,192.168.220.8是咱們的Windows的IP地址,3306是端口,qf_db是咱們t_clue表所在的數據庫的名稱;

-username root -password root 是指數據庫的用戶名和密碼;

-table t_clue意思是咱們要導的是t_clue表;

-target-dir指定要存放到服務器的哪一個目錄下;

-m指定要起的mapper的數量;

-fields-terminated-by '\t' 指定列與列的分隔符爲製表符;

-split-by id 經過該參數值來進行切分,而後將切分出來的區域分配到不一樣map中,類型有不一樣的切分方法;

-columns 'ID,Name,Age' 意思是咱們要導入的只有ID、Name和Age這三列;

-where 'ID>=3 and ID<=8',篩選數據並導入符合條件的數據;

-query 'select * from Student where ID>5 and $CONDITIONS' 使用query語句來篩選咱們的數據,這意味着咱們能夠導入多張表的數據,使用query語句的話,就不用指定table了(注意:若是使用--query這個命令的時候,須要注意的是where後面的參數,AND $CONDITIONS這個參數必須加上,並且存在單引號與雙引號的區別,若是--query後面使用的是雙引號,那麼須要在$CONDITIONS前加上\即\$CONDITIONS);

出現錯誤:

 (1)ERROR tool.BaseSqoopTool: Error parsing arguments for list-tables:

檢查你的連接內容,是否添寫正確,若是沒有問題,再檢查是否包含中文字符;

(2)java.sql.SQLException: null,  message from server: "Host 'Hadoop1' is not allowed to connect to this

update user set host ='%' where user ='root';

執行刷新權限:flush privileges;

注意:執行過程當中只有map,reduce的進度始終是0%,說明導入功能根本就沒用到reduce的功能。是由於要把數據庫中的數據導入到HDFS系統,只須要多臺設備同時到數據庫中去讀取一條一條數據而後直接上傳到HDFS,根本就不須要進行合併操做。

原理:

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()

2.Hdfs 導出數據文件至MySQL

命令例子:sqoop export -connect jdbc:mysql://192.168.20.8:3306/qf_db_test -username root -password root -table student -export-dir /qf_db/student2 -m 1  -fields-terminated-by '\t'

Sqoop1與Sqoop2對比:

http://blog.csdn.net/sunflower_cao/article/details/40348721

 

參考:

sqoop官網: http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html

相關文章
相關標籤/搜索