环境搭建
1)下载 win10 或 win7 下编译过的 Hadoop jar 包
2)解压缩 配置环境变量
3)创建 maven 项目
<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>
</dependencies>
4)创建 log4j.properties
log4j.rootLogger=INFO, studout
log4j.appender.studout=org.apache.log4j.ConsoleAppender
log4j.appender.studout.layout=org.apache.log4j.PatternLayout
log4j.appender.studout.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
5)测试
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
// 获取hdfs客户端对象
FileSystem fs = FileSystem.get(new URI(hdfs://hadoop102:9000), conf, "atguigu");
// 在hdfs上创建路径
fs.mkdirs(new Path("/sanguo/shuguo/liubei"));
// 关闭资源
fs.close();
}
API操作
上传
// 将本地 e 盘 banzhang.txt 上传到 HDFS 根目录 banzhang.txt
fs.copyFromLocal dDDD File(new Path("e:/banzhang.txt"), new Path("/banzhang.txt"))
下载
// boolean delSrc 指是否将原文件删除
// Path src 指要下载的文件路径
// Path dst 指将文件下载到的路径
// boolean userRawLocalFileSystem 是否开启文件校验
fs.copyToLocalFile(false, new Path("/banzhang.txt"), new Path("e/banhua.txt"), true);
删除
// 删除 0508 文件夹,递归删除
fs.delete(new Path("/0508/"), true);
修改
// 修改文件名称
fs.rename(new Path("/banzhang.txt"), new Path("banhua.txt"));
查看
// 获取文件详情
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while(listFiles.hasNext()){
LocatedFileStatus status = listFiles.next();
System.out.println(status.getPath().getName());// 文件名称
System.out.println(status.getPermission());// 文件权限
System.out.println(status.getLen());// 文件长度
// 查看文件在那些主机上
BlockLocation[] blockLocations = status.getBlockLocations();
for(BlockLocation blockLocation : blockLocations){
String hosts = blockLocation.getHosts();// 返回所有主机名称
for(String host : hosts){
System.out.println(host);
}
}
System.out.println("-------------分割线---------------")
}
fs.close();
文件和文件夹判断
// 判断是文件还是文件夹
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for(FileStatus fileStatus : listStatus){
// 如果是文件
if(fileStatus.isFile()){
System.out.println("f:"+fileStatus.getPath().getName());
}else{ // 如果是文件夹
System.out.println("d:"+fileStatus.getPath().getName());
}
}
fs.close();
I/O流操作
IO流上传
//把本地e盘上的banhua.txt文件上传到HDFS根目录
@Test
public void putFileToHDFS(){
//获取对象
Configuration conf =new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "atguigu");//老版本端口8020
//获取输入流
FileInputStream fis =new FileInputStream(new File("e:/banzhang.txt"));
//获取输出流
FSDataOutputStream fos = fs.create(new Path("/banzhang.txt"));
//流的对拷
IOUtils.copyBytes(fis, fos, conf);
//关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
IO流下载
//从HDFS上下载banhua.txt文件到本地e盘上
@Test
public void getFileFromHDFS(){
//获取对象
Configuration conf =new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "atguigu");//老版本端口8020
//获取输入流
FSDataInputStream fis = fs.open(new Path("/banhua.txt"));
//获取输出流
FileOutputStream fos =new FileOutputStream(new File("e:/banhua.txt"));
//流的对拷
IOUtils.copyBytes(fis, fos, conf);
//关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
定位读取
第一块
//只下载第一块
@Test
public void readFileSeek1(){
//获取对象
Configuration conf =new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "atguigu");//老版本端口8020
//获取输入流
FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));
//获取输出流
FileOutputStream fos =new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part1"));
//流的对拷(只拷贝128m)
byte[] buf =new byte[1024];
for (int i =0; i <1024 *128; i++) {
//读取数据到buf
fis.read(buf);
//写数据
fos.write(buf);
}
//关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
第二块
//只下载第二块
@Test
public void readFileSeek2(){
//获取对象
Configuration conf =new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "atguigu");//老版本端口8020
//获取输入流
FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));
//设置指定读取的起点
fis.seek(1024 *1024 *128);
//获取输出流
FileOutputStream fos =new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part2"));
//流的对拷(只拷贝128m)
IOUtils.copyBytes(fis, fos, conf);
//关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
windows cmd 下拼接: type hadoop-2.7.2.tar.gz.part2 >> hadoop-2.7.2.tar.gz.part1