使用API操作HDFS(一)准备客户端环境
安装所需的软件
链接:https://pan.baidu.com/s/1yTr-8JQlWTD2MKy6ujaDeQ
提取码:vwuw
安装过程
-
jdk安装
本次是采取默认安装的,可以根据自己的需求进行安装。
-
Hadoop安装
Hadoop-2.9.2安装包解压到非中文路径即可
解压之后将文件 winutils.exe 、hadoop.dll 放到 bin目录下即可
-
配置环境变量
jdk与Hadoop的环境变量都要配置
-
验证环境变量
创建项目并简单测试
- maven 部分内容参考:
maven安装和配置阿里云镜像(各种详细配置)
Idea中创建maven项目(超详细)
原文中是创建web项目,完善 maven-web模板之后的内容可以忽略 - 创建工程
选择file→New→Project ↓
导入依赖包、日志配置文件
刚刚创建好的项目会自动打开 pom.xml 配置文件,在其中添加我们需要的依赖包
分别是: Hadoop的common、Hadoop的client、Hadoop的hdfs
配置属性可以通过 Maven 查找
选择对应的版本 2.9.2
添加配置
其他两个依赖包按照上述过程逐个添加即可
-
配置的内容
<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> <!--hadoop commom --> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.9.2</version> </dependency> <!--hadoop client--> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.9.2</version> </dependency> <!--hadoop hdfs--> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.9.2</version> </dependency> </dependencies>
-
import,自动下载并导入对应的依赖包
因为是新文件,需要联网下载,快慢取决于你的网络。
导入的时候添加日志的配置文件
-
配置日志
为了便于控制程序运行打印的日志数量,需要在项目的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
使用API创建新的目录
// 使用api操作hdfs的测试
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class HdfsClient {
@Test
// 使用api创建新的目录 API_test
public void testMkdirs() throws URISyntaxException, IOException, InterruptedException {
//获取 configuration 对象
Configuration configuration = new Configuration(); // configuration 对应的是 org.apache.hadoop.conf.Configuration
// 获取 filesystem 对象
FileSystem fs = FileSystem.get(new URI("hdfs://linux121:9000"),configuration,"root"); // 对应的是 org.apache.hadoop.fs.FileSystem
//创建新的目录
fs.mkdirs(new Path("/API_test"));
//关闭流
fs.close();
}
}
-
查看结果
通过 web 也可以查看,查看方式: Browsing HDFS
Hadoop集群配置说明:https://blog.csdn.net/qq_39245001/article/details/119281613
出现的问题
Did not find winutils.exe
- 问题原因: Hadoop安装缺少Windows操作系统相关文件导致的
-
解决方案:
下载软件安装包中的 winutils.exe,拷贝到 Hadoop安装目录的bin目录下即可
HDFS文件权限问题
-
HDFS的文件权限机制与linux权限机制类似
rwx 分别代表 rad、write、execute,权限 x 对于文件表示忽略,对于文件夹表示是否有权限访问其内容。如果linux系统用户“zhangsan”使用Hadoop命令创建一个文件,那么这个文件在HDFS中的 owner 就是“zhangsan”
HDFS文件权限的目的是:防止好人做错事,而不是阻止坏人做坏事。HDFS相信 告诉你我你是谁,你就是谁
-
解决方案
-
指定用户信息获取 FileSystem ,上面的案例就是用的这种方式,直接指定用户
-
关闭HDFS集群权限校验
vim hdfs-site.xml #添加如下属性 <property> <name>dfs.permissions</name> <value>true</value> </property>
修改完成之后要分发给其他节点,同时要重启HDFS集群
-
彻底放弃HDFS的权限校验,采用其他的安全框架,如:kerberos、sentry等来管理大数据集群安全。此时可以直接修改HDFS根目录为 777
hadoop fs -chmod -R 777 /
-