这篇博客主要来讲述如何通过代码实现客户端对HDFS的操作。
- 1. 环境配置步骤
- 2. 配置HADOOP_HOME环境变量
- 3. 配置Path环境变量
- 4. 创建一个Maven工程HdfsClientDemo
- 5. 导入相应的依赖
- 6. 创建包名
- 7. 创建HDFSClient类
- 8. 运行
- 9. 再次运行
- 10. 查看结果
- 其他问题
1. 环境配置步骤
根据自己的电脑操作系统选择对应的hadoop jar包到非中文路径下,这里我用的是windows10系统,下面的连接也是在windows10的hadoop jar包,提供给大家下载。
名称 | 链接 | 提取码 |
---|---|---|
windows-hadoop-2.7.2.zip | 链接:https://pan.baidu.com/s/1MwDfuBO_P5L3ZEcPGldLUg | 提取码:uwmz |
2. 配置HADOOP_HOME环境变量
如下图所示:
3. 配置Path环境变量
如下图所示:
4. 创建一个Maven工程HdfsClientDemo
这里使用Eclipse创建Maven工程,具体如下图所示:
5. 导入相应的依赖
打开工程的pom.xml
文件,添加如下依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
</dependencies>
接下来,Eclipse就会下载这些依赖,可以看到右下角有进度条显示,自己可以点击查看下载的进度。如下图所示:
等待下载完毕进行下面的操作。
5.1. 问题1
另外如果发现pom.xml
文件中会有报错,那么就按照下面的操作来对Maven工程进行强制的更新。
- 首先选中工程,右键选择Maven,然后选择Update Project,如下图所示:
- 在弹出的对话框,勾选Force Update of Snapshots/Release,如下图所示:
- 接下来就是下载更新maven工程了。
5.2. 问题2
如果发现是Missing artifact jdk.tools:jdk.tools:jar:1.8
错误,那么把下面的依赖添加到pom.xml
中:
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
然后重新运行一下Maven工程既可看到error消失。
6. 创建包名
在src/main/java/
下创建com.zohar.hdfs
包名。
7. 创建HDFSClient类
在HDFSClient类中输入如下代码(也就是就是在HDFS中创建一个文件夹的代码):
public class HDFSClient {
public static void main(String[] args) throws IllegalArgumentException, IOException {
// 1. 获取hdfs客户端对象
Configuration conf = new Configuration();
// 通过configuration访问HADOOP集群,也就是访问的是namenode节点。
conf.set("fs.defaultFS", "hdfs://hadoop102:9000");
FileSystem fs = FileSystem.get(conf);
// 2. 在hdfs创建路径
fs.mkdirs(new Path("/zzh/haha"));
//3. 关闭资源
fs.close();
}
}
8. 运行
点击运行之后,会弹出log4j相关的一些问题,具体如下所示:
og4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
解决办法:
需要在项目的src/main/resources
目录下,新建一个文件,命名为log4j.properties
,并在文件中输入如下内容:
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
接下来再运行一下,就可以发现上面的那个问题也就没有了。
9. 再次运行
再次运行发现还是错误,错误信息如下所示:
解决办法:
-
首先查看一下主机与虚拟机是否ping通,如果ping不通需要保障主机与虚拟机相通,具体设置请参考我的博客文章。
-
确保虚拟机上面的Hadoop相关组件都已经设置好了并且已经打开了(这里我是没有打开Hadoop才会报上面的错误,具体打开Hadoop请参考我的博客文章集群启动关闭总结)。
再次运行可以发现没有error了。
10. 查看结果
打开浏览器输入:http://hadoop102:50070/
,可以发现创建了代码设置的目录。
其他问题
在编译运行时,如果控制台提示用户权限错误,那么还需要进行下面的操作设置用户相关信息,当然也可以在代码中来实现。
第一种:首先先来看看如何在Eclipse中设置用户相关信息。
参考下面的图片打开项目配置界面:
在配置界面输入-DHADOOP_USER_NAME=zohar
,zohar为用户名。
第二种:直接在代码中指定,具体的代码如下:
public class HDFSClient {
public static void main(String[] args) throws IllegalArgumentException, IOException, InterruptedException, URISyntaxException {
// 1. 获取hdfs客户端对象
Configuration conf = new Configuration();
// 通过configuration访问HADOOP集群,也就是访问的是namenode节点。
// conf.set("fs.defaultFS", "hdfs://hadoop102:9000");
// FileSystem fs = FileSystem.get(conf);
// 通过这种方法可以直接指定用户名
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"),conf, "zohar");
// 2. 在hdfs创建路径
fs.mkdirs(new Path("/zzh/haha"));
//3. 关闭资源
fs.close();
}
}
可以看到,代码中直接可以指定用户名,这样不用再在Eclipse中设置了。