CentOS7下hadoop開發 - hdfs文件導入與導出

文件準備

centOS下安裝wget命令html

yum -y install wget

wget http://labfile.oss.aliyuncs.com/courses/832/weblog_entries.txt

hdfs和本地文件相互複製(hadoop shell命令)

一、 在 HDFS 中建立一個新文件夾,用於保存 weblog_entries.txt 文件:node

hadoop fs -mkdir -p /data/weblogsmysql

二、 將 weblog_entries.txt 文件從本地文件系統複製到 HDFS 剛建立的新文件夾下:web

hadoop fs -copyFromLocal weblog_entries.txt /data/weblogssql

三、 列出 HDFS 上 weblog_entries.txt 文件的信息:shell

hadoop fs -ls /data/weblogs/weblog_entries.txt數據庫

注意: copyFromLocalcopyToLocal只能複製文件到hdfs(hdfs複製到本地),getmerge則能夠把hdfs中文件夾下全部文件合併成一個,複製到本地環境apache

使用 distcp 實現集羣間數據複製

準備

  1. 保證複製源和複製目的地可以互相訪問服務器

  2. 關閉複製源集羣 map 任務的推測機制,能夠在配置文件 mapred-site.xml 中將 mapred.map.tasks.speculative.execution 的值設置爲 false 來實現,這樣就能夠避免在 map 任務失敗的時候產生任何不可知的行爲app

  3. 兩個集羣之間安裝的 Hadoop 版本必須一致

集羣間複製文件

1.將集羣A的 weblogs 文件夾複製到集羣B上:

hadoop distcp hdfs://namenodeA/data/weblogs hdfs://namenodeB/data/weblogs

2.將集羣A的 weblogs 文件夾複製到集羣B並覆蓋已存在文件:

hadoop distcp –overwrite hdfs://namenodeA/data/weblogs hdfs://namenodeB/ data/weblogs

3.同步集羣A和集羣B之間的 weblogs 文件夾:

hadoop distcp –update hdfs://namenodeA/data/weblogs hdfs://namenodeB/data/ weblogs

distcp工做原理

在原集羣,文件夾中的內容將被複製爲一個臨時的大文件。將會啓動一個只有map(map-only)的 MapReduce 做業來實現兩個集羣間的數據複製。默認狀況下,每一個 map 就將會分配到一個256 MB 的數據塊文件。舉個例子,若是 weblogs 文件夾總大小爲10 GB,默認將會啓動40個 map,每一個 map 會複製大約256 MB的數據。distcp 複製也能夠經過參數手動設置啓動的 map 數量。

hadoop distcp –m 10 hdfs://namenodeA/data/weblogs hdfs://namenodeB/data/ weblogs 在上面這個例子中,將會啓動10個 map 進行數據複製。若是weblogs文件夾的總大小是10 GB,那麼每一個 map 會複製大約1 GB的數據。 若是要在運行的 Hadoop 版本不同的兩個集羣之間進行數據複製,通常建議在複製源集羣使用 HftpFileSystem。HftpFileSystem 是一個只讀的文件系統。相應的 distcp 命令只能在目標服務器上運行:

hadoop distcp hftp://namenodeA:port/data/weblogs hdfs://namenodeB/data/ weblogs 在上面這條命令中,port的值要與配置文件hdfs-site.xml中dfs.http.address屬性的端口值一致。

Sqoop 從 MySQL 數據庫導入數據到 HDFS

準備:

安裝配置Sqoop 與Mysql 驅動

下載並安裝 Sqoop,及配置了環境變量 下載 Mysql 驅動,並 將 MySQL JDBC 驅動包複製到 $SQOOP_HOME/lib 目錄下

注意:sqoop版本是後面帶Hadoop的,否則運行時 會提示找不到Sqoop主類

列出 MySql 中全部數據庫

./sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456

把hive數據庫version表數據導入到 HDFS 中

進入SQOOP_HOME目錄

./bin/sqoop import --connect jdbc:mysql://localhost:3306/hive --username root -P --table version --target-dir /data/weblogs/import --delete-target-dir --class-name version --bindir ./bin

查看hdfs導入的數據

默認狀況下,導入的數據將按主鍵進行分割。若是導入的表並不包含主鍵,必須指定 -m或者--split-by參數決定導入的數據如何分割。在前面的例子中,使用了-m參數。-m參數決定了將會啓動多少個 mapper 來執行數據導入。由於將-m設置爲1,因此就啓動了一個 mapper 用於導入數據。每一個 mapper 將產生一個獨立的文件。

Sqoop 從 HDFS 導出數據到 MySQL

./bin/sqoop export --connect jdbc:mysql://172.18.0.104:3306/irdms_test  --username irdms --password irdms --table weblogs_from_hdfs --export-dir '/data/weblogs/weblog_entries.txt'  --input-fields-terminated-by  '\t'   --bindir ./bin/  -m 1

參考資料

http://hadoop.apache.org/docs/r2.6.1/hadoop-project-dist/hadoop-common/FileSystemShell.html#copyFromLocal

http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_large_objects

相關文章
相關標籤/搜索