1. 程式人生 > >sqoop數據遷移

sqoop數據遷移

tro sta 地址 導出 sequence and git create column

概述

sqoopapache旗下一款Hadoop和關系數據庫服務器之間傳送數據”的工具。

導入數據MySQLOracle導入數據到HadoopHDFSHIVEHBASE等數據存儲系統;

導出數據:Hadoop的文件系統中導出數據到關系數據庫

技術分享

工作機制

將導入或導出命令翻譯成mapreduce程序來實現

在翻譯出的mapreduce中主要是對inputformatoutputformat進行定制

sqoop實戰及原理

sqoop安裝

安裝sqoop的前提是已經具備javahadoop的環境

1.下載並解壓

最新版下載地址http://ftp.wayne.edu/apache/sqoop/1.4.6/

2.修改配置文件

$ cd $SQOOP_HOME/conf

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

打開sqoop-env.sh並編輯下面幾行:

export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.1/

export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.1/

export HIVE_HOME=/home/hadoop/apps/hive-1.2.1

3、加入mysql
jdbc驅動包

cp ~/app/hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/

4、驗證啟動

$ cd $SQOOP_HOME/bin

$ sqoop-version

預期的輸出:

15/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6

Sqoop 1.4.6 git commit id 5b34accaca7de251fc91161733f906af2eddbe83

Compiled by abe on Fri Aug 1 11:19:26 PDT 2015

到這裏,整個Sqoop安裝工作完成。

Sqoop的數據導入

導入工具導入單個表從RDBMSHDFS。表中的每一行被視為HDFS的記錄。所有記錄都存儲為文本文件的文本數據或者Avro、sequence文件二進制數據

語法

下面的語法用於將數據導入HDFS

$ sqoop import (generic-args) (import-args)

導入表表數據到HDFS

下面的命令用於從MySQL數據庫服務器中的emp表導入HDFS。
$bin/sqoop import   --connect jdbc:mysql://hdp-node-01:3306/test   --username root  --password root   --table emp   --m 1  

m是啟動reduce個數的的意思。

為了驗證在HDFS導入的數據,請使用以下命令查看導入的數據
$ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-00000

如果報錯:

技術分享

從錯誤信息中需要訪問端口 10020 可以大概看出,DataNode 需要訪問 MapReduce JobHistory Server,如果沒有修改則用默認值:0.0.0.0:10020 。需要修改配置文件 mapred-site.xml :

[html] view plain copy
<property>  
   <name>mapreduce.jobhistory.address</name>  
   <!-- 配置實際的主機名和端口-->  
   <value>master:10020</value>  
</property>  

並且啟動MapReduce JobHistory Server服務:

在namenode上執行命令:

1.sbin/mr-jobhistory-daemon.sh start historyserver

導入關系表到HIVE

bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --hive-import --m 1

導入到HDFS指定目錄

在導入表數據到HDFS使用Sqoop導入工具,我們可以指定目標目錄。

以下是指定目標目錄選項的Sqoop導入命令的語法。

--target-dir <new or exist directory in HDFS>

下面的命令是用來導入emp_add表數據到‘/queryresult‘目錄。

bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --target-dir /queryresult --table emp --m 1

下面的命令是用來驗證 /queryresult 目錄中 emp_add表導入的數據形式。

$HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-*

它會用逗號(,)分隔emp_add表的數據和字段。

1201, 288A, vgiri, jublee

1202, 108I, aoc, sec-bad

1203, 144Z, pgutta, hyd

1204, 78B, oldcity, sec-bad

1205, 720C, hitech, sec-bad

導入表數據子集

我們可以導入表的使用Sqoop導入工具,"where"子句的一個子集。它執行在各自的數據庫服務器相應的SQL查詢,並將結果存儲在HDFS的目標目錄。

where子句的語法如下。

--where <condition>

下面的命令用來導入emp_add表數據的子集。子集查詢檢索員工ID和地址,居住城市為:Secunderabad

bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --where "city =‘sec-bad‘" --target-dir /wherequery --table emp_add --m 1

按需導入
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --target-dir /wherequery2 --query ‘select id,name,deg from emp WHERE  id>1207 and $CONDITIONS‘ --split-by id --fields-terminated-by ‘\t‘ --m 1

下面的命令用來驗證數據從emp_add表導入/wherequery目錄

$HADOOP_HOME/bin/hadoop fs -cat /wherequery/part-m-*

增量導入

增量導入是僅導入新添加的表中的行的技術。

它需要添加‘incremental’, ‘check-column’, ‘last-value’選項來執行增量導入。

下面的語法用於Sqoop導入命令增量選項。+

--incremental <mode>
--check-column <column name>
--last value <last check column value>

假設新添加的數據轉換成emp表如下:

1206, satish p, grp des, 20000, GR

下面的命令用於在EMP表執行增量導入。

bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1 --incremental append --check-column id --last-value 1208

Sqoop的數據導出

將數據從HDFS導出到RDBMS數據庫

導出前,目標表必須存在於目標數據庫中。

  • 默認操作是從將文件中的數據使用INSERT語句插入到表中
  • 更新模式是生成UPDATE語句更新表數據

語法

以下是export命令語法。

$ sqoop export (generic-args) (export-args)

數據是在HDFS “EMP/”目錄的emp_data文件中。所述emp_data如下

1201, gopal, manager, 50000, TP

1202, manisha, preader, 50000, TP

1203, kalil, php dev, 30000, AC

1204, prasanth, php dev, 30000, AC

1205, kranthi, admin, 20000, TP

1206, satish p, grp des, 20000, GR

1、首先需要手動創建mysql中的目標表

$ mysql

mysql> USE db;

mysql> CREATE TABLE employee (

id INT NOT NULL PRIMARY KEY,

name VARCHAR(20),

deg VARCHAR(20),

salary INT,

dept VARCHAR(10));

然後執行導出命令

bin/sqoop export \

--connect jdbc:mysql://hdp-node-01:3306/test \

--username root \

--password root \

--table employee \

--export-dir /user/hadoop/emp/

驗證表mysql命令行。

mysql>select * from employee;

如果給定的數據存儲成功,那麽可以找到數據在如下的employee表。

+------+--------------+-------------+-------------------+--------+

| Id | Name | Designation | Salary | Dept |

+------+--------------+-------------+-------------------+--------+

| 1201 | gopal | manager | 50000 | TP |

| 1202 | manisha | preader | 50000 | TP |

| 1203 | kalil | php dev | 30000 | AC |

| 1204 | prasanth | php dev | 30000 | AC |

| 1205 | kranthi | admin | 20000 | TP |

| 1206 | satish p | grp des | 20000 | GR |

+------+--------------+-------------+-------------------+--------+

sqoop數據遷移