系統環境
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;