参考资料运行环境一、准备 HDFS Java API 环境
1.1 在windows系统中准备Hadoop环境1.2 使本机连接集群节点
1.2.1 域名映射1.2.2 路由转发 1.3 使用 IDEA 创建 Maven 项目 二、HDFS Java API *** 作案例
2.1 创建文件夹2.2 上传文件2.3 下载文件2.4 删除文件2.5 文件的更名和移动2.6 获取HDFS文件信息2.7 文件与文件夹的判断2.8 HDFS - API 配置参数优先级问题
2.8.1 通过配置文件2.8.2 通过Configuration对象2.8.3 优先级问题
参考资料视频资料
运行环境Windows10JDK8IDEA 2021.6 专业版Hadoop3.1.3CentOS73个Hadoop完全分布式集群节点 一、准备 HDFS Java API 环境
1.1 在windows系统中准备Hadoop环境
Hadoop3.1.3 官方下载地址:点击下载,下载后解压。
hadoop主要基于linux编写,这个winutil.exe主要用于模拟Linux系统下的目录环境。因此hadoop放在windows下运行的时候,需要这个辅助程序才能运行
这些环境软件下载到hadoop目录的bin文件夹:点击下载
之后在配置Hadoop的环境变量,跟Linux环境里一样,先配置HADOOP_HOME,再配置系统变量PATH
图形化 *** 作可以右键此电脑,点击属性,然后点击高级系统设置,环境变量
配置好后,在cmd里查看版本
hadoop version
配置完毕.
在本机配置域名映射,这样就可以直接通过主机名连接到对应的ID
windows10配置域名映射,位置在:
C:WINDOWSSystem32driversetc
hosts的配置内容:
如图:以 IP + 空格 + 主机名 的形式进行配置
IP的话如果是本机的虚拟机则可以在虚拟机里通过命令查看
ifconfig
显示的信息中,选择eth开头的信息,比如在Vmware里是eth33,而在docker容器里就是eth0
由于笔者是在虚拟机里使用docker容器搭建的三个节点,那么则有:
虚拟机能和自身里的docker容器相连本机能和虚拟机相连
若要本机直接和虚拟机里的docker容器相连,就要进行域名转发,可参考这篇博文:Docker | 使用宿主机ping通虚拟机里的docker容器 | 路由转发
配置完成后,可以直接在主机ping通集群节点,这样就可以在之后的本机程序里连接集群的HDFS了。
1.3 使用 IDEA 创建 Maven 项目项目结构:
pom.xml 配置 Maven项目的依赖
4.0.0 com.uni HDFSLearn1.0-SNAPSHOT 8 8 org.apache.hadoop hadoop-client3.1.3 junit junit4.12 org.slf4j slf4j-log4j121.7.30
log4j.properties 配置 log4j日志文件的输出信息
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
至此,IDEA项目搭建完毕。
二、HDFS Java API *** 作案例2.1 创建文件夹
org.apache.hadoop.fs.FileSystem 源码中的相关方法:
public static boolean mkdirs(FileSystem fs, Path dir, FsPermission permission) public abstract boolean mkdirs(Path f, FsPermission permission) throws IOException public boolean mkdirs(Path f) throws IOException
参数说明:
测试代码:
public class HdfsClient { private static Configuration configuration; private static String HDFS_PATH = "hdfs://hadoop101:8020"; // HDFS 连接地址 private static String HDFS_USER = "root"; // HDFS 连接对象 private static FileSystem fs; // HDFS 文件 *** 作对象 static { configuration = new Configuration(); } public FileSystem getFileSystem(){ try{ if(fs == null) fs = FileSystem.get(new URI(HDFS_PATH), configuration, HDFS_USER); } catch (Exception e) { e.printStackTrace(); } return fs; } @Test public void testMkdir() throws IOException{ FileSystem fs = getFileSystem(); fs.mkdirs(new Path("/uni/testMkdir/")); fs.close(); } }2.2 上传文件
org.apache.hadoop.fs.FileSystem 源码中的相关方法:
public void copyFromLocalFile(Path src, Path dst) public void moveFromLocalFile(Path[] srcs, Path dst) public void copyFromLocalFile(boolean delSrc, Path src, Path dst) public void copyFromLocalFile(boolean delSrc, boolean overwrite,Path[] srcs, Path dst) public void copyFromLocalFile(boolean delSrc, boolean overwrite,Path src, Path dst)
参数说明:
测试代码:
@Test public void testCopyFromLocalFile() throws IOException{ FileSystem fs = getFileSystem(); Path localFile = new Path("test.txt"); Path distPath = new Path("/uni/testMkdir"); fs.copyFromLocalFile(localFile, distPath); fs.close(); }2.3 下载文件
org.apache.hadoop.fs.FileSystem 源码中的相关方法:
public void copyToLocalFile(boolean delSrc, Path src, Path dst) public void copyToLocalFile(boolean delSrc, Path src, Path dst,boolean useRawLocalFileSystem) throws IOException public void copyToLocalFile(Path src, Path dst) throws IOException
参数说明:
org.apache.hadoop.fs.FileSystem 源码中的相关方法:
public boolean delete(Path f) throws IOException public abstract boolean delete(Path f, boolean recursive) throws IOException public boolean deleteOnExit(Path f) throws IOException public void deleteSnapshot(Path path, String snapshotName)
参数说明:
测试代码:
@Test public void testDelete(){ FileSystem fs = getFileSystem(); try{ fs.delete(new Path("/uni/testMkdir/test.txt"),true); fs.close(); } catch (IOException e) { e.printStackTrace(); } }2.5 文件的更名和移动
org.apache.hadoop.fs.FileSystem 源码中的相关方法:
public abstract boolean rename(Path src, Path dst) throws IOException
测试方法:
@Test public void testMove(){ FileSystem fs = getFileSystem(); try{ fs.rename(new Path("/uni/testMkdir"),new Path("/uni/MyDir")); fs.close(); } catch (IOException e) { e.printStackTrace(); } fs.close(); }2.6 获取HDFS文件信息
org.apache.hadoop.fs.FileSystem 源码中的相关方法:
public RemoteIteratorlistFiles(final Path f, final boolean recursive)
测试方法:
获取HDFS文件信息
@Test public void testDetail() throws IOException { FileSystem fs = getFileSystem(); // 获取所有文件信息 RemoteIteratorlistFiles = fs.listFiles(new Path("/"), true); while (listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); System.out.println("===========" + fileStatus.getPath() +"========="); System.out.println(fileStatus.getPermission()); System.out.println(fileStatus.getOwner()); System.out.println(fileStatus.getGroup()); System.out.println(fileStatus.getLen()); System.out.println(fileStatus.getModificationTime()); System.out.println(fileStatus.getReplication()); System.out.println(fileStatus.getBlockSize()); System.out.println(fileStatus.getPath().getName()); } fs.close(); }
获取HDFS文件的块信息:
@Test public void testDetail() throws IOException { FileSystem fs = getFileSystem(); // 获取所有文件信息 RemoteIterator2.7 文件与文件夹的判断listFiles = fs.listFiles(new Path("/"), true); while (listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); BlockLocation[] blockLocations = fileStatus.getBlockLocations(); System.out.println(Arrays.toString(blockLocations)); } fs.close(); }
@Test public void testFile() throws IOException { FileSystem fs = getFileSystem(); FileStatus[] listStatus = fs.listStatus(new Path("/")); for (FileStatus status : listStatus) { if(status.isFile()) System.out.println("文件:" + status.getPath().getName()); else System.out.println("目录:" + status.getPath().getName()); } fs.close(); }2.8 HDFS - API 配置参数优先级问题 2.8.1 通过配置文件
hdfs-site.xml
可以将hadoop的配置文件 hdfs-site.xml放到项目里的resources文件夹里,这样API在执行时会按照这个配置来执行。
2.8.2 通过Configuration对象除了创建文件外,还可以通过配置Configuration对象来设置参数
这个类是来自包 org.apache.hadoop.conf 的
范例: 将分区数设置成2
Configuration configuration = new Configuration(); configuration.set("dfs.replication", 2);2.8.3 优先级问题
优先级从高到低依次为:
API程序的Configuration配置 > 项目资源文件下的配置文件 > 集群中 hdfs-site.xml > 集群中hdfs-default.xml
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)