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 安裝步驟:
-
上傳解壓重新命名
-
修改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
-
加入 mysql 的 jdbc 驅動包 將mysql-connector-java-5.1.28.jar拷貝到sqoop的lib目錄下
-
驗證啟動 在sqoop根目錄下執行:
bin/sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 1234
執行此命令會列出所有 mysql 的資料庫.
sqoop的簡單使用
-
匯入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表中相吻合
-
匯入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表中一致
-
匯入表資料子集 還可以使用查詢語句將查詢出來的表資料進行匯入操作 例如: --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
-
增量匯入 增量匯入示例:
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引數可以使用變數替代,以實現自動記錄
-
匯出資料至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