『壹』 Sqoop工作原理是什麼
Sqoop是一款用於把關系型資料庫中的數據導入到hdfs中或者hive中的工具,當然也支持把數據從hdfs或者hive導入到關系型資料庫中。
Sqoop也是基於Maprece來做的數據導入。
關於sqoop的原理
sqoop的原理比較簡單,就是根據用戶指定的sql或者欄位參數,從資料庫中讀取數據導入到hive或者hdfs中。也支持基於資料庫導出工具導出,不陵槐御過受限於資料庫的版本。
在導出的過程中,sqoop會自動切分maprece任務。比如某個欄位的主鍵是從1到1000,那麼當設置num-mappers為2時,第一個mr任務會讀取1-500的數據,第二個mr任務會讀取500-1000的尺岩數據。如果是字元串還有其他的劃分方法.
關明沖於架構
sqoop目前有兩個大版本,第一個版本比較簡單,只能使用命令行
第二個版本引入了sqoop server,統一處理連接等信息,並提供多種連接方式,還引入了許可權控制,另外規范了連接的各項配置。
『貳』 sqoop支持的資料庫有什麼
1、Sqoop(發音:skup)是一款開源的工具,主要用於在Hadoop(Hive)與傳統的資料庫(mysql、postgresql...)間進行數據的傳遞,可以將一個關系型資料庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關系型資料庫中。
2、所以sqoop可以支持大多數的傳統關系型資料庫。如:Mysql、Oracle、Postgres等。
『叄』 怎麼通過sqoop將hdfs上數據導入到mysql
sqoop是一個能把數據在關系型資料庫和HDFS之間互相傳輸的工具。在這里,我寫一下用java 程序來實現sqoop把數據從HDFS寫入到MYSQL。
在接觸sqoop之前,我自己寫了一個傳輸類來實現數據從HDFS到MYSQL。這里簡單說一下時間的思想:
1、在MYSQL中創建一個參數表A,用來記錄要傳輸的表的表名B和欄位。
2、HDFS上的數據的格式和MYSQL中參數表A中B表的欄位的數量一樣。
3、從MYSQL的參數表A中,讀取要傳輸的表B。把這些欄位拼湊成一個insert語句,例如
,拼湊為insert into b(column1,column2..) values(value1,value2...)
4、從HDFS相應的目錄逐行讀取數據,通過JDBC,把數據批量導入到MYSQL的B表中。
我現在用sqoop來代替原來傳輸的那個功能。先做一下准備工作:
1、hadoop的每個節點下lib文件夾中要有mysql的jar包和sqoop的jar包。
2、在HDFS的某個目錄上的數據格式和MYSQL相應的表中的欄位數量一致。
實現類如下:
package sqoop;
import java .util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.sqoop.Sqoop;
import org.apache.sqoop.tool.ExportTool;
/**
* 用SQOOP來把數據從HDFS導入到MYSQL。
* */
public class Test {
public static void main(String[] args) {
List<String> generatedJarsList = new ArrayList<String>();
Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://master:9000");
conf.set("hadoop.job.ugi", "hadooper,hadoopgroup");
conf.set("mapred.job.tracker", "master:9001");
ArrayList<String> list = new ArrayList<String>(); //定義一個list
list.add("--table");
list.add("a_baat_client"); //mysql中的表。將來數據要導入到這個表中。
list.add("--export-dir");
list.add("/tmp/datathree/"); //hdfs上的目錄。這個目錄下的數據要導入到a_baat_client這個表中。
list.add("--connect");
list.add("jdbc:mysql://192.168.1.10:3306/report"); //mysql的鏈接
list.add("--username");
list.add("root"); //mysql的用戶名
list.add("--password");
list.add("root"); //mysql的密碼
list.add("--lines-terminated-by");
list.add("\\n"); //數據的換行符號
list.add("-m");
list.add("1");//定義maprece的數量。
String[] arg = new String[1];
ExportTool exporter = new ExportTool();
Sqoop sqoop = new Sqoop(exporter);
sqoop.setConf(conf);
arg = list.toArray(new String[0]);
int result = Sqoop.runSqoop(sqoop, arg);
System.out.println("res:" + result); //列印執行結果。
}
}
這個導出類執行過程中,可以在瀏覽器中看一下http://master:50030頁面。會發現導出數據也是一個把任務轉換為maprece執行的過程。
當然,上面的java代碼,也可以用命令行來實現。命令如下:
bin/sqoop export --connect jdbc:mysql://192.168.1.10:3306/report \
--table a_baat_client --username root --password root \
--export-dir /tmp/datathree/ -m 1
關於sqoop把數據從HDFS導入到MYSQL就說這么多。把數據從HIVE導入到MYSQL,其實可以理解為把HIVE表所對應的HDFS路徑的數據導入到MYSQL,這里就不多說了。