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 指令碼 便可以執行了,指令碼最好按官方文件寫