1. 程式人生 > >sqoop安裝及簡單入門

sqoop安裝及簡單入門

Apache Sqoop

Sqoop 是 Hadoop 和關係資料庫伺服器之間傳送資料的一種工具。它是用來從關係資料庫如: MySQL, Oracle 到 Hadoop 的HDFS,並從 Hadoop 的檔案系統匯出資料到關係資料庫。 由 Apache 軟體基金會提供。

Sqoop: “SQL 到 Hadoop 和 Hadoop 到 SQL” 。 Sqoop 工作機制是將匯入或匯出命令翻譯成 mapreduce 程式來實現。 在翻譯出的 mapreduce 中主要是對 inputformat 和 outputformat 進行定製。

sqoop 安裝

安裝環境: CentOS6.7x64(預設已安好jdk, hadoop及mysql) sqoop版本: 1.4.6 安裝步驟:

  1. 上傳解壓重新命名

  2. 修改conf裡的檔案

    cp sqoop-env-template.sh sqoop-env.sh
    vi sqoop-env.sh
    #新增如下配置:
    export HADOOP_COMMON_HOME=/export/server/hadoop-2.7.4
    export HADOOP_MAPRED_HOME=/export/server/hadoop-2.7.4
    export HIVE_HOME=/export/server/hive
    
  3. 加入 mysql 的 jdbc 驅動包 將mysql-connector-java-5.1.28.jar拷貝到sqoop的lib目錄下

  4. 驗證啟動 在sqoop根目錄下執行:

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

    執行此命令會列出所有 mysql 的資料庫.

sqoop的簡單使用

  1. 匯入mysql表資料到hdfs 在sqoop根路徑下執行如下命令,將資料庫userdb中的emp表匯入到hdfs的/sqoopresult路徑下

    bin/sqoop import \
    --connect jdbc:mysql://localhost:3306/userdb \
    --username root \
    --password 1234 \
    --target-dir /sqoopresult \
    --table emp --m 1
    

    執行完成後檢視hdfs的/sqoopresult路徑下的檔案

    [[email protected] sqoop]# hdfs dfs -cat /sqoopresult/part-m-00000
    1201,gopal,manager,50000,TP
    1202,manisha,Proof reader,50000,TP
    1203,khalil,php dev,30000,AC
    1204,prasanth,php dev,30000,AC
    1205,kranthi,admin,20000,TP
    

    資料和emp表中相吻合

  2. 匯入mysql表資料到hive

    執行如下命令,在hive中的test1庫中建立emp_add_sp表,並複製mysql中的emp_add表結構(表資料不會匯入)

    bin/sqoop create-hive-table \
    --connect jdbc:mysql://localhost:3306/userdb \
    --table emp_add \
    --username root \
    --password 1234 \
    --hive-table test1.emp_add_sp
    

    然後在執行如下命令,將表資料匯入到hive中的表

    bin/sqoop import \
    --connect jdbc:mysql://localhost:3306/userdb \
    --username root \
    --password 1234 \
    --table emp_add \
    --hive-table test1.emp_add_sp \
    --hive-import \
    --m 1
    

    執行完成後連線hive進行檢視

    0: jdbc:hive2://node1:10000> select * from emp_add_sp;
    +----------------+-----------------+--------------------+------------------+--+
    | emp_add_sp.id  | emp_add_sp.hno  | emp_add_sp.street  | emp_add_sp.city  |
    +----------------+-----------------+--------------------+------------------+--+
    | 1201           | 288A            | vgiri              | jublee           |
    | 1202           | 108I            | aoc                | sec-bad          |
    | 1203           | 144Z            | pgutta             | hyd              |
    | 1204           | 78B             | old city           | sec-bad          |
    | 1205           | 720X            | hitec              | sec-bad          |
    +----------------+-----------------+--------------------+------------------+--+
    

    資料與mysql表中一致

  3. 匯入表資料子集 還可以使用查詢語句將查詢出來的表資料進行匯入操作 例如: --where 可以指定從關係資料庫匯入資料時的查詢條件,它執行在各自的資料庫伺服器相應的 SQL 查詢,並將結果儲存在 HDFS 的目標目錄

    bin/sqoop import \
    --connect jdbc:mysql://localhost:3306/userdb \
    --username root \
    --password 1234 \
    --where "city ='sec-bad'" \
    --target-dir /wherequery \
    --table emp_add \
    --m 1
    

    使用–query執行查詢語句,將結果進行hdfs匯入; --split-by指定欄位切割; --fields-terminated-by指定分割符

    bin/sqoop import \
    --connect jdbc:mysql://localhost:3306/userdb \
    --username root \
    --password 1234 \
    --target-dir /wherequery12 \
    --query 'select id,name,deg from emp WHERE  id>1203 and $CONDITIONS' \
    --split-by id \
    --fields-terminated-by '\t' \
    --m 1
    
  4. 增量匯入 增量匯入示例:

    bin/sqoop import \
    --connect jdbc:mysql://localhost:3306/sqoopdb \
    --username root \
    --password 1234 \
    --table emp --m 1 \
    --incremental append \
    --check-column id \
    --last-value 1205
    

    其中–incremental append表示是增加模式, --check-column id表示使用id欄位作為檢查欄位; --last-value 1205表示記錄上次資料匯入到id=1205處 –check-column一般選擇使用自增主鍵 –last-value引數可以使用變數替代,以實現自動記錄

  5. 匯出資料至mysql

    首先需要手動建立mysql中的目標表:

    mysql> USE userdb;
    	CREATE TABLE employee ( 
       	id INT NOT NULL PRIMARY KEY, 
       	name VARCHAR(20), 
       	deg VARCHAR(20),
       	salary INT,
       	dept VARCHAR(10));
    

    然後執行匯出命令, 將hdfs的/emp_data下的檔案內容匯出至employee表中

    bin/sqoop export \
    --connect jdbc:mysql://localhost:3306/userdb \
    --username root \
    --password 1234 \
    --table employee \
    --export-dir /emp_data