天天看點

Sqoop實作MySql/Oracle與Hdfs/Hbase互導資料

下文将重點說明通過Sqoop實作Mysql與HDFS互導資料,Mysql與Hbase,​​Oracle​​與Hbase的互導最後給出指令。

一、Mysql與HDFS互導資料

環境:

主控端器作業系統為Win7,Mysql安裝在主控端上,主控端位址為192.168.66.96

3台虛拟機作業系統為​​Ubuntu​​-12.04.1-32位

三台虛拟機已成功安裝​​Hadoop​​,并實作免密鑰互訪,配hosts為:

192.168.66.91 masternode

192.168.66.92 slavenode1

192.168.66.93 slavenode2

/etc/profile已配置好必備環境變量HADOOP_HOME,JAVA_HOME

實驗在masternode上進行,已成功連接配接mysql

步驟一,下載下傳安裝包:

我安裝的Hadoop版本是原生hadoop-0.20.203.0,SQOOP不支援此版本,可使用CDH3版本hadoop,也可以通過拷貝相應的包到sqoop-1.2.0-CDH3B4/lib下,依然可以使用。

下載下傳相關檔案:

​​http://archive.cloudera.com/cdh/3/hadoop-0.20.2-CDH3B4.tar.gz​​

​​http://archive.cloudera.com/cdh/3/sqoop-1.2.0-CDH3B4.tar.gz​​

sqoop-1.2.0-CDH3B4依賴hadoop-core-0.20.2-CDH3B4.jar,是以你需要下載下傳hadoop- 0.20.2-CDH3B4.tar.gz,解壓縮後将hadoop-0.20.2-CDH3B4/hadoop-core-0.20.2- CDH3B4.jar複制到sqoop-1.2.0-CDH3B4/lib中。

另外,sqoop導入mysql資料運作過程中依賴mysql-connector-java-*.jar,是以你需要下載下傳mysql-connector-java-*.jar并複制到sqoop-1.2.0-CDH3B4/lib中。

步驟二,相關配置:

修改SQOOP的檔案configure-sqoop,注釋掉hbase和zookeeper檢查(除非你準備使用HABASE等HADOOP上的元件) #if [ ! -d "${HBASE_HOME}" ]; then

# echo “Error: $HBASE_HOME does not exist!”

# echo ‘Please set $HBASE_HOME to the root of your HBase installation.’

# exit 1

#fi

#if [ ! -d "${ZOOKEEPER_HOME}" ]; then

# echo “Error: $ZOOKEEPER_HOME does not exist!”

# echo ‘Please set $ZOOKEEPER_HOME to the root of your ZooKeeper installation.’

# exit 1

#fi

修改/etc/profile環境變量檔案(su root之後,sudo gedit /etc/profile):

添加 export SQOOP_HOME=/home/grid/sqoop

在原有PATH後添加 :$SQOOP_HOME/bin

步驟三,在mysql中建立測試使用者,測試表和資料,并測試sqoop連接配接mysql:

建立使用者sqoop并授權:

grant all privileges on *.* to 'sqoop'@'%' identified by 'sqoop' with grant option;

建立表空間(schema)sqoop,并建立測試表:

create table students (

id int not null primary key,

name varchar(20),

age int)

插入測試資料:

insert into students values('10001','liyang',29);

insert into students values('10002','lion',28);

insert into students values('10003','leon',26);

在masternode測試sqoop能否成功連接配接主控端器上的mysql:

sqoop list-tables --connect jdbc:mysql://192.168.66.96:3306/sqoop --username sqoop --password sqoop

如果能正确顯示出sqoop表空間中的students表,就說明sqoop已經可以成功連接配接mysql!

步驟四,将mysql中sqoop表空間的students表的三行資料導入HDFS:

啟動hadoop:

start-all.sh

用jps驗證啟動是否成功

顯示正在運作以下程序即為啟動成功:

2820 SecondaryNameNode

4539 Jps

2887 JobTracker

2595 NameNode

從mysql導入資料,運作如下指令:

sqoop import --connect jdbc:mysql://192.168.66.96:3306/sqoop --username sqoop --password sqoop

驗證導入資料是否成功:

若導入成功,運作 hadoop dfs -ls 将能看到根目錄/user/grid/下有以表名命名的檔案夾students

運作 hadoop dfs -ls /user/grid/students 能看到該檔案夾中包含檔案:/user/grid/students/part-m-00000

運作 hadoop dfs -cat /user/grid/students/part-m-00000

10001,liyang,29

10002,lion,28

10003,leon,26

步驟五,将HDFS中的資料導入Mysql的students表中:

首先将mysql的students表資料清空:

delete from students;

然後在masternode上執行導出資料指令:

sqoop export --connect jdbc:mysql://192.168.66.96:3306/sqoop --username sqoop --password sqoop --table students --export-dir hdfs://masternode:9000/user/grid/students/part-m-00000

若成功,在mysql中會看到students表中的資料恢複了!

注意:過程中可能會因為slavenode的50010端口沒打開而報錯,需用root使用者通過sudo ufw allow 50010指令打開端口!

二、Mysql與Hbase互導資料

将mysql的資料導入hbase的指令格式為:

sqoop import --connect jdbc:mysql://mysqlserver_IP/databaseName --username --password password --table datatable --hbase-create-table --hbase-table hbase_tablename --column-family col_fam_name --hbase-row-key key_col_name

其中 ,databaseName 和datatable 是mysql的資料庫和表名,hbase_tablename是要導成hbase的表名,key_col_name可以指定datatable中哪一列作為hbase新表的rowkey,col_fam_name是除rowkey之外的所有列的列族名

例如:可通過如下指令将Mysql中的students表導入到Hbase中:

/home/grid/sqoop/bin/sqoop import --connect jdbc:mysql://192.168.66.96/sqoop --username sqoop --password liyang16 --table students --hbase-create-table --hbase-table students --column-family stuinfo --hbase-row-key id

成功執行後,可在hbase中用以下指令檢視結果:

hbase(main):011:0> scan 'students'

ROW COLUMN+CELL

10001 column=stuinfo:age, timestamp=1356759994058, value=29

10001 column=stuinfo:name, timestamp=1356759994058, value=liyang

10002 column=stuinfo:age, timestamp=1356760044478, value=28

10002 column=stuinfo:name, timestamp=1356760044478, value=lion

10003 column=stuinfo:age, timestamp=1356760044478, value=26

10003 column=stuinfo:name, timestamp=1356760044478, value=leon

3 row(s) in 0.0900 seconds

三、Oracle與Hbase互導資料

将Oracle中的dept表(列為id,name,addr)導出至hbase中的dept表(行鍵為id,列族為deptinfo)

sqoop import --append --connect jdbc:oracle:thin:@192.168.66.90:1521:orcl --username test --password test --m 1 --table dept --columns id,name,addr --hbase-create-table --hbase-table dept --hbase-row-key id --column-family deptinfo

-------------------------------------------------------------------------------------

繼續閱讀