1. 程式人生 > >Sqoop核心原理及應用詳解

Sqoop核心原理及應用詳解

Sqoop依賴與hadoop        資料的一方,儲存在hdfs        底層的資料傳輸實現map/reduce yarn 只有map任務 因為官網sqoop沒有hadoop2.5對應的版本,要根據hadoop的版本進行編譯(好像不用對應版本也可以,不過建議最好對應版本)。所以這裡使用CDH 5.3.6。比較穩定。 去Cloudera的官網下載相應的釋出版本號 http;//archive.cloudera.com/cdh5/ 使用CDH 5.3.6版本快速搭建Hadoop 2.x的偽分佈和Hive環境 Hadoop-2.5.0-cdh5.3.6.tar.gz         安裝在/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6 Hive-0.13.1-cdh5.3.6.tar.gz              安裝在/opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6 Zookeeper-3.4.5-cdh.5.4.6.tar.gz    安裝在/opt/cdh-5.3.6/zookeeper-3.4.5-cdh.5.4.6 Sqoop-1.4.5-cdh5.3.6.tar.gz             安裝在/opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6

Sqoop 安裝及基本使用講解

(1)解壓安裝包到/opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6

tar –zxvf Sqoop-1.4.5-cdh5.3.6.tar.gz –C /opt/cdh-5.3.6/

(2) 把mysql的jdbc驅動mysql-connector-java-5.1.10.jar複製到sqoop專案的lib目錄下

(3) 在${SQOOP_HOME}/conf中執行命令

mv sqoop-env-template.sh sqoop-env.sh

(4) 修改配置檔案sqoop-env.sh

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6

#set the path to where bin/hbase is available
#export HBASE_HOME=/usr/local/hbase

#Set the path to where bin/hive is available
export HIVE_HOME=/opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6

#Set the path for where zookeper config dir is
#export ZOOCFGDIR=/usr/local/zk

好了,搞定了,下面就可以運行了。

測試:

1、列出mysql資料庫中的所有資料庫

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

2、連線mysql並列出資料庫中的表

sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username root --password root

使用Sqoop匯入資料到HDFS及本質分析

(1)gather metadata   獲取元資料

(2)submit map only job 提交MR任務 僅僅執行map任務

建立測試表:

create table my_user(
	id	tinyint(4) not null auto_increment,
	account	varchar(255) default null,
	passwd varchar(255) default null,
	primary key (id)
)

insert into my_user values ('1','admin','admin');
insert into my_user values ('2','test2','test2');
insert into my_user values ('3','test3','test3');
insert into my_user values ('4','test4','test4');
insert into my_user values ('5','test5','test5');
insert into my_user values ('6','test6','test6');
insert into my_user values ('7','test7','test7');

匯入資料到hdfs

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_user \
--num-mappers 1 \ 或者-m

不寫匯出目錄,預設匯出到使用者名稱下,如:/user/beifeng/my_user

預設4個map任務,預設逗號隔開

Sqoop匯入資料設定資料儲存格式parquet

hdfs中常見的資料儲存格式     textfile     orcfile     parquet

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_user_parquet \
--num-mappers 1 \
--as-parquetfile

在hive中create table hive_user

create table default.hive_user_orc(
	id int,
	username string,
	passwd string
)
row format delimited fields terminated by ','
stored as parquet

載入資料

load data inpath '/user/beifeng/sqoop/imp_my_user_parquet' into table default.hive_user_orc

查詢資料

select * from hive_user_orc;

發現數據全部是null 這是sqoop1.4.5的bug 到1.4.6後已經修復

Sqoop匯入資料使用query講解

查詢指定列資料匯入

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_user_columns \ 目標路徑
--num-mappers 1 \ map數
--columns id,account \ 匯出的指定列

在實際的專案中,要處理的資料,需要進行初步清洗和過濾

 某些欄位過濾

 條件

 join

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--query 'select id,account from my_user where $CONDITIONS '  \ 
--target_dir /user/beifeng/sqoop/imp_my_user_query \
--num-mappers 1 \

Sqoop匯入資料設定資料壓縮為sanppy

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_sannpy \
--delete-target-dir \如果目標目錄存在,則刪除。如果不設定這個,目標目錄存在則會報錯
--num-mappers 1 \
--compress \ 設定壓縮 下面是壓縮方法
--compression-codec org.apache.hadoop.io.compress.SnappyCodec \
-- fields-terminated-by '\t' \ 設定字元之間的格式

報錯:cdh不支援壓縮格式

檢查:

cd {hadoop}/bin/native
ls

什麼都沒有

bin/hadoop checknative 檢查本地庫支援哪些壓縮操作

發現都是false

解決方法:

編譯

cdh中的hadoop原始碼,將native的包拷貝到{hadoop}/bin/hadoop/native下

對snappy壓縮資料結合Hive進行資料的匯入與分析

drop table if exists default.hive_user_snappy;
create table default.hive_user_snappy(
	id int,
	username string,
	passwd string
)
row format delimited fields terminated by ',';

load data inpath '/user/beifeng/sqoop/imp_my_sannpy' into table default.hive_user_snappy

mysql table

 mysql匯入資料到hdfs

     hdfs sanpy

 建立hive表

     hive create table

 匯入hdfs資料到hive

     load data into table

 hive中資料分析

     query

Sqoop匯入資料時兩種增量方式匯入

增量資料的匯入     有一個唯一的識別符號,通常這個表都有一個欄位,比如插入時間createtime     query         where createtime > 20161105 and createtime < 20161106     sqoop自帶增量匯入         --check-column  /檢查哪一個值         --incremental   /append or lastmodified         --last-value    /檢查的值的最後一個值數多少

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_increament \
--num-mappers 1 \
--incremental append \ 不能和--delete-target-dir一起使用
--check-column id \
--last-value 4

Sqoop匯入資料direct使用

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_direct \
--delete-target_dir \
--num-mappers 1 \
--direct
速度變快

Sqoop匯出資料Export使用

hive table     table             hiveserver2進行jdbc方式查詢資料     hdfs file         export -> mysql/oracle

touch /opt/datas/user.txt
vi /opt/datas/user.txt
	8,test8,test8
	9,test9,test9
bin/hdfs dfs -mkdir -p /user/beifeng/sqoop/exp/user/
bin/hdfs dfs -put /opt/datas/user /user/beifeng/sqoop/exp/user/

		
bin/sqoop export \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--export-dir /user/beifeng/sqoop/exp/user \
--num-mappers 1 \

Sqoop如何將RDBMS表中的資料匯入到Hive表中

use default;
create table user_hive(
	id int,
	account string,
	passwd string
)
row format delimited fields terminated by '\t'
bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 1 \
--hive-import \
--hive-database default \
--hive-table user_hive

Sqoop如何匯出Hive表中資料到RDBMS中

這就是將hdfs中資料匯出到rdbms中,同:Sqoop匯出資料Export使用

Sqoop使用--options-file進行執行任務講解

Hive中有     bin/hive –f 指令碼 便可以執行 sqoop中使用     bin/sqoop –option-file 指令碼 便可以執行了,指令碼最好按官方文件寫