用Java拷贝文件到HDFS
1、启动Hadoop服务
1.1、实验资源说明
本实验开始时,读者会有四台Centos 7的linux主机,其中三台master ,slave1,slave2已经配置好Hadoop集群环境,只需要在主服务器(namenode)上执行hdfs namenode -format 格式化命令后即可启动Hadoop集群。
另外一台develop-pc为用来开发的PC机,上面已经安装好jdk和eclipse。
1.2、启动Hadoop服务
在主服务器(master)上,到hadoop安装
/usr/local/zhitu/hadoop-2.7.3下,格式化namenode并启动hadoop集群。
?启动完成后,可以简单的使用jps命令查看服务是否启动成功。
参考命令:
cd /usr/local/zhitu/hadoop-2.7.3
bin/hdfs namenode -format
复制
sbin/./start-all.sh
jps
1.3、使用Eclipse新建Maven项目
在分配的develop-pc上打开Eclipse开发工具(第一次打开的时候会要求选择一个工作目录,按默认目录即可)。
新建名称为hadoop 的maven项目。
参考步骤如下:
?选择Eclipse菜单栏 File菜单里的New 下的Maven Project 选项,如下图:
如果没有Maven Project选项,可选择 Other 选项后,输入Maven 查找:
点击next,在弹出的窗口中,勾选中Create a simple project 选项,如下图:
点击Next按钮,在弹出的窗口中,Group id (一般为公司组织名称)填写 :learning ,Artifact Id(项目名称) 填写:hadoop ,如下图:
点击finish 按钮。
在建好的项目hadoop上 右键,选择Build Path à Configure Build Path... ,如下图:
如果没有Build Path ,需要在hadoop右键,选择Maven à Update Project 如下图:
在弹出的窗口中左边窗口选择Java Build Path,右边选择Libraries 下的JRE System Libray选项后,点击 Edit 按钮,如下图所示:
在弹出的窗口中,选择我们安装的1.8版本的jdk(要求1.7以上的Jdk),如下图:
点击Finish按钮,然后将设置保存。
再选择左边Java Compiler选项,将右边的Compiler compliance level: 设置为1.8 ,如下图:
点击OK按钮,并在弹出的确认窗口点击Yes。
1.4、编写pom.xml文件
编辑pom.xml,添加开发项目所依赖的jar包。
pom.xml参考内容如下:
?
4.0.0
learning
hadoop
0.0.1-SNAPSHOT
2.7.3
org.apache.hadoop
hadoop-client
${hadoop.version}
maven-compiler-plugin
3.0
1.8
org.apache.maven.plugins
maven-surefire-plugin
true
保存之后, Eclipse 应该会自动开始下载依赖 jar 包,如下图,已经将依赖的jar下载:
如果没有自动下载,可以在Pom.xml文件上点击右键选择Run As àMaven install来下载依赖jar包,如下图:
2、开发读取hdfs系统里的文件的代码
2.1、开发读取hdfs系统里的文件的代码
在src目录下新建package:com.learning.hadoop,在该package下新建clss:HadoopUtils.java 。
参考步骤:
在src/main/java上点击右键新建Package,如下图:
在弹出的窗口中Name: 里填写 com.learning.hadoop ,如下图:
点击Finish按钮。再在创建的Package com.learning.hadoop上点击右键选择New à Class 创建一个类,类名叫HadoopUtils,并勾选创建 main
选项,如下图:
点击Finish按钮。
编辑HadoopUtils.java ,参考代码如下:
package com.learning.hadoop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HadoopUtils {
private Configuration conf;
private FileSystem fileSystem;
public HadoopUtils() {
// 加载配置文件,默认会加载CLASSPATH下的core-site.xml
conf = new Configuration();
// 也可以自己手动加载配置文件 如下
// conf.addResource("core-site.xml");
try {
// 用超级管理员账号 不会存在权限问题
fileSystem = FileSystem.get(new URI(conf.get("fs.defaultFS")), conf, conf.get("loginName"));
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
/**
* 读取文件,对应 cat命令 get命令 可以将字节从新生成文件
*
* @param fileUri
*/
public void readFile(String fileUri) {
Path path = new Path(fileUri);
try {
//先判断文件路劲是否存在,如果存在,则创建读取文件流的对象,并读取数据
} catch (IOException e) {
e.printStackTrace();
}
public void log(String s) {
System.out.println(s);
}
public static void main(String[] args) {
HadoopUtils hdfsFileSystem = new HadoopUtils();
hdfsFileSystem.readFile("/readhadoop.txt");
}
}
如果程序有报错,在项目上右键,选择Maven -> Update project...
在src/main/resources/ 目录下新建core-site.xml文件,用来配置hdfs系统地址以及访问用户名。
参考内容如下(192.168.26.201为hadoop集群master服务器的ip,root为启动hadoop服务的用户,请根据自己实际情况修改):
? xml version = "1.0" encoding = "UTF-8" ?>
fs.defaultFS
hdfs://192.168.26.201:9000
loginName
root
2.2、准备测试数据
在master服务器上目录/usr/local/zhitu/ 目录下创建一个readhadoop.txt文件,并输入内容为:
Hello hadoop ,
this is my first hadoop program!
再将文件上传到hdfs系统的根目录下。
参考命令:
echo 'Hello hadoop,'>>/usr/local/zhitu/readhadoop.txt
echo 'this is my first hadoop program!'>>/usr/local/zhitu/readhadoop.txt
bin/hdfs dfs -put /usr/local/zhitu/readhadoop.txt /
在可以运行刚刚编写的HadoopUtils.java,在HadoopUtils.java文件上点击右键,选择Run As à Java Application,如下图:
查看运行结果:
可以查看到已经成功将hdfs系统里的文件读取出来了。
3、开发上传本地文件到hdfs系统里的代码
3.1、开发上传本地文件到hdfs系统里的代码
在上一步中的HadoopUtils.java文件里 新增copyFromLocal(String localPath,String remoteUri) 方法,实现将本地文件上传到hdfs系统里的功能。
参考代码如下:
? public void copyFromLocal(StringlocalPath,String remoteUri){
Path src = new Path(localPath);
Path dst = new Path(remoteUri);
try {
//复制文件
fileSystem.copyFromLocalFile(src, dst);
log("over!");
} catch (IOException e) {
e.printStackTrace();
}
}
3.2、测试上一步中开发的代码
修改Main方法,测试上一步中开发的代码。将本地文件上传到hdfs中,并使用hdfs命令查看上传文件的内容。
参考步骤:
将main方法修改为如下:
public static void main(String[] args) {
HadoopUtils hdfsFileSystem = new HadoopUtils();
//hdfsFileSystem.readFile("/readhadoop.txt");
hdfsFileSystem.copyFromLocal("/root/local.txt","/fromlocal.txt");
}
在develop-pc的/root目目录下新建local.txt,输入如下内容:
这是我本地的文件
This is my local file!
新建文件的方法如下:
点击“应用程序”,选择“系统工具”下的“终端”,打开终端窗口:
使用命令:
cd /root
touch local.txt
echo '这是我本地的文件'>>local.txt
echo 'This is my local file!'>>local.txt
再用上一步中同样的方法运行HadoopUtils.java,结果如下:
此时文件应该是已经上传到hdfs系统里了,我们可以在master服务器上使用hdfs命令查看,
参考命令:
?bin/hdfs dfs -ls
bin/hdfs dfs -cat /fromlocal.txt