Hadoop——MapReduce相关eclipse配置及Api调用(图文超详细版)(内含遇到错误的解决方法)
一、前情提要
前面兩篇文章我們已經成功搭建了Hadoop以及安裝了Hive,Sqoop和Mysql數據庫,現在我們就來利用Hadoop嘗試做一個小實戰,實現單詞統計!
還沒有搭建Hadoop成功的同學,歡迎看看我之前的文章:Hadoop集群搭建(步驟圖文超詳細版)
目錄
- 一、前情提要
- 二、前置條件
- 三、上傳文件至HDFS
- 四、壓縮Hadoop文件
- 五、配置Eclipse
- 六、HDFS調用Api
二、前置條件
| eclipse | 自備 |
| hadoop-eclipse-plugin-2.7.0.jar | 百度網盤下載 , 提取碼:f259 |
| MobaXterm | 百度網盤下載,提取碼:f64v |
本次將會用到的,HDFS命令大全:Hadoop——HDF的Shell命令,建議大家在操作時看看!!
三、上傳文件至HDFS
首先,我們需要在Windows準備一個裝有英語單詞的文本文件↓(不限詞數)
我們利用 MobaXterm 軟件將單詞文件上傳至 Centos 中與 hadoop 文件同目錄的 /software,這里大家根據自己文件存放的地方存儲就好了,不一定要和我同一個目錄↓。
上傳至HDFS系統之前我們需要先啟動 Hadoop 集群!!
啟動 Hadoop 集群命令:start-all.sh
Tips:如果發現這個命令無法在任何目錄下使用,請檢查全局文件中Hadoop路徑!!
啟動集群之后,我們 cd 到存放單詞文件的目錄下,命令↓
接著我們使用Hadoop的上傳文件命令,再用 -ls 命令查看HDFS根目錄中的文件,命令↓
注意!!如果Hadoop集群沒有正常啟動,將會報以下錯誤↓
查看上傳的wordstest.txt文件內容,命令↓
到這,英語單詞文件已經上傳HDFS成功了!
四、壓縮Hadoop文件
命令↓
tar -czvf hadoop.tar.gz hadoop/
壓縮后的hadoop文件↓
從 linux 系統上將 hadoop.tar.gz 壓縮包復制到Windows任一常用盤下↓
然后把 hadoop 壓縮包解壓縮↓
五、配置Eclipse
打開 Eclipse,在菜單欄找到 Window,點擊里面的 Preferences↓
在左側找到Hadoop/ Map/Reduce配置,然后選擇hadoop文件夾路徑↓
Tips:如果 Eclipse沒有安裝hadoop驅動插件,是不會顯示 Hadoop/ Map/Reduce 配置的!!如果發現沒有,在文章最上面找到 Eclipse-hadoop-plugin 下載,將插件放在 hadoop 目錄下的 plugins 中!
點擊 Apply 應用后,點擊 OK 回到主頁面,在 Eclipse 右上角找到下面這個按鈕點擊,在里面找到 Map/Reduce視圖 并選擇 OK ↓,回到主界面就會發現 Map/Reduce 視圖替換了之前的視圖
在主界面按順序分別點擊 Map/Reduce 和 圖標 后,填寫一下信息↓
如果忘了設置 的HDFS 端口號,在 hadoop 文件夾的 /etc/hadoop 目錄下找到 core-site.xml ,利用編輯器打開查看↓
同時!!我們查看完端口號后,還要復制 hadoop.tmp.dir 的目錄路徑↓
在 Edit Hadoop location 界面來到 Advanced parameters 頁面,找到 hadoop.tmp.dir 設置,并把剛剛復制的路徑覆蓋原本的默認路徑↓
點擊 Finish ,然后就可以在主界面左側的hdfs項目中看到HDFS上的文件結構!
Tips:如果上面項目欄沒有正常顯示,而是顯示了 fail to connect 亂七八糟的,解決方法如下↓
在 linux 的 hadoop 集群中的主節點下,修改 /etc/hosts 文件,將主節點的 ip地址改為 0.0.0.0
再重啟網絡和hadoop,總命令如下↓
然后我們再回到 eclipse 中將原來項目刪除,再重新建立一個,這時就會發現,哎!竟然成功了哈哈哈!
我們來嘗試操作一下!在 linux 的主節點中我們試著用命令在 HDFS 中創建一個文件夾↓
然后在 eclipse 中刷新下,就能看到我們創建的 test 文件夾了!
至此,我們的 ecplise 也已經配置成功了!!給點掌聲自己!!
六、HDFS調用Api
在 eclipse 創建一個 MapReduce 項目↓
在項目的 src 目錄下創建包和包下的四個 java 文件:CreateFile(創建文件) 、GetFile(獲取文件) 、PutFile(上傳文件)、FileLocation(查看文件路徑)
代碼如下↓
注意:別忘了修改代碼中你們自己的Linux主機IP地址!上傳文件名也要選對你們放文件的路徑!!
我存放文件的目錄↓(以供參考,具體根據你們所定)
PutFile.java(上傳文件)↓
Tips:如果操作會有關于目錄的,別忘了給目錄加上可修改可讀取可執行的權限,如這里就涉及到了/test目錄,命令↓
hadoop fs -chmod 777 /文件夾名如果沒有添加權限,eclipse報錯如下↓
接著我們運行程序,方法如下↓
后面運行程序也是這么個步驟
輸出結果↓
hdfs目錄刷新一下,新增的txt文件就顯示了
CreateFile.java(創建文件)↓
package com.API;import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path;public class CreateFile {public static void main(String[] args) throws Exception {FileSystem fs = FileSystem.get(new URI("hdfs://linux主機IP地址:9000"), new Configuration());//定義新文件Path dfs = new Path("/test/hdfsfile");//創建新文件,如果有則覆蓋(true)FSDataOutputStream create = fs.create(dfs, true);create.writeBytes("Hello,HDFS!");} }運行程序后左邊hdfs目錄下的test文件夾中多了一個hdfsfile文件↓
hdfsfile文件內容↓
GetFile.java(獲取文件)↓
package com.API;import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path;public class GetFile {public static void main(String[] args) throws Exception{FileSystem fs = FileSystem.get(new URI("hdfs://linux主機IP地址:9000"), new Configuration());//hdfs 上文件Path src = new Path("/test/hdfsfile");//下載到本地的文件名Path dst = new Path("D:\\test\\newfile.txt");fs.copyToLocalFile(false,src,dst,true);} }運行程序后會選擇下載到本地路徑的D盤下創建一個test文件夾,并存放我們索要獲取文件的副本↓
FileLocation.java(查看文件路徑)↓
package com.API;import java.net.URI; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path;public class FileLocation {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubFileSystem fs = FileSystem.get(new URI("hdfs://linux主機IP地址:9000"), new Configuration());Path fpath = new Path("/test/test.txt");FileStatus filestatus = fs.getFileStatus(fpath);/*獲取文件在HDFS集群位置:* FileSystem.getFileBlockLocations(FileStatus file,long start,longlen);*可查找指定文件在HDFS集群上的位置,其中file為文件的完整路徑,start和len來表識查找的文件路徑*/BlockLocation[] blkLocations = fs.getFileBlockLocations(filestatus, 0, filestatus.getLen());filestatus.getAccessTime();for (int i = 0; i < blkLocations.length; i++) {String[] hosts = blkLocations[i].getHosts();System.out.println("block_" + i + "_location:" + hosts[0]);}//格式化日期輸出SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//獲取文件訪問時間,返回 longlong accessTime = filestatus.getAccessTime();System.out.println("access:" + formatter.format(new Date(accessTime)));//獲取文件修改時間,返回longlong modificationTime = filestatus.getModificationTime();System.out.println("modification:" + formatter.format(new Date(modificationTime)));//獲取塊的大小,單位為Blong blockSize = filestatus.getBlockSize();System.out.println("blockSize:" + blockSize);//獲取文件大小,單位為Blong len = filestatus.getLen();System.out.println("length:" + len);//獲取文件所在用戶組String group = filestatus.getGroup();System.out.println("group:" + group);//獲取文件擁有者String owner = filestatus.getOwner();System.out.println("owner:" + owner);//獲取文件拷貝數short replication = filestatus.getReplication();System.out.println("replication:" + replication);} }運行程序后,輸出包括訪問時間、修改時間、文件長度、所占塊大小、文件擁有者、文件用戶組和文件復制數等信息↓
本次分享到此結束,謝謝大家閱讀!!
歡迎大家看看我下一篇MapReduce——單詞統計:Hadoop——MapReduce實現單詞統計(圖文超詳細版)
總結
以上是生活随笔為你收集整理的Hadoop——MapReduce相关eclipse配置及Api调用(图文超详细版)(内含遇到错误的解决方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 心术下
- 下一篇: Cookie、Session和Token