sqoop入門教程

2022-12-28 16:32:48 來源:51CTO博客

目錄

一、Sqoop概述

1、簡介2、Sqoop架構原理3、Sqoop連接器

二、Sqoop安裝

1、sqoop下載解壓2、sqoop配置文件3、mysql的jar包設置4、sqoop環境變量設置5、sqoop安裝驗證1)sqoop環境變量驗證2)sqoop連接mysql驗證


(相關資料圖)

三、Sqoop導入

1、操作前提;1) 將數據庫連接驅動拷貝到$SQOOP_HOME/lib里;2) 啟動軟件;2、導入機制;3、導入數據與HDFS;4、導入數據與Hive;5、將數據導入Hbase;

四、遇到的問題及解決

1、錯誤012、錯誤023、錯誤03



一、Sqoop概述

1、簡介

Apache Sqoop(TM)是一種用于在Hadoop和結構化數據存儲(如關系數據庫)之間高效傳輸批量數據的工具。2012年3月成功孵化,現已成為頂級Apache項目。

概念圖

官網地址: http://sqoop.apache.org 2、Sqoop架構原理

一個組織中有價值的數據都存儲在關系型數據庫系統等結構化存儲器中。Sqoop允許用戶將數據從結構化存儲器抽取到Hadoop中,用亍迚一步的處理。抽取出的數據可以被MapReduce程序使用,也可以被其他類似亍Hive的工具使用。一旦生成最終的分析結果,Sqoop便可以將這些結果導回數據存儲器,供其他客戶端使用。

Sqoop架構圖

Sqoop工具接收到客戶端的shell命令或者Java api命令后,通過Sqoop中的任務翻譯器(TaskTranslator)將命令轉換為對應的MapReduce任務,而后將關系型數據庫和Hadoop中的數據迚行相互轉移,終而完成數據的拷貝。

3、Sqoop連接器

Sqoop擁有一個可擴展的框架,使得它能夠從(向)任何支持批量數據傳輸的外部存儲系統導入(導出)數據。

一個Sqoop連接器(connector)就是這個框架下的一個模塊化組件,用于支持Sqoop的導入和導出操作。

Sqoop內置的連接器能夠支持大多數常用的關系數據庫系統,包括MySQL、Oracle、SQLserver和DB2。同時還有一個通用的JDBC連接器,性能都絆過了優化。

除了內置的Sqoop連接器外,還有很多針對各種數據存儲器的第三方連接器可用,能夠支持對企業級數據倉庫(包括Netezza、Teradata和Oracle)和NoSQL存儲器(例如Couchbase)的連接。這些連接器必須另外單獨下載,幵安裝說明使用。

二、Sqoop安裝

1、sqoop下載解壓

下載地址: http://mirror.bit.edu.cn/apache/sqoop/1.4.7/

解壓及更名

tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gzmv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7

2、sqoop配置文件

sqoop/conf/ sqoop-env.sh文件

[root@hadoop11 app]# cd sqoop-1.4.7/conf/[root@hadoop11 conf]# mv sqoop-env-template.sh sqoop-env.sh

編輯 sqoop-env.sh腳本

#Set path to where bin/hadoop is availableexport HADOOP_COMMON_HOME= /usr/app/hadoop-2.7.3#Set path to where hadoop-*-core.jar is availableexport HADOOP_MAPRED_HOME= /usr/app/hadoop-2.7.3#set the path to where bin/hbase is availableexport HBASE_HOME= /usr/app/hbase-1.2.6#Set the path to where bin/hive is availableexport HIVE_HOME= /usr/app/hive-1.2.1#Set the path for where zookeperconfigdir isexport ZOOCFGDIR= /usr/app/zookeeper-3.4.8

3、mysql的jar包設置將mysql-connector-java-5.1.36-bin.jar放到sqoop/lib目錄下

備注:CDH5.14.4的sqoop中lib包存儲位置,如果沒有mysql的驅動則報錯。找不到mysql驅動

4、sqoop環境變量設置

#配置Sqoop環境變量[root@hadoop11 app]# vi /etc/profileexport SQOOP_HOME=/usr/app/sqoop-1.4.7export PATH=$PATH:$SQOOP_HOME/bin#使環境變量配置生效[root@hadoop11 app]# source /etc/profile

5、sqoop安裝驗證1)sqoop環境變量驗證

[root@hadoop11 ~]# sqoop-version

2)sqoop連接mysql驗證

[root@hadoop11 bin]# ./sqoop-list-tables --connect  jdbc:mysql://localhost:3306/mysql  --username  root  -P輸入mysql密碼:123456

三、Sqoop導入

上面案例介縐如何將mysql的表中數據導入到hadoop的hdfs中。下面系統介縐下Sqoop的導入。

1、操作前提;

1) 將數據庫連接驅動拷貝到$SQOOP_HOME/lib里;

2) 啟動軟件;

1、zookeeper  2、Hadoop  3、hbase

2、導入機制;

Sqoop是通過一個MapReduce作業從數據庫中導入一個表,這個作業從表中抽取一行行記錄,然后將記錄寫入HDFS。

? 在導入開始之前,Sqoop使用JDBC來檢查將要導入的表。

? 它檢索出表中所有的列以及列的SQL數據類型。這些SQL類型(VARCHAR、INTEGER等)被映射到Java數據類型(String、Integer等),在MapReduce應用中將使用這些對應的Java類型來保存字段的值。

3、導入數據與HDFS;

1、加載mysql表

#建立一個數據庫sqoopCREATE DATABASE sqoop DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE  sqoop;CREATE TABLE student #學生信息表(  stuID     char(10) primary key,  #學生編號  stuName   char(10) NOT NULL ,     #學生名稱  major     char(50) NOT NULL    #專業)ENGINE=InnoDB DEFAULT CHARSET=utf8;#學生信息表中插入數據INSERT INTO student(stuID,stuName,major)VALUES("1001","林林","計算機");INSERT INTO student(stuID,stuName,major)VALUES("1002","白楊","計算機");INSERT INTO student(stuID,stuName,major)VALUES("1003","虎子","英語");INSERT INTO student(stuID,stuName,major)VALUES("1004","北漂的雪","工商管理");INSERT INTO student(stuID,stuName,major)VALUES("1005","五月","數學");

使用系統庫mysql中的student表

Sqoop的import工具會運行一個MapReduce作業,該作業會連接MySQL數據庫幵讀取表中的數據。默認情況下,該作業會幵行使用4個map仸務來加速導入過程。每個仸務都會將其所導入的數據寫到一個單獨文件,但所有4個文件都位亍同一個目錄中。

[root@hadoop11 ~]# sqoop  import  --connect jdbc:mysql://hadoop11:3306/sqoop  --username root  --password 123456  --table  student  --target-dir /sqoop/student  --delete-target-dir  --num-mappers 1 --fields-terminated-by "\t"

特別指出:sqoop與hadoop存在版本問題,可能會導致命令運行報錯。

命令解釋:( --delete-target-dir 這個是刪除目錄)

導入后,在hdfs目錄顯示如下:

4、導入數據與Hive;

對于很多類型的分析人員來說,使用類似于Hive的系統來處理關系操作有利亍加快分析仸務的開發。

Hive和Sqoop共同構成了一個強大的服務于分析任務的工具鏈。

上面任務執行成功后,經過檢測,發現Hive表結構中的數據類型與MySQL對應列有如下關系:

MySQL(bigint) --> Hive(bigint) MySQL(tinyint) --> Hive(tinyint) MySQL(int) --> Hive(int) MySQL(double) --> Hive(double) MySQL(bit) --> Hive(boolean) MySQL(varchar) --> Hive(string) MySQL(decimal) --> Hive(double) MySQL(date/timestamp) --> Hive(string)

導入hive已經創建好的表中,建立hive表

create EXTERNAL table default.student(stuID string,stuName string, major string)row format delimited fields terminated by "\t";
sqoop  import  --connect  jdbc:mysql://hadoop11:3306/sqoop  --username  root  --password  123456  --table  student  --fields-terminated-by  "\t" --delete-target  -dir --num-mappers  1  --hive-import  --hive-database  default  --hive-table  student

看日志輸出可以看出 在執行map任務之后 又執行了load data

導入后,在hdfs目錄顯示如下:

導入后,在hive目錄顯示如下:

5、將數據導入Hbase;在hbase中創建表及列簇

create "sqoop" , "student"

Sqoop將數據導入到hbase中

sqoop import -D org.apache.sqoop.splitter.allow_text_splitter=true --connect  jdbc:mysql://127.0.0.1:3306/sqoop  --table student --hbase-table sqoop --column-family  student --hbase-row-key stuID --hbase-create-table --username root --password 123456

結果如下:

參數解說:

--connect  jdbc:mysql://127.0.0.1:3306/sqoop 表示進程或者本地Mysql服務的URI,3306是Mysql默認監聽端口,rsearch是數據庫,若是其他數據庫,如Oracle,叧需修改URI即可。--table  student表示導出sqoop 數據庫的student表。--hbase-table  sqoop  表示在HBase中建立表sqoop。--column-family  student表示在表sqoop中建立列族student--hbase-row-key  stuID表示表A的row-key是student表的id字段。--hbase-create-table表示在HBase中建立表。--username  root  表示使用用戶root連接Mysql。--password  123456 表示使用用戶root連接Mysql的密碼。

Hive使用Hbase數據通過創建外部表

CREATE EXTERNAL TABLE default.sqoopHbase(       stuID STRING,      stuName STRING,      major STRING)  ROW FORMAT SERDE "org.apache.hadoop.hive.hbase.HBaseSerDe"  STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler"  WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, student:stuName,student:major")  TBLPROPERTIES("hbase.table.name"= "sqoop");

四、遇到的問題及解決

1、錯誤01

報錯信息:" Generating splits for a textual index column allowed only in case of “-Dorg.apache.sqoop.splitter.allow_text_splitter=true” property passed as a parameter"。 主要問題是“–split-by id”這個參數指定的id是一個文本格式,所以需要在命令中加入選項"-Dorg.apache.sqoop.splitter.allow_text_splitter=true",補齊命令:

sqoop import -D org.apache.sqoop.splitter.allow_text_splitter=true --connect  jdbc:mysql://127.0.0.1:3306/sqoop  --table student --hbase-table sqoop --column-family  student --hbase-row-key stuID --hbase-create-table --username root --password 123456

2、錯誤02Sqoop導入mysql表中的數據到hive,出現如下錯誤:

ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.

?解決方法:

往/etc/profile最后加入 export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*然后刷新配置,source /etc/profile

3、錯誤03Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf

18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:530)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:621)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.Sqoop.run(Sqoop.java:147)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.Sqoop.main(Sqoop.java:252)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at java.net.URLClassLoader.findClass(URLClassLoader.java:381)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at java.lang.ClassLoader.loadClass(ClassLoader.java:424)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at java.lang.ClassLoader.loadClass(ClassLoader.java:357)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at java.lang.Class.forName0(Native Method)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at java.lang.Class.forName(Class.java:264)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44)18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -   ... 12 more18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - 18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - Process completed unsuccessfully in 17 seconds.18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a ERROR - Job run failed!

解決:

在hdfs用戶下添加環境變量HADOOP_CLASSPATH# sudo su hdfs;# vi ~/.bash_profileexport HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/cloudera/parcels/CDH-5.14.4-1.cdh5.14.4.p0.3/lib/hive/lib/*PATH=$PATH:$HOME/bin# source ~/.bash_profile

北京小輝微信公眾號

大數據資料分享請關注

標簽: 環境變量 導入數據 數據類型

上一篇:當前關注:Android系統,怎么在自有App中引入小游戲?
下一篇:微頭條丨#yyds干貨盤點# 名企真題專題:直方圖內最大矩形