Sqoop數據導入導出(MySQL,HDFS,Hive,HBse)

系統環境

Linux Ubuntu 16.04

jdk-7u75-linux-x64

hive-1.1.0-cdh5.4.5

hadoop-2.6.0-cdh5.4.5

sqoop-1.4.5-cdh5.4.5

hbase-1.0.0-cdh5.4.5

mysql-5.7.24

相關知識

在導入開始之前,Sqoop使用JDBC來檢查將要導入的表。他檢索出表中所有的列以及列的SQL數據類型。這些SQL類型(varchar、integer)被映射到Java數據類型(String、Integer等),在MapReduce應用中將使用這些對應的Java類型來保存字段的值。Sqoop的代碼生成器使用這些信息來創建對應表的類,用於保存從表中抽取的記錄。Sqoop啓動的MapReduce作業用到一個InputFormat,他可以通過JDBC從一個數據庫表中讀取部分內容。

Hadoop提供的DataDriverDB InputFormat能爲查詢結果進行劃分傳給指定個數的map任務。爲了獲取更好的導入性能,查詢會根據一個“劃分列”來進行劃分。Sqoop會選擇一個合適的列作爲劃分列(通常是表的主鍵)。在生成反序列化代碼和配置InputFormat之後,Sqoop將作業發送到MapReduce集羣。Map任務將執行查詢並將ResultSet中的數據反序列化到生成類的實例,這些數據要麼直接保存在SequenceFile文件中,要麼在寫到HDFS之前被轉換成分割的文本。Sqoop不需要每次都導入整張表,用戶也可以在查詢中加入到where子句,以此來限定需要導入的記錄。

在這裏插入圖片描述

			(Sqoop數據導入原理圖)

Sqoop導出功能的架構與其導入功能非常相似,在執行導出操作之前,Sqoop會根據數據庫連接字符串來選擇一個導出方法。一般爲JDBC。然後,Sqoop會根據目標表的定義生成一個Java類。這個生成的類能夠從文本文件中解析記錄,並能夠向表中插入合適類型的值。接着會啓動一個MapReduce作業,從HDFS中讀取源數據文件,使用生成的類解析記錄,並且執行選定的導出方法。

在這裏插入圖片描述

			(Sqoop 數據導出原理圖)

任務內容

1.練習使用Sqoop將數據在Mysql與HDFS之間的導入導出。

2.練習使用Sqoop將數據從Mysql中導入到HBase中。

3.練習使用Sqoop將數據在Mysql與Hive之間的導入導出。

任務步驟

現有buyer_log表,存儲了買家行爲日誌,包含四個字段(ID,用戶ID,時間,IP,操作類型)。

ID     用戶ID       時間                    IP          操作類型
461    10181    2010-03-26 19:45:07    123.127.164.252    1
462    10262    2010-03-26 19:55:10    123.127.164.252    1
463    20001    2010-03-29 14:28:02    221.208.129.117    2
464    20001    2010-03-29 14:28:02    221.208.129.117    1
465    20002    2010-03-30 10:56:35    222.44.94.235    2
466    20002    2010-03-30 10:56:35    222.44.94.235    1
481    10181    2010-03-31 16:48:43    123.127.164.252    1
482    10181    2010-04-01 17:35:05    123.127.164.252    1
483    10181    2010-04-02 10:34:20    123.127.164.252    1
484    20001    2010-04-04 16:38:22    221.208.129.38    1

1.首先檢查Hadoop相關進程,是否已經啓動。若未啓動,切換到/apps/hadoop/sbin目錄下,啓動Hadoop。

jps  
cd /apps/hadoop/sbin  
./start-all.sh  

在這裏插入圖片描述
2.在Linux本地新建/data/sqoop2目錄。

mkdir -p /data/sqoop2  

切換到/data/sqoop2目錄下,使用wget命令,下載http://192.168.1.100:60000/allfiles/sqoop2中的文件。

cd /data/sqoop2
wget http://192.168.1.100:60000/allfiles/sqoop2/buyer_log

在這裏插入圖片描述
3.開啓mysql服務。(密碼:zhangyu)

sudo service mysql start  

連接Mysql,用戶名爲root,密碼爲strongs。

 mysql -u root -p  

在這裏插入圖片描述
4.在Mysql中創建數據庫mydb,並使用mydb數據庫。

create database mydb;  
use mydb;  

在mydb數據庫中創建表record。

create table record
(
  id varchar(100),
  buyer_id varchar(100),
  dt varchar(100),
  ip varchar(100),
  opt_type varchar(100)
);

在這裏插入圖片描述
5.將Linux本地/data/sqoop2/buyer_log裏的內容,導入的mydb數據庫record表中。

load data infile '/data/sqoop2/buyer_log' into table record fields terminated by '\t';

查看record表中內容。

select * from record;  

在這裏插入圖片描述
6,另開一個窗口,使用Sqoop查看Mysql中的數據庫。此步目的是檢查Sqoop以及Mysql是否可以正常使用。

sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root \
--password strongs

在這裏插入圖片描述
使用Sqoop查看Mysql中的表 (在jdbc連接字符串中添加了數據庫的名稱。用於直接訪問數據庫實例)。

sqoop list-tables \
--connect jdbc:mysql://localhost:3306/mydb \
--username root \
--password strongs

在這裏插入圖片描述

使用Sqoop將Mysql中的數據導入到HDFS

1.使用Sqoop將Mysql中mydb數據庫record表裏的數據導入到HDFS/mysqoop2目錄裏。(HDFS上的/mysqoop2目錄,不需要提前創建)。

sqoop import \
--connect jdbc:mysql://localhost:3306/mydb \
--username root \
--password strongs \
--table record -m 1 \
--target-dir /mysqoop2

在這裏插入圖片描述
2.查看HDFS上/mysqoop2目錄下的文件內容。

hadoop fs -cat /mysqoop2/part-m-00000 

在這裏插入圖片描述

將HDFS中數據存入到Mysql數據庫中

1.在Mysql窗口,mydb數據庫下,新建一張表recordfromhdfs,表結構與record表相同。將HDFS上/mysqoop2/part-m-00000裏的數據,導入到Mysql中的recordfromhdfs表中。

連接Mysql,並創建表recordfromhdfs。

  use mydb  
    create table recordfromhdfs like record;  

在這裏插入圖片描述
2.在另一個窗口,開始導數據。

sqoop export \
--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table recordfromhdfs \
--export-dir hdfs://localhost:9000/mysqoop2/part-m-00000

注意connect後面 連接字符串要帶上編碼方式characterEncoding=UTF-8,否則中文數據會有亂碼的情況產生。

3.查看Mysql中recordfromhdfs表中內容:

  select * from recordfromhdfs;  

在這裏插入圖片描述

將Mysql中數據導入到HBase中

1.使用Sqoop將Mysql中mydb數據庫record表中的數據,導入到HBase中hbaserecord表中,同時以dt爲rowkey。

輸入jps查看HBase相關進程是否已啓動,若未啓動,則需切換到/apps/hbase/bin目錄下,啓動HBase。

cd /apps/hbase/bin  
./start-hbase.sh  

2.在Linux命令行中,輸入hbase shell,進入HBase命令行模式。

   hbase shell  

在這裏插入圖片描述
3.開始導數據

sqoop import \
--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table record \
--hbase-create-table \
--hbase-table hbaserecord \
--column-family mycf \
--hbase-row-key dt -m 1

在這裏插入圖片描述
4.查看HBase中,都有哪些表。
在這裏插入圖片描述
5.查看HBase表hbaserecord裏的內容。
在這裏插入圖片描述
使用Sqoop將HBase中數據導出到Mysql中,暫時無法直接接口實現,需要藉助其他途徑去處理,比如:HBase=>HDFS=>Mysql或 HDFS=>Hive=>Mysql

使用Sqoop將Mysql中record表中的數據,導入到Hive中的hiverecord表中。

使用vim編輯用戶環境變量

vim ~/.bashrc  

將以下內容追加到#hadoop下:

#hadoop
export HADOOP_HOME=/apps/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/apps/hive/lib/*

執行source,使用戶環境變量生效。

source /etc/profile 

1.開啓Hive,在Hive中創建hiverecord表,包含(id,buyer_id,dt,ip,opt_type)五個字段,字符類型均爲varchar(100),分隔符爲‘,’

hive
create table hiverecord (id varchar(100),buyer_id varchar(100),dt varchar(100), ip varchar(100), opt_type varchar(100))
row format delimited fields terminated by ','  stored as textfile;

在這裏插入圖片描述
2.在linux命令行下,使用Sqoop將Mysql中record表導入Hive中。

sqoop import \
--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table record \
--hive-import \
--hive-table hiverecord \
--fields-terminated-by ',' -m 1

3.在hive下,查看Hive中hiverecord表。

select * from hiverecord;  

使用Sqoop將Hive表hiverecord表中的數據,導出到Mysql中的recordfromhive表中。

1.首先在Mysql中創建表recordfromhive。

   create table recordfromhive like record;  

在這裏插入圖片描述
2.在linux命令行下,使用sqoop開始導數據。

sqoop export \
--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table recordfromhive \
--export-dir /user/hive/warehouse/hiverecord/part-m-00000 \
--input-fields-terminated-by ','

3.導入完成,查看Mysql中recordfromhive表。

select * from recordfromhive;  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章