目錄
引言:
環(huán)境:
前提:
實現(xiàn):
測試
結(jié)語:
問題
引言:
? ? ? ? 分布式課程要求使用IDE(IDEA、Eclipse)來編寫程序直接對Hadoop集群進行文件操作,目前關(guān)于IDEA連接Hadoop集群的教程,良莠不齊,根據(jù)多個教程完成了IDEA連接Hadoop集群?,F(xiàn)在將完整的流程陳列如下。
????????如果覺得文章組織形式不好,或者有看不懂的地方請給我留言。
環(huán)境:
? ? ? ? windows10 (IDEA 2021.1.3)
? ? ? ? VMware 16 workstation pro(安裝可以搜教程,比較容易)
? ? ? ? Linux Server(Hadoop-2.7.7集群?1 master 3 slaves)
集群搭建可以看Hadoop集群搭建(超級詳細)_阮哈哈哈哈哈的博客-CSDN博客
idea連接Hadoop集群可以看idea連接本地虛擬機Hadoop集群運行wordcount - 徐春暉 - 博客園 (cnblogs.com)
前提:
? ? ? ?1.通過虛擬機完成了完全分布式Hadoop集群的搭建,在master節(jié)點中使用start-all.sh啟動Hadoop集群,并使用jps得到下面的輸出,表示Hadoop集群搭建成功。
????????當然也可以通過Hadoop提供的web界面查看,一般來說我們在瀏覽器中輸入http://192.168.xx.101:50070訪問。(注意:有的時候我們確實能夠跳轉(zhuǎn)到該界面,但是我們還需要查看datanode是否正常運行,因為存在這樣的情況,datanode配置失敗,但是Hadoop集群也能成功啟動,但是后面的文件操作是無法正常運行的)
? ? ? ? 點擊Datanodes出現(xiàn)上面的界面表示配置好了Hadoop集群。
? ? ? ? 2.安裝好了IDEA開發(fā)工具
實現(xiàn):
? ? ? ? 在window上配置好Hadoop
? ? ? ? 1.下載hadoop-2.7.7.tar.gz文件到window。各版本Hadoop,我選擇的是2.7.7
Hadoop是跨平臺的,不用擔心Linux與windows不兼容,但是需要注意的是在hadoop-2.7.7/etc/hadoop/hadoop-env.sh中JAVA_HOME需要修改為window下jdk的路徑。? ? ? ?
? ? ? ? 2. 選擇一個空目錄將hadoop-2.7.7.tar.gz解壓
????????
? ? ? ? 3. 將hadoop-2.7.7添加到環(huán)境變量中
變量名:HADOOP_HOME
變量值:E:\xx\xx\xx\hadoop-2.7.7 (先看下面的圖再復(fù)制)
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin(先看下面的圖再復(fù)制)
? ? ? ? 4.使用命令行查看環(huán)境變量是否配置成功
hadoop version
? ? ? ? 5.安裝jdk(JDK 8 所有版本)
? ? ? ? 解壓到目錄中,添加環(huán)境變量(和Hadoop配置相似,可以上去再看一下)
變量名:JAVA_HOME
變量值:E:\ProgramSoftware\java\JAVAHOME\jdk1.8.0_162
變量值:%JAVA_HOME%\bin
變量值:%JAVA_HOME%\jre\bin
? ? ? ? 使用java -version、javac驗證(注意上面bin以及\jre\bin都要配置,不然會出現(xiàn)hadoop找不到JAVA_HOME的問題)
? ? ? ? 6. 將winutil.exe放置到hadoop-2.7.7\bin\目錄下面。(wintil.ext下載,GitHub中選一個比自己hadoop版本相同或者說高一點的版本)
? ? ? ? 7. 將winutil.exe以及hadoop-2.7.7\bin\hadoop.dll放置到C:\Windows\System32中
? ? ? ? 8. 使用idea打開一個空的目錄
? ? ? ? 9. 添加maven,點擊Add Framwork Support?
? ? ? ? 添加maven
? ? ? ? 添加成功后會出現(xiàn)main與test
? ? ? ? 10.配置maven,將Linux虛擬機中hadoop-2.7.7\etc\core-site.xml與hadoop-2.7.7\etc\hdfs-site.xml復(fù)制到resource下(可以通過log4j.properties配置控制臺日志的輸出等級,可以自己上網(wǎng)查詢其他的輸出等級策略)
log4j.rootLogger=debug,stdout,R log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=mapreduce_test.log log4j.appender.R.MaxFileSize=1MB log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n log4j.logger.com.codefutures=DEBUG
???????
? ? ? ? 11. 配置pom.xml
????????初始狀態(tài)
? ? ? ? 添加下方的內(nèi)容到pom.xml中,添加后idea會開始猛烈地加載需要的資源文件,下載完成后原先的紅色pom.xml會變成藍色(注意:hadoop的版本要和自己的版本一樣)
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <hadoop.version>2.7.7</hadoop.version> </properties> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop.version}</version> </dependency> </dependencies>
測試
? ? ? ? 通過上面的操作,idea連接Hadoop集群基本實現(xiàn)了,現(xiàn)在測試
? ? ? ? 1. 在java中創(chuàng)建一個java文件
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.log4j.BasicConfigurator;import java.io.IOException;
public class HdfsTest {? ? public static void main(String[] args) {
? ? ? ? //自動快速地使用缺省Log4j環(huán)境。
? ? ? ? BasicConfigurator.configure();
? ? ? ? try {? ? ? ? ? ? // 改成你自己的ip以及對應(yīng)的文件所在的路徑
? ? ? ? ? ? String filename = "hdfs://192.168.47.131:9000/words.txt";
? ? ? ? ? ? Configuration conf = new Configuration();
? ? ? ? ? ? FileSystem fs = null;
? ? ? ? ? ? fs = FileSystem.get(conf);
? ? ? ? ? ? if (fs.exists(new Path(filename))){? ? ? ? ? ? // 在控制臺搜索the file is exist 或者not exist 根據(jù)你的情況,該文件如果存在就會打
? ? ? ? ? ? // the file is exist 不存在就會打印 the file is not exist?
? ? ? ? ? ? ? ? System.out.println("the file is exist");
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? System.out.println("the file is not exist");
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }}
? ? ? ? 此時大概率是沒有配置jdk的,按照下圖進行配置
? ? ? ? 2. 配置成功我們運行程序,在控制臺中查看是否存在該word.txt,我的該目錄下存在所有打印了the file is exist
? ? ? ? 3. 實現(xiàn)一個詞頻統(tǒng)計程序
import java.io.IOException; import java.util.Iterator; import java.util.StringTokenizer; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.FileInputFormat; import org.apache.hadoop.mapred.FileOutputFormat; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reducer; import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapred.TextOutputFormat; import org.apache.log4j.BasicConfigurator; /** * 單詞統(tǒng)計MapReduce */ public class WordCount { /** * Mapper類 */ public static class WordCountMapper extends MapReduceBase implements Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); /** * map方法完成工作就是讀取文件 * 將文件中每個單詞作為key鍵,值設(shè)置為1, * 然后將此鍵值對設(shè)置為map的輸出,即reduce的輸入 */ @Override public void map(Object key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { /** * StringTokenizer:字符串分隔解析類型 * 之前沒有發(fā)現(xiàn)竟然有這么好用的工具類 * java.util.StringTokenizer * 1. StringTokenizer(String str) : * 構(gòu)造一個用來解析str的StringTokenizer對象。 * java默認的分隔符是“空格”、“制表符(‘\t’)”、“換行符(‘\n’)”、“回車符(‘\r’)”。 * 2. StringTokenizer(String str, String delim) : * 構(gòu)造一個用來解析str的StringTokenizer對象,并提供一個指定的分隔符。 * 3. StringTokenizer(String str, String delim, boolean returnDelims) : * 構(gòu)造一個用來解析str的StringTokenizer對象,并提供一個指定的分隔符,同時,指定是否返回分隔符。 * * 默認情況下,java默認的分隔符是“空格”、“制表符(‘\t’)”、“換行符(‘\n’)”、“回車符(‘\r’)”。 */ StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); output.collect(word, one); } } } /** * reduce的輸入即是map的輸出,將相同鍵的單詞的值進行統(tǒng)計累加 * 即可得出單詞的統(tǒng)計個數(shù),最后把單詞作為鍵,單詞的個數(shù)作為值, * 輸出到設(shè)置的輸出文件中保存 */ public static class WordCountReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); @Override public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { int sum = 0; while (values.hasNext()) { sum += values.next().get(); } result.set(sum); output.collect(key, result); } } public static void main(String[] args) throws Exception { //快速使用log4j日志功能 BasicConfigurator.configure(); //數(shù)據(jù)輸入路徑 這里的路徑需要換成自己的hadoop所在地址 String input = "hdfs://192.168.139.100:9000/test/input/word.txt"; /** * 輸出路徑設(shè)置為HDFS的根目錄下的out文件夾下 * 注意:該文件夾不應(yīng)該存在,否則出錯 */ String output = "hdfs://192.168.139.100:9000/test/output1"; JobConf conf = new JobConf(WordCount.class); //設(shè)置是誰提交 conf.setUser("master"); /** * 因為map-reduce過程需要我們自定以的map-reduce類, * 因此,我們需要將項目導(dǎo)出為jar包 * setjar中跟本地hadoop中的詞頻統(tǒng)計jar包 */ conf.setJar("E:\\ProgramSoftware\\java\\hadoop2.7.7\\hadoop-2.7.7\\share\\hadoop\\mapreduce\\hadoop-mapreduce-examples-2.7.7.jar"); //設(shè)置作業(yè)名稱 conf.setJobName("wordcount"); /** * 聲明跨平臺提交作業(yè) */ conf.set("mapreduce.app-submission.cross-platform","true"); //很重要的聲明 conf.setJarByClass(WordCount.class); //對應(yīng)單詞字符串 conf.setOutputKeyClass(Text.class); //對應(yīng)單詞的統(tǒng)計個數(shù) int類型 conf.setOutputValueClass(IntWritable.class); //設(shè)置mapper類 conf.setMapperClass(WordCountMapper.class); /** * 設(shè)置合并函數(shù),合并函數(shù)的輸出作為Reducer的輸入, * 提高性能,能有效的降低map和reduce之間數(shù)據(jù)傳輸量。 * 但是合并函數(shù)不能濫用。需要結(jié)合具體的業(yè)務(wù)。 * 由于本次應(yīng)用是統(tǒng)計單詞個數(shù),所以使用合并函數(shù)不會對結(jié)果或者說 * 業(yè)務(wù)邏輯結(jié)果產(chǎn)生影響。 * 當對于結(jié)果產(chǎn)生影響的時候,是不能使用合并函數(shù)的。 * 例如:我們統(tǒng)計單詞出現(xiàn)的平均值的業(yè)務(wù)邏輯時,就不能使用合并 * 函數(shù)。此時如果使用,會影響最終的結(jié)果。 */ conf.setCombinerClass(WordCountReducer.class); //設(shè)置reduce類 conf.setReducerClass(WordCountReducer.class); /** * 設(shè)置輸入格式,TextInputFormat是默認的輸入格式 * 這里可以不寫這句代碼。 * 它產(chǎn)生的鍵類型是LongWritable類型(代表文件中每行中開始的偏移量值) * 它的值類型是Text類型(文本類型) */ conf.setInputFormat(TextInputFormat.class); /** * 設(shè)置輸出格式,TextOutpuTFormat是默認的輸出格式 * 每條記錄寫為文本行,它的鍵和值可以是任意類型,輸出回調(diào)用toString() * 輸出字符串寫入文本中。默認鍵和值使用制表符進行分割。 */ conf.setOutputFormat(TextOutputFormat.class); //設(shè)置輸入數(shù)據(jù)文件路徑 FileInputFormat.setInputPaths(conf, new Path(input)); //設(shè)置輸出數(shù)據(jù)文件路徑(該路徑不能存在,否則異常) FileOutputFormat.setOutputPath(conf, new Path(output)); //啟動mapreduce JobClient.runJob(conf); System.exit(0); } }
? ? ? ? 最后在Linux虛擬機中的maser節(jié)點輸入
?hdfs dfs -ls /test/output/*
結(jié)語:
? ? ? ? 至此idea連接Hadoop集群配置完成,更多的操作可以通過Hadoop提供configuration類filesystem類、FSDataInputStream類和FSDataOutputStream類實現(xiàn)。
? ? ? ? 有問題的朋友可以留言,我會及時回復(fù)我所能解決的問題,一些我安裝時遇到的問題放在后面,大家可以瀏覽查看。
問題:
? ? ? ? 1. Hadoop文件放在windows環(huán)境下,按要求添加Hadoop環(huán)境變量,出現(xiàn):
JAVA_HOME is incorrectly set.Please update C:\hadoop-3.1.2\etc\hadoop\hadoop-env.cmd
第一次嘗試,Hadoop壓縮文件是從linux上傳會windows的,出現(xiàn)上面的報錯,查閱資料發(fā)現(xiàn)在hadoo-env.sh文件下JAVA_HOME確實被設(shè)置為了linux的路徑,嘗試使用notepad++修改,主要有兩種修改方式:
????????(1)set JAVA_HOME=${JAVA_HOME}
????????(2)set JAVA_HOME=xxxx\jdk1.8.0_162
修改之后還是出現(xiàn)了問題,便開始查看是不是jdk配置有問題,在命令行中輸入java -version能夠正常運行,但是輸入javac卻沒有反應(yīng),剛開始沒有重視這個問題,便再次查看是不是Hadoop配置有問題,仔細查看配置文件基于環(huán)境變量,確認無誤后。再次將矛頭指向javac,于是查看javac啟動不成功的原因,看到了jdk正確的配置方式。
自己windows配置jdk并沒有配置第二條,于是加上后,再次運行Hadoop -version便成功了。
? ? ? ? 2.按照ubantu server ip配置教程進行配置后,發(fā)現(xiàn)ping不了www.baidu.com。ip地址配置需要遵循的原則是與虛擬機的ip、網(wǎng)關(guān)、子網(wǎng)掩碼一樣。通過檢查發(fā)現(xiàn)教程中給的網(wǎng)關(guān)最后一位是1但是虛擬機中的網(wǎng)關(guān)最后一位是2,更改后正常上網(wǎng)。
? ? ? ? 3.hadoop集群五大文件配置時,發(fā)現(xiàn)大部分教程沒有修改etc/hadoop目錄下的hadoop-env.xml文件,如果就使用原來的set JAVA_HOME={JAVA_HOME} 會出現(xiàn)找不到j(luò)dk的情況,需要將其設(shè)置為自己本地的jdk路徑
? ? ? ? 4.在配置pom.xml的時候發(fā)現(xiàn)jdk.tool依賴項,會因為版本原因?qū)е聼o法正常編譯,正確的解決方式是將systempath改為本地的JAVA_HOME(雖然爆紅了,但是不要緊)
? ? ? ? 5.當完成全部后如果出現(xiàn)無法連接,大概率是本地的hdfs-site.xml和core-site.xml中使用了別名(master、s1),應(yīng)該替換成master主機的ip
core-site.xml
hdfs-site.xml文章來源:http://www.zghlxwxcb.cn/news/detail-765213.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-765213.html
到了這里,關(guān)于Win10 IDEA連接虛擬機中的Hadoop集群(進來保你成)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!