sqoop2伺服器地址
❶ hbase資料庫是關系型資料庫嗎
Hive 存儲格式和關系型資料庫之間進行導入導出
最近更新時間:2020-09-29 15:54:18
前往 GitHub 編輯
1. 開發准備
2. 將關系型資料庫導入到 Hive 中
3. 將 Hive 導入到關系型資料庫中
使用 HDFS 中的 Hive 數據
使用 Hcatalog 進行導入
4. 將 orc 格式的 Hive 表格導入到關系型資料庫中
確認已開通騰訊雲,並且創建了一個 EMR 集群。在創建 EMR 集群的時候需要在軟體配置界面選擇 Sqoop,Hive 組件。
Sqoop 等相關軟體安裝在路徑 EMR 雲伺服器的/usr/local/service/路徑下。
- [root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive
- [hadoop@172 hive]$ hive
- hive> create database hive_from_sqoop;
- OK
- Time taken: 0.167 seconds
- [hadoop@172 hive]# cd /usr/local/service/sqoop
- [hadoop@172 sqoop]$ bin/sqoop-import --connect jdbc:mysql://$mysqlIP/test --username root -P --table sqoop_test_back --hive-database hive_from_sqoop --hive-import --hive-table hive_from_sqoop
$mysqlIP:騰訊雲關系型資料庫(CDB)的內網地址。
test:MySQL 資料庫名稱。
--table:要導出的 MySQL 表名。
--hive-database:Hive 資料庫名。
--hive-table:導入的 Hive 表名。
- hive> select * from hive_from_sqoop;OK1 first 2018-07-03 16:07:46.0 spark2 second 2018-07-03 15:30:57.0 mr3 third 2018-07-03 15:31:07.0 yarn4 forth 2018-07-03 15:39:38.0 hbase5 fifth 2018-07-03 16:02:29.0 hive6 sixth 2018-07-03 16:09:58.0 sqoopTime taken: 1.245 seconds, Fetched: 6 row(s)
- [root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive
- #!/bin/bashMAXROW=1000000 #指定生成數據行數for((i = 0; i < $MAXROW; i++))doecho $RANDOM, "$RANDOM"done
- [hadoop@172 hive]$ ./gen_data.sh > hive_test.data
- [hadoop@172 hive]$ hdfs dfs -put ./hive_test.data /$hdfspath
- [hadoop@172 hive]$ bin/hivehive> create database hive_to_sqoop; #創建資料庫 hive_to_sqoopOK
- Time taken: 0.176 secondshive> use hive_to_sqoop; #切換資料庫OK
- Time taken: 0.176 secondshive> create table hive_test (a int, b string)hive> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';#創建數據表 hive_test, 並指定列分割符為』,』
- OK
- Time taken: 0.204 secondshive> load data inpath "/$hdfspath/hive_test.data" into table hive_test; #導入數據
- [hadoop@172 hive]$ mysql -h $mysqlIP –p
- Enter password:
- mysql> create table table_from_hive (a int,b varchar(255));
- [hadoop@172 hive]$ cd ../sqoop/bin
- [hadoop@172 bin]$ ./sqoop-export --connect jdbc:mysql://$mysqlIP/test --username root -P
- --table table_from_hive --export-dir /usr/hive/warehouse/hive_to_sqoop.db/hive_test
- [hadoop@172 hive]$ cd ../sqoop/bin
- [hadoop@172 bin]$ ./sqoop-export --connect jdbc:mysql://$mysqlIP/test --username root -P
- --table table_from_hive --hcatalog-database hive_to_sqoop --hcatalog-table hive_test
- [hadoop@172 hive]$ mysql -h $mysqlIP –p #連接 MySQLEnter password:mysql> use test;
- Database changed
- mysql> select count(*) from table_from_hive; #現在表中有1000000條數據+----------+| count(*) |+----------+| 1000000 |+----------+1 row in set (0.03 sec)
- mysql> select * from table_from_hive limit 10; #查看錶中前10條記錄+-------+----------+| a | b |
- +-------+----------+
- | 28523 | "3394" || 31065 | "24583" |
- | 399 | "23629" || 18779 | "8377" |
- | 25376 | "30798" || 20234 | "22048" |
- | 30744 | "32753" || 21423 | "6117" |
- | 26867 | "16787" || 18526 | "5856" |
- +-------+----------+
- 10 rows in set (0.00 sec)
- [hadoop@172 bin]$ ./sqoop-export --help
我的收藏
本頁目錄:
本文介紹了使用騰訊雲 Sqoop 服務將數據在 Mysql 和 Hive 之間相互導入導出的方法。
1. 開發准備
2. 將關系型資料庫導入到 Hive 中
本節將繼續使用上一節的用例。
進入 EMR 控制台,復制目標集群的實例 ID,即集群的名字。再進入關系型資料庫控制台,使用 Ctrl+F 進行搜索,找到集群對應的 MySQL 資料庫,查看該資料庫的內網地址 $mysqlIP。
登錄 EMR 集群中的任意機器,最好是登錄到 Master 節點。登錄 EMR 的方式請參考登錄 linux 實例。這里我們可以選擇使用 WebShell 登錄。單擊對應雲伺服器右側的登錄,進入登錄界面,用戶名默認為 root,密碼為創建 EMR 時用戶自己輸入的密碼。輸入正確後,即可進入命令行界面。
在 EMR 命令行先使用以下指令切換到 Hadoop 用戶,並進入 Hive 文件夾:
新建一個 Hive 資料庫:
使用 sqoop-import 命令把上一節中創建的 MySQL 資料庫導入到 Hive 中:
執行指令需要輸入您的 MySQL 密碼,默認為您創建 EMR 集群時設置的密碼。執行成功後,可以在 Hive 中查看導入的資料庫:
3. 將 Hive 導入到關系型資料庫中
Sqoop 支持將 Hive 表中的數據導入到關系型資料庫中。先在 Hive 中創建新表並導入數據。
登錄 EMR 集群中的任意機器,最好是登錄到 Master 節點。在 EMR 命令行先使用以下指令切換到 Hadoop 用戶,並進入 Hive 文件夾:
新建一個 bash 腳本文件 gen_data.sh,在其中添加以下代碼:
並按如下方式執行:
這個腳本文件會生成1,000,000個隨機數對,並且保存到文件 hive_test.data 中。
使用如下指令把生成的測試數據先上傳到 HDFS 中:
其中 $hdfspath 為 HDFS 上的您存放文件的路徑。
連接 Hive 並創建測試表:
$hdfspath 為 HDFS 上的您存放文件的路徑。
成功後可使用quit命令退出 Hive 數據倉庫。連接關系型資料庫並創建對應的表格:
其中 $mysqlIP 為該資料庫的內網地址,密碼為您創建集群時設置的密碼。
在 MySQL 中創建一個名為 test 的表格,MySQL 中的表欄位名字和 Hive 中的表欄位名字必須完全一致:
成功創建表格後即可退出 MySQL。
使用 Sqoop 把 Hive 數據倉庫中的數據導入到關系型資料庫中有兩種方法,可以直接使用 HDFS 存儲的 Hive 數據,也可以使用 Hcatalog 來進行數據的導入。
使用 HDFS 中的 Hive 數據
切換進入 Sqoop 文件夾,然後使用以下指令把 Hive 資料庫中的數據導出到關系型資料庫中:
其中 $mysqlIP 為您的關系型資料庫的內網 IP 地址,test 為關系型資料庫中的資料庫名,--table 後跟的參數為您的關系型資料庫的表名,--export-dir 後跟的參數為 Hive 表中的數據在 HDFS 中存儲的位置。
使用 Hcatalog 進行導入
切換進入 Sqoop 文件夾,然後使用以下指令把 Hive 資料庫中的數據導出到關系型資料庫中:
其中 $mysqlIP 為您的關系型資料庫的內網 IP 地址,test 為關系型資料庫中的資料庫名,--table 後跟的參數為您的關系型資料庫的表名,--hcatalog-database 後面跟的參數是要導出的 Hive 表所在的資料庫的名稱,--hcatalog-table 後面跟的參數是要 Hive 中要導出的表的名稱。
操作完成後可以進入關系型資料庫查看是否導入成功:
更多關於 sqoop-export 命令的參數可以通過如下命令查看:
4. 將 orc 格式的 Hive 表格導入到關系型資料庫中
❷ hdfs://localhost:8020 是什麼地址
是的 1、列出mysql資料庫中的所有資料庫 sqoop list-databases --connect jdbc:mysql://localhost:3306/ -username dyh -password 000000 2、連接mysql並列出資料庫中的表 sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username dyh --password 000000 3、將關系型數據的表結構復制到hive中 sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table users --username dyh --password 000000 --hive-table users --fields-terminated-by "\0001" --lines-terminated-by "\n"; 參數說明: --fields-terminated-by "\0001" 是設置每列之間的分隔符,"\0001"是ASCII碼中的1,它也是hive的默認行內分隔符, 而sqoop的默認行內分隔符為"," --lines-terminated-by "\n" 設置的是每行之間的分隔符,此處為換行符,也是默認的分隔符; 注意:只是復製表的結構,表中的內容沒有復制 4、將數據從關系資料庫導入文件到hive表中 sqoop import --connect jdbc:mysql://localhost:3306/test --username dyh --password 000000 --table users --hive-import --hive-table users -m 2 --fields-terminated-by "\0001"; 參數說明: -m 2 表示由兩基豎拍個map作業執行; --fields-terminated-by "\0001" 需同創建hive表時保持一致; 5、將hive中的表數據導入到mysql資料庫表中 sqoop export --connect jdbc:mysql://192.168.20.118:3306/test --username dyh --password 000000 --table users --export-dir /user/hive/warehouse/users/part-m-00000 --input-fields-terminated-by '\0001' 注意: 1、在進行導入之前,mysql中的表userst必須已經提起創建好了。 2、jdbc:mysql://192.168.20.118:3306/test中的IP地址改成localhost會報異常,具體見本人上一篇帖纖滑子 6、將數據從關系數搏羨據庫導入文件到hive表中,--query 語句使用 sqoop import --append --connect jdbc:mysql://192.168.20.118:3306/test --username dyh --password 000000 --query "select id,age,name from userinfos where \$CONDITIONS" -m 1 --target-dir /user/hive/warehouse/userinfos2 --fields-terminated-by ","; 7、將數據從關系資料庫導入文件到hive表中,--columns --where 語句使用 sqoop import --append --connect jdbc:mysql://192.168.20.118:3306/test --username dyh --password 000000 --table userinfos --columns "id,age,name" --where "id > 3 and (age = 88 or age = 80)" -m 1 --target-dir /user/hive/warehouse/userinfos2 --fields-terminated-by ","; 注意:--target-dir /user/hive/warehouse/userinfos2 可以用 --hive-import --hive-table userinfos2 進行替換
❸ 大數據常用同步工具
一、離線數據同步
DataX
阿里的Datax是比較優秀的產品,基於python,提供各種數據村塾的讀寫插件,多線程執行,使用起來也很簡單數鋒皮,操作簡單通常只需要兩步;
創建作業的配置文件(json格式配置reader,writer);
啟動執行配置作業。
非常適合離線數據,增量數據可以使用一些編碼的方式實現,
缺點:僅僅針對insert數據比較有效,update數據就不適合。缺乏對增量更新的內置支持,因為DataX的靈活架構,可以通過shell腳本等方式方便實現增量同步。
參考資料:
github地址:https://github.com/alibaba/DataX
dataX3.0介紹:https://www.jianshu.com/p/65c440f9bce1
datax初體驗:https://www.imooc.com/article/15640
文檔:https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md
Sqoop
Sqoop(發音:skup)是一款開源的工具,主要用於在Hadoop(Hive)與傳統的資料庫(mysql、postgresql…)間進行數據的傳遞,可以將一個關系型資料庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關系型資料庫中。
地址:http://sqoop.apache.org/
Sqoop導入:導入工具從RDBMS到HDFS導入單個表。表中的基蠢每一行被視為HDFS的記錄。所有記錄被存儲在文本文件的文本數據或者在Avro和序列文件的二進制數據。
Sqoop導出:導出工具從HDFS導出一組文件到一個RDBMS。作為輸入到Sqoop文件包含記錄,這被稱為在表中的行。那些被讀取並解析成一組記錄和分隔使用用戶指定的分隔符。
Sqoop支持全量數據導入和增量數據導入(增量數據導入分兩種,一是基於遞增列的增量數據導入(Append方式)。二是基於時間列的增量數據導入(LastModified方式)),同時可以指定數據是否以並發形式導入。
Kettle
Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,數據抽取高效穩定。
Kettle的Spoon有豐富的Steps可以組裝開發出滿足多種復雜應用場景的數據集成作業,方便實現全量、增量數據同步。缺點是通過定時運行,實時性相對較差。
NiFi
Apache NiFi 是一個易於使用、功能強大而且可靠的數據拉取、數據處理和分發系統,用於自動化管理系統間的數據流。它支持高度可配置的指示圖的數據路由、轉換和系統中介邏輯,支持從多種數據源動態拉取數據。
NiFi基於Web方式工作,後台在伺服器上進行調度。 用戶可以為數據處理定義為一個流程,然後進行處理,後台具有數據處理引擎、任務調度等組件。
幾個核心概念:
Nifi 的設計理念接近於基於流的編程 Flow Based Programming。
FlowFile:表示通過系統移動的每個對象,包含數據流的基本屬性
FlowFile Processor(處理器):負責實際對數據流執行工作
Connection(連接線):負責不同處理器之間的連接,是數據的有界緩沖區
Flow Controller(流量控制器):管理進程使用的線程及其分配
Process Group(過程組):進程組是一組特定的進程及其連接,允許組合其他組件創建新組件
參考資料
Nifi簡介及核心概念整理
官方網站:http://nifi.apache.org/index.html
二、實時數據同步
實時同步最靈活的還是用薯差kafka做中間轉發,當數據發生變化時,記錄變化到kafka,需要同步數據的程序訂閱消息即可,需要研發編碼支持。這里說個mysql資料庫的同步組件,阿里的canal和otter
canal
https://github.com/alibaba/canal
數據抽取簡單的來說,就是將一個表的數據提取到另一個表中。有很多的ETL工具可以幫助我們來進行數據的抽取和轉換,ETL工具能進行一次性或者定時作業抽取數據,不過canal作為阿里巴巴提供的開源的數據抽取項目,能夠做到實時抽取,原理就是偽裝成mysql從節點,讀取mysql的binlog,生成消息,客戶端訂閱這些數據變更消息,處理並存儲。下面我們來一起搭建一下canal服務
早期,阿里巴巴B2B公司因為存在杭州和美國雙機房部署,存在跨機房同步的業務需求。不過早期的資料庫同步業務,主要是基於trigger的方式獲取增量變更,不過從2010年開始,阿里系公司開始逐步的嘗試基於資料庫的日誌解析,獲取增量變更進行同步,由此衍生出了增量訂閱&消費的業務,從此開啟了一段新紀元。
ps. 目前內部版本已經支持mysql和oracle部分版本的日誌解析,當前的canal開源版本支持5.7及以下的版本(阿里內部mysql 5.7.13, 5.6.10, mysql 5.5.18和5.1.40/48)
基於日誌增量訂閱&消費支持的業務:
資料庫鏡像
資料庫實時備份
多級索引 (賣家和買家各自分庫索引)
search build
業務cache刷新
價格變化等重要業務消息
otter
https://github.com/alibaba/otter
otter是在canal基礎上又重新實現了可配置的消費者,使用otter的話,剛才說過的消費者就不需要寫了,而otter提供了一個web界面,可以自定義同步任務及map表。非常適合mysql庫之間的同步。
另外:otter已在阿里雲推出商業化版本 數據傳輸服務DTS, 開通即用,免去部署維護的昂貴使用成本。DTS針對阿里雲RDS、DRDS等產品進行了適配,解決了Binlog日誌回收,主備切換、VPC網路切換等場景下的同步高可用問題。同時,針對RDS進行了針對性的性能優化。出於穩定性、性能及成本的考慮,強烈推薦阿里雲用戶使用DTS產品。
❹ sqoop啟動job報錯,怎麼解決
sqoop使用hsql來存儲job信碼談息,開啟metastor service將job信息共享,所有node上的sqoop都可以運行同一個job
一、sqoop的配置文件在sqoop.site.xml中:
1、sqoop.metastore.server.location
本地存儲路徑,默認在tmp下,改為其他路徑
2、sqoop.metastore.server.port
metastore service埠號
3、sqoop.metastore.client.autoconnect.url
sqoop自動連接的metastore地址,默認是本地的metastore地址
4、sqoop.metastore.client.enable.autoconnect
開啟自動連接。sqoop默認連接本地metastore。注釋這個配置會開啟自動連接。
二、開啟metastore service
sqoop下,nohup bin/sqoop metastore
三爛模櫻、創飢叢建job
sqoop支持兩種增量導入模式,
一種是 append,即通過指定一個遞增的列,比如:
--incremental append --check-column num_iid --last-value 0
varchar類型的check欄位也可以通過這種方式增量導入(ID為varchar類型的遞增數字):
--incremental append --check-column ID --last-value 8
另種是可以根據時間戳,比如:
--incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'
就是只導入created 比'2012-02-01 11:0:00'更大的數據。
bin/sqoop job --meta-connect jdbc:hsqldb:hsql://10.106.1.234:16000/sqoop --create job_zyztest13 -- import --connect jdbc:oracle:thin:@10.106.1.236:1521:orcl --username SQOOP --password sqoop --table LXC_TEST_HBASE_TO_ORACLE --columns NAME,SEX,AGE,CSRQ -m 1 --hbase-table SQOOP_IMPORT_TEST3 --column-family info --hbase-row-key NAME --split-by NAME --incremental lastmodified --check-column CSRQ --last-value '2012-02-01 11:0:00' --verbose
nohup /opt/hadoopcluster/sqoop-1.4.2.bin__hadoop-2.0.0-alpha/bin/sqoop job --exec job_zyztest13 > job_zyztest13.out 2>&1 &
此時,在10.106.1.234上創建了job_zyztest13這個job,通過bin/sqoop job --meta-connect jdbc:hsqldb:hsql://10.106.1.234:16000/sqoop --list可以查看所有job
四、定時執行
使用linux定時器:crontab -e
編輯定時器,添加*/4 * * * * /opt/hadoopcluster/sqoop-1.4.2.bin__hadoop-2.0.0-alpha/bin/sqoop job --meta-connect jdbc:hsqldb:hsql://10.106.1.234:16000/sqoop --exec job_zyztest13 > job_zyztest13.out 2>&1 & 任務將會每四分鍾執行一次
❺ 在哪個路徑下執行sqoop命令
作用: 列出在指定的時間和日期在計算機上運行的已計劃命令或計劃命令和程序。首先要保證「計劃」服務已啟動才能使用 at 命令。 格式: at [IP] [[ID] [/delete] /delete [/yes]] at [computername] time [/interactive] [/every:date[,...] /next:date[,...]] command 使用說明: (1)如果在沒有參數的情況下使用,則 at 列出已計劃的命令。 (2)IP:指定遠程計算機,在此輸入遠程計劃機的IP地址。如果省略該參數,命令將安排在本地計算機。 (3)ID:指定指派給已計劃命令的識別碼。 (4)/delete:取消已計劃的命令。如果省略了ID,計算機中已計劃的命令將被全部取消。 /yes:當刪除已計劃的事件時,對系統的查詢強制進行肯定的回答。 (5)/time:指定運行命令的時間。將時間以 24 小時標記(00:00 [午夜] 到 23:59)的方式表示為小時:分鍾。 (6)/interactive:允許作業與在作業運行時登錄用戶的桌面進行交互。 (7)/every:date[,...]:在每個星期或月的指定日期(例如,每個星期四,或每月的第三天)運行命令。將 date 指定為星期的一天或多天 (M,T,W,Th,F,S,Su),或月的一天或多天(使用 1 到 31 的數字)。用逗號分隔多個日期項。如果省略了 date,將假定為該月的當前日期。 (8)/next:date[,...]:在重復出現下一天(例如,下個星期四)時,運行指定命令將 date 指定為星期的一天或多天 (M,T,W,Th,F,S,Su),或月的一天或多天(使用 1 到 31 的數字)。用逗號分隔多個日期項。如果省略了 date,將假定為該月的當前日期。 (喊跡行9)command:指定要運行的 Windows 2000 命令、程序(.exe 或鄭嘩 .com 文件)或批處理程序(.bat 或 .cmd 文件)。當命令需要路徑作為參數時,請使用絕對路徑,也就是從驅動器號開始的整個路徑。如果命令在遠程計算機上,請指定伺服器和共享名的 UNC 符號,而不是遠程驅動器號。如果命令不是可執行 (.exe) 文件,必須在命令前加上 cmd /c,例如: cmd /c dir > c: est.out 實例: (1)列出州耐本機已有的計劃命令。 C:>at 由於本機沒有計劃命令,所在顯示為「清單是空的」。 (2)查看IP地址為192.168.1.13的計算機計劃服務列表。 C:>at 192.168.1.13 運行後可以看到在IP地址為192.168.1.13計算機中有一項計劃服務,這項計劃服務要執行的日期、時間以及程序。 (3)取消IP地址為192.168.1.13的計算機計劃服務。 (4)指定d:muma.exe程序在IP為192.168.1.13的遠程計算機上,於20:50運行。