HDFS完全分布式安装请看:
目录
任务2:编写一个Java程序,打开一个HDFS中的文件,并读取其中的数据,输出到标准输出
任务4:编写一个Java程序,新建一个HDFS文件,并向其中写入你的名字
任务5:编写一个Java程序,判断HDFS上是否存在某个文件
任务6:给定HDFS中某一个目录,编写一个Java程序输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息
任务1:编写一个Java程序,向HDFS中上传任意文本文件
基本思路:
首先使用start-dfs.sh和start-yarn.sh启动集群,利用shell生成hdfs目标目录(不生成也行,代码执行后会自动创建):
然后打开eclipse,导入hadoop相关jar包:
在函数uploadFile(String src,String dst)中:
src为源路径,dst为目标路径
新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:
新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统
封装源路径与目标路径,调用copyFromLocalFile上传文件,上传完成后关闭文件系统
主函数传参并调用uploadFile(String src,String dst):
参考代码:
//将本地/home/lee/files/lab1.txt上传到hdfs的/user/lee/input/lab1.txt:
package lab1;
import java.net.URI;
import java.io.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class UploadUtil {
public static void main(String[] args) throws IOException, InterruptedException {
UploadUtil uploadUtil=new UploadUtil();
String src = "/home/lee/files/lab1.txt";
String dst = "/user/lee/input/lab1.txt";
uploadUtil.uploadFile(src,dst);
}
//本地文件上传到Hdfs
public void uploadFile(String src,String dst) throws IOException, InterruptedException {
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://master:9000");
configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
// FileSystem hdfsfileSystem = FileSystem.get(URI.create("hdfs://master:9000"), conf, "root");//root用户
FileSystem hdfsfileSystem = FileSystem.get(URI.create(dst), configuration, "root");//root用户
Path srcPath = new Path(src);//原路径
Path dstPath = new Path(dst);//目标路径
hdfsfileSystem.copyFromLocalFile(false, srcPath, dstPath);//(false不删除本地文件;true删除本地文件,原路径,目标路径)
System.out.println("上传成功!");
hdfsfileSystem.close();
}
}
实验结果:
执行前:
执行后:
任务2:编写一个Java程序,打开一个HDFS中的文件,并读取其中的数据,输出到标准输出
基本思路:
首先导入jar包,任务1已经做了。
在函数readfile(String src)中:
新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:
新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统
使用Path类封装路径src
使用BufferedReader类封装输入流,按行读取数据。读取完关闭所有文件系统
主函数传参并调用readfile(String src):
lab1.txt文件内容:
参考代码:
//读取hdfs系统下/user/lee/input/lab1.txt
package lab1;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
public class ReadoutUtil {
public static void main(String[] args) throws IOException, InterruptedException {
String src = "/user/lee/input/lab1.txt";
ReadoutUtil readoutUtil=new ReadoutUtil();
readoutUtil.readfile(src);
}
@SuppressWarnings("deprecation")
public void readfile(String src) throws IOException, InterruptedException {
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://master:9000");
configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
// FileSystem hdfsfileSystem = FileSystem.get(URI.create("hdfs://master:9000"), configuration, "root");
FileSystem hdfsfileSystem = FileSystem.get(URI.create(src), configuration, "root");
Path path = new Path(src);
FSDataInputStream in = new FSDataInputStream(hdfsfileSystem.open(path));
// BufferedReader d = new BufferedReader(new InputStreamReader(in));
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FSDataInputStream(hdfsfileSystem.open(path))));
String line = bufferedReader.readLine();
while (line != null) {
System.out.println(line.toString());
line = bufferedReader.readLine();
}
in.close();//关闭文件
hdfsfileSystem.close();//关闭hdfs
}
}
实验结果:
任务3:编写一个Java程序,从HDFS中下载指定文件
基本思路:
首先导入jar包,任务1已经完成
在函数downfile(String src,String src1,String name)中:
src为源路径,src1为目标路径,name为文件名(即可以重命名)
新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:
新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统
使用Path类封装路径
使用hdfs文件系统对象调用函数copyToLocalFile,下载文件,然后关闭文件系统
主类传参并调用downfile(String src,String src1,String name):
参考代码:
//将hdfs系统下的/user/lee/input/lab1.txt文件下载到本地/home/lee/files/aaa,并重命名为222.txt
package lab1;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FilterFileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
public class DownloadUtil {
public static void main(String[] args) throws IOException, InterruptedException {
DownloadUtil downloadUtil=new DownloadUtil();
String src="/user/lee/input/lab1.txt";
String src1="/home/lee/files/aaa";
String name="/222.txt";
downloadUtil.downfile(src,src1,name);
}
public void downfile(String src,String src1,String name) throws IOException, InterruptedException {
Configuration configuration=new Configuration();
configuration.set("fs.defaultFS", "hdfs://master:9000");
configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem hdfsfileSystem=FileSystem.get(URI.create(src),configuration,"root");
Path localpath=new Path(src1+name);
Path hdfspath=new Path(src);
hdfsfileSystem.copyToLocalFile(false,hdfspath,localpath);
System.out.println("成功下载"+src.split("/")[src.split("/").length-1]+",重命名为"+name.replace("/", ""));
System.out.println("文件已保存至"+src1);
hdfsfileSystem.close();
}
}
实验结果:
任务4:编写一个Java程序,新建一个HDFS文件,并向其中写入你的名字
基本思路:
首先导入jar包,任务1已经完成
在函数writefile(String src)中:
src目标路径
新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:
新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统
使用Path类封装路径
使用BufferedReader类封装输出流,然后写入名字,最后关闭文件系统
主类传参并调用writefile(String src):
参考代码:
//将名字写入hdfs系统的/user/lee/output/myname.txt(执行程序会自动创建)
package lab1;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class WriteInUtil {
public static void main(String[] args) throws IOException, InterruptedException {
String src="/user/lee/output/myname.txt";
WriteInUtil writeInUtil=new WriteInUtil();
writeInUtil.writefile(src);
}
public void writefile(String src) throws IOException, InterruptedException {
Configuration configuration=new Configuration();
configuration.set("fs.defaultFS", "hdfs://master:9000");
configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem hdfsfileSystem=FileSystem.get(URI.create(src), configuration, "root");
Path hdfsPath=new Path(src);
FSDataOutputStream out=hdfsfileSystem.create(hdfsPath);
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));
//out.writeUTF("lee");
writer.write("lee");
System.out.println("成功写入!");
writer.close();
hdfsfileSystem.close();
}
}
实验结果:
任务5:编写一个Java程序,判断HDFS上是否存在某个文件
基本思路:
首先导入jar包,任务1已经完成
在函数judge(String src)中:
src目标文件路径
新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:
新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统
使用Path类封装路径,调用函数exists(Path)判断文件是否已存在,完成后关闭文件系统
主类传参并调用judge(String src):
参考代码:
//判断/user/lee/input/lab1.txt是否存在,应该是已存在,因为任务二中已经上传了
//判断/user/lee/input/lab0.txt是否存在,应该是不存在
package lab1;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
public class IsExistUtil {
public static void main(String[] args) throws IOException, InterruptedException {
IsExistUtil isExistUtil=new IsExistUtil();
String src="/user/lee/input/lab1.txt";
String src2="/user/lee/input/lab0.txt";
isExistUtil.judge(src);
isExistUtil.judge(src2);
}
public void judge(String src) throws IOException, InterruptedException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://master:9000");
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
// FileSystem hdfsfileSystem = FileSystem.get(URI.create("hdfs://master:9000"),conf,"root");//root用户
FileSystem hdfsfileSystem = FileSystem.get(URI.create(src),conf,"root");//root用户
Path srcPath = new Path(src);//原路径
//判断是否存在相同名称的文件
if(!hdfsfileSystem.exists(srcPath))//不存在,直接复制
{
System.out.println("文件"+src.split("/")[src.split("/").length-1]+"不存在");
}
else
System.out.println("文件"+src.split("/")[src.split("/").length-1]+"已存在");
hdfsfileSystem.close();
}
}
实验结果:
任务6:给定HDFS中某一个目录,编写一个Java程序输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息
基本思路:
首先导入jar包,任务1中已经完成
在函数getInfo(String src)中:
src目标路径
新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:
新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统
使用Path类封装路径,利用列表RemoteIterator<LocatedFileStatus>
递归获取目录下的所有文件。调用Get函数获得文件信息
关闭文件系统:
主类传参并调用getInfo(String src):
参考代码:
//获取/user目录下所有文件信息
package lab1;
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.checkerframework.checker.units.qual.h;
public class FileInfoUtil {
public static void main(String[] args) throws IOException, InterruptedException {
String src="/user";
FileInfoUtil fileInfoUtil=new FileInfoUtil();
fileInfoUtil.getInfo(src);
}
public void getInfo(String src) throws IOException, InterruptedException {
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://master:9000");
configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem hdfsfileSystem = FileSystem.get(URI.create(src), configuration, "root");
Path path = new Path(src);
RemoteIterator<LocatedFileStatus> filelist=hdfsfileSystem.listFiles(path, true);
while (filelist.hasNext()) {
LocatedFileStatus status = filelist.next();
System.out.println("路径:"+(status.getPath()).toString().replace("hdfs://master:9000", ""));
System.out.println("文件名:"+status.getPath().getName());
System.out.println("文件块大小:"+status.getBlockSize());
System.out.println("文件权限:"+status.getPermission());
System.out.println("文件内容长度:"+status.getLen());
//获取该文件块的信息(长度/数据块/Datanode信息)
BlockLocation[]blockLocations=status.getBlockLocations();
for(BlockLocation blockLocation:blockLocations) {
System.out.println("block-length:"+blockLocation.getLength());
System.out.println("block-offset:"+blockLocation.getOffset());
//获取datanode主机名
String[]hosts=blockLocation.getHosts();
System.out.println("Datanodes:");
for(String host:hosts) {
System.out.println(host);
}
}
System.out.println("--------------------------我是分割线---------------------------------");
}
hdfsfileSystem.close();
}
}