Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS
場景
HDFS的訪問方式之HDFS shell的常用命令:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119351218
在上面使用HDFS shell的方式去訪問HDFS。
那么怎么使用Java API的方式去操作HDFS。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。
實現
CentOS7上搭建Hadoop集群(入門級):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119335883
在Windows上的搭建流程和上面的流程前面類似。
首先下載hadoop的tar包,這里選擇版本和上面搭建的集群的版本一致。
在windows上依托于解壓工具比如7-zip將tar.gz解壓成tar再進行解壓成目錄如下
解壓之后將其挪到沒有中文路徑和空格的目錄下
下載之后如果需要編程、還需要在hadoop的bin目錄下添加對應版本的hadoop.dll和wintuils.exe
https://github.com/cdarlint/winutils
或者
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/20691010
下載之后將對應版本的hadoop.dll和winutils.exe復制到hadoop的bin目錄下
?
配置環(huán)境變量
將上面Hadoop的bin目錄和sbin目錄都添加到環(huán)境變量Path中
修改配置文件
按照上面Centos中搭建Hadoop流程中的配置文件,依次修改Windows下同目錄的配置文件
1、修改hadoop-env.cmd
修改這里的JAVA_HOME為對應目錄
這里的jdk在默認路徑下 ,Program Files有中文路徑,可以使用
set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_202進行代替
2、修改core-site.xml
<configuration><property><name>fs.defaultFS</name><value>hdfs://192.168.148.128:9000</value></property><property><name>hadoop.tmp.dir</name><value>D:\SoftWare\hadoop-2.8.0\hdfs\tmp</value></property> </configuration>將這里的集群訪問地址改為master的ip地址,將數據路徑改為在Windows上的路徑
3、修改hdfs-site.xml
<configuration><property><name>dfs.replication</name><value>2</value></property> </configuration>4、修改mapred-site.xml
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property> </configuration>5、修改yarn-site.xml
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.resourcemanager.address</name><value>192.168.148.128:18040</value></property><property><name>yarn.resourcemanager.scheduler.address</name><value>192.168.148.128:18030</value></property><property><name>yarn.resourcemanager.resource-tracker.address</name><value>192.168.148.128:18025</value></property><property><name>yarn.resourcemanager.admin.address</name><value>192.168.148.128:18141</value></property><property><name>yarn.resourcemanager.webapp.address</name><value>192.168.148.128:18088</value></property> </configuration>全部改為master的ip地址
驗證配置
在Windows中打開cmd
hadoop version?
然后輸入
hdfs dfs -ls /查看hdfs中根目錄下所有文件
?
?用Java API 操作HDFS
打開IDEA-新建一個Maven項目,pom.xml中引入依賴,這里與集群中
hadoop的版本一致。
在Maven倉庫中搜索hadoop
需要如下依賴
hadoop-client
hadoop-common
hadoop-hdfs
hadoop-hdfs-client
hadoop-mapreduce-client-core
junit
pom.xml依賴如下:
??? <dependencies><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.8.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.8.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.8.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs-client --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs-client</artifactId><version>2.8.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>2.8.0</version></dependency><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>然后新建包,包下新建類,類中新建main方法
package com.badao.hdfsdemo;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java.io.IOException;public class hellohdfs {public static void main(String[] args) throws IOException {FileSystem fileSystem = getFileSystem();//獲取文件詳情RemoteIterator<LocatedFileStatus> listFiles = fileSystem.listFiles(new Path("/"), true);while (listFiles.hasNext()){LocatedFileStatus status = listFiles.next();//輸出詳情System.out.println(status.getPath().getName());//文件名稱System.out.println(status.getLen());//長度System.out.println(status.getPermission());//權限System.out.println(status.getOwner());//所屬用戶System.out.println(status.getGroup());//分組System.out.println(status.getModificationTime());//修改時間//獲取存儲的塊信息BlockLocation[] blockLocations = status.getBlockLocations();for (BlockLocation blockLocation : blockLocations) {//獲取塊存儲的主機節(jié)點String[] hosts = blockLocation.getHosts();for (String host : hosts) {System.out.println(host);}}}fileSystem.close();}/*** 獲取HDFS文件系統(tǒng)* @return* @throws IOException*/public static FileSystem getFileSystem() throws IOException {Configuration configuration = new Configuration();configuration.set("fs.defaultFS","hdfs://192.168.148.128:9000");configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");System.setProperty("HADOOP_USER_NAME","root");FileSystem fileSystem = FileSystem.get(configuration);return fileSystem;}}注意:
其中main方法中調用了獲取HDFS文件系統(tǒng)的方法getFileSystem
1、configuration.set("fs.defaultFS","hdfs://192.168.148.128:9000");
這里的集群的訪問地址與core-site.xml中fs.defaultFS配置的一致。
2、configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
這里的目的是:
如果不加這個就會提示:
Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
?
hadoop filesystem相關的包有以下兩個:hadoop-hdfs-xxx.jar和hadoop-common-xxx.jar(xxx是版本),而他們當中都有org.apache.hadoop.fs.FileSystem這個文件
調用的接口是hadoop-hdfs-xxx.jar中的,所以很明顯No FileSystem for scheme: hdfs這個問題是因為,相同文件被覆蓋了
3、System.setProperty("HADOOP_USER_NAME","root");
如果不加這個就會提示:
org.apache.hadoop.serurity.AccessControlException:Permission denied: user? =
?
效果
然后運行main方法,獲取HDFS根目錄下所有的文件的詳情
?
總結
以上是生活随笔為你收集整理的Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDFS的访问方式之HDFS shell
- 下一篇: Windows下使用Java API操作