基于 Gradle 远程连接Hadoop HDFS编程
在一个现代化的时候,界面不好看的 Eclipse
和操作易用性相比而言更高的 IntelliJ Idea
。而在进行 Hadoop 进行编程的时候,最基本的是需要导入相应的 Jar 包,而更为便宜的则是使用 Maven 来进行包的依赖管理,而本文则结合 Gradle 来处理引入最基本的 Hadoop 包,配置运行环境。
新建一个 Gradle 项目
在新建时要选择 Gradle 项目,并在连接过程中自动下载 Gradle。
在下一步中,要输入一个类似于下图的 GroupId,ArtifactId,这其实是基于 Maven 结构的,关于这个如何比较正确填写可以参考
Guide to naming conventions on groupId, artifactId, and version
接下来相应的配置可以直接进入下一步,配置如下,如果需要自动导包功能也可以选择
在 Maven Repository 中查找相应的依赖
通过Maven Repository中搜索Apache Hadoop Common并查找当前连接对应的 Hadoop 版本,我目前使用的是2.8.5,所以就找到了对应于2.8.5的版本,并在下面的代码框中选择 Gradle,默认是 Maven 导入的代码,切换后可以看到是一行代码compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.8.5'
按照同样的方式还需要引入Apache Hadoop HDFS,查找对应的依赖代码
compile group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: '2.8.5'
将依赖代码填入
打开项目文件,在 Project 视图中找到build.gradle
文件,并在 dependencies 中填入刚刚从 Maven Repository 中找到了两个依赖,当你输入后,IDE 会自动通过网络下载对应的依赖,所以相应的烦琐的依赖及其相互依赖关系,通过 Gradle 能够很好地避免,整个过事其实是非常简单,只要实际尝试后,后面再去操作都变得十分容易。
新建文件并测试
这里我自己通过新建一个HDFSCreateFile
用来在 HDFS 文件系统创建一个名为test2的文件,文件内容则是Hello World。注意这里我修改了相应的 HDFS 文件系统地址,修改为hdfs://192.168.1.199:9000
,是因为在局域网中我创建了了一真实的分布式文件系统,分为一个 master 节点和三个 slave 节点,而对于的名称节点即 master 节点对于的地址是192.168.1.199
,当前的开发环境是在 Mac 下开发,如果你开发环境就是在对应的 master 节点,那么就可以用 localhost
或者127.0.0.1
来处理。另外则是一般的文档说在和 HDFS 操作时创建了一个特殊用户名,如 Hadoop这类的,如果你运行程序的当前用户不是这个名称,需要提前在 HDFS 中创建对应的用户目录,否则运行程序会报权限错误。
具体代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSCreateFile {
public static void main(String[] args){
try{
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.1.199:9000");
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);
byte[] buff = "Hello World".getBytes();
String fileName = "/test2";
FSDataOutputStream os =fs.create(new Path(fileName));
os.write(buff,0,buff.length);
System.out.println("Create:"+fileName);
os.close();
fs.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
总结
相对于Eclipse
,使用IntelliJ Idea
显得更为现代感,功能上觉得两者都能实现。而Eclipse
则更省资源,IntelliJ Idea
使用上更为便捷。使用Gradle
来进入依赖管理,可以省出更多时间专注于逻辑代码,解决不同包的依赖问题。