当前位置: 代码迷 >> 综合 >> hadoop-day02
  详细解决方案

hadoop-day02

热度:8   发布时间:2023-11-30 10:48:25.0

1 JAVA-HDFS-API 

1.1 maven快速入门 (项目构建工具)

1 构建项目

2 管理项目的依赖的jar包

使用本地的一个文件夹来存储jar包 称为本地仓库

 在d盘创建文件夹

将settting.xml文件复制到和repository平级的目录下

修改setting文件的55行 , 改成自己的目录

创建一个项目 然后修改本地仓库的位置

点击刷新按钮 等待下载插件完毕

添加项目的依赖

  <dependencies><!-- mysql的驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency></dependencies>

1.2 创建maven项目  操作HDFS

1 添加依赖

2 创建类  修改类的模板

按照顺序打开File–>settings–>Editor–>File and Code Templates–>Includes

/*** @Classname ${NAME}* @Description TODO* @Date ${DATE} ${TIME}* @Created by ${USER}*/

1,3 入门程序

1.3.1 添加依赖 

 <build><plugins><!--编译插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build><dependencies><!--添加hdfs的客户端依赖--><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-common</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-jobclient</artifactId><version>3.1.1</version></dependency></dependencies>

1.3.2 入门程序

/*** @Classname Demo2* @Date 2020/9/20 0020 11:03* @Created by 多易教育-DOIT18* @Description:* 使用hadoop提供的就java API 操作HDFS系统* 1 导入HDFS的依赖* 2 获取一个代表 HDFS文件系统的对象*    1) URI hdfs://linux01:8020*    2) 用户自定义设置参数* 3 对象.方法操作* 4 释放资源* ls* put* get* rm* mkdir*/
public class Demo2 {public static void main(String[] args) throws Exception {//  1创建一个配置对象Configuration conf = new Configuration();// 2 创建一个代码分布式文件系统的对象/*** 1 不能直接new 有创建实例的静态方法* 2三个参数*   2.1 参数一 指定的HDFS文件系统的URI*   2.2 配置信息对象*   2.3 windows上运行程序  , 用户名  root*/FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:8020"), conf, "root");// 3 调用方法// 创建层级文件夹fs.mkdirs(new Path("/aaa/bbb/ccc/ddd"));//4 释放资源fs.close();}
}

1.4 创建文件夹

 /*** 创建文件夹* @throws Exception*/private static void testMkdirs() throws Exception {FileSystem fs = DoitUtils.getHDFSfs();fs.mkdirs(new Path("/a/b/c")) ;fs.close();}

1.5 删除内容

   private static void testDelete2(FileSystem fs) throws IOException {fs.delete(new Path("/a"), true);}/*** 删除文件夹* @throws Exception*/private static void testDelete() throws Exception {FileSystem fs = DoitUtils.getHDFSfs();testDelete2(fs);fs.close();}

1.6 判断路径是否存在

 public static void main(String[] args) throws Exception {Configuration conf = new Configuration();URI uri = new URI("hdfs://linux01:8020");String  user = "root" ;FileSystem fs = FileSystem.newInstance(uri, conf, user);boolean exists = fs.exists(new Path("/aaa"));System.out.println(exists);fs.close();}

1.7 工具类封装

/*** @Classname DoitUtils* @Date 2020/9/20 0020 11:49* @Created by 多易教育-DOIT18* @Description:* 1 获取 hdfs://linux01:8020 文件系统的客户端对象*/
public class DoitUtils {/*** 获取 分布式文件系统客户端* @return* @throws Exception*/public  static FileSystem  getHDFSfs() throws Exception {Configuration conf = new Configuration();URI uri = new URI("hdfs://linux01:8020");String  user = "root" ;FileSystem fs = FileSystem.newInstance(uri, conf, user);return fs ;}}

1.8 上传

private static void put(FileSystem fs) throws IOException {// 将本地的文件上传到HDFS中/*** 参数一是否删除源文件* 参数二 是否覆盖已有的文件* 参数三 要上传的文件   Path[]* 参数四  HDFS的目标位置*/Path[] ps = new Path[]{new Path("d://word.txt") , new  Path("d://a.txt")} ;fs.copyFromLocalFile(false , true , ps,new Path("/"));}

1.9 下载

在下载文件的时候需要在本地配置HADOOP的系统环境变量

解压压缩文件,配置系统环境变量 

  private static void get(FileSystem fs) throws IOException {// 下载 从HDFS 下载内容到windows  需要在windows上配置HDP的环境/*** 参数一  是否删除HDFS上要下载的文件* 参数二 HDFS上要下载的文件* 参数三  本地的路径* 参数四 是否生成校验文件 默认是false   true 不会生成校验文件*/fs.copyToLocalFile(false , new Path("/a.txt") , new Path("f://"),true);}

1.10 配置详解

/*** @Classname Config* @Date 2020/9/20 0020 14:45* @Created by 多易教育-DOIT18* @Description:* 用户想自定义配置参数   Configuration用于用户的定制化设置*    上传    6个副本*  1 可以使用Configuration来自定义设置参数*  2 不设置采用默认的配置参数*  3 如果用户在代码中没有设置参数  但是在项目的resources文件夹下有hdfs-site.xml  core-site.xml hdfs-default.xml*  就会自动的读取配置参数*  顺序*   代码中 >>> 配置文件 >>>>默认的**  范围*  默认的 >>> 配置文件 >>> 代码中*/
public class Config {public static void main(String[] args) throws Exception {//Configuration conf = new Configuration();//设置存储副本的个数// conf.set("dfs.replication" ,"2" );// 设置物理切块的大小//  conf.set("dfs.blocksize","64M");FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:8020"), conf, "root");fs.copyFromLocalFile(new Path("d://mrdata.zip") ,new Path("/aa/a.zip"));fs.close();}}

1.11 读取数据 

/*** @Classname ReadHdfsData* @Date 2020/9/20 0020 15:24* @Created by 多易教育-DOIT18* @Description: open()  输入的字节流* 使用java读取hdfs上的文件数据(输入流)* 1 输入流*   字节流*   字符流*   转换流*  2 读取数据 随机读 skip seek*  3 记录读取数据的长度*  4 line.length()不包含换行符  +1 / +2**/
public class ReadHdfsData {public static void main(String[] args) throws Exception {FileSystem fs = DoitUtils.getHDFSfs();FSDataInputStream fis = fs.open(new Path("/word.txt"));fis.seek(3); // skip/* fis.read();fis.read();fis.read();int i = fis.read();System.out.println(i); //97*/// 使用缓冲字符流BufferedReader br = new BufferedReader(new InputStreamReader(fis));long len = 0 ;String line = null ;while((line=br.readLine())!=null){// line.length() 一行数据的内容长度  每行需要+ 换行长度 在windows中+2 \r\n  在linux中的文件 +1 \rlen+= line.length()+ 2 ;if(len >= 100){break ;}System.out.println(line);}System.out.println(len);fis.close();fs.close();}
}

1.12 写数据 

不能随机写 ,创建一个文件写 , 向文件的后面追加写

 private static void append() throws Exception {FileSystem fs = DoitUtils.getHDFSfs();//append 向文件的末尾追加内容FSDataOutputStream fout = fs.append(new Path("/word.txt"));fout.write("nihao".getBytes());fout.close();fs.close();}private static void testCreate(FileSystem fs) throws IOException {// create 创建一个文件获取输出流//参数1  hdfs的文件// 参数2 是否要覆盖写  默认是true  false 不允许覆盖写FSDataOutputStream fout = fs.create(new Path("/a.txt"),true);fout.write("hello".getBytes());fout.close();}

 

1.13 遍历路径下所有的文件

/*** @Classname ListDemo* @Date 2020/9/20 0020 16:30* @Created by 多易教育-DOIT18* @Description: fs.listFiles* 遍历指定路径写下所有的文件* 1 获取文件名* 2 获取文件的路径* 3 获取文件的长度* 4 文件的副本个数* 5 获取文件的物理切块* 6 获取修改时间 访问时间  获取拥有者 组  权限* & ****获取文件的元数据信息*/
public class ListDemo {public static void main(String[] args) throws Exception {FileSystem fs = DoitUtils.getHDFSfs();/*** 列出指定目录下所有的文件* 参数一路径* 参数二 是否递归遍历*/RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(new Path("/"), false);while(iterator.hasNext()){// 代表一个文件LocatedFileStatus fileStatus = iterator.next();// 获取文件路径和文件名Path path = fileStatus.getPath();String name = path.getName();long len = fileStatus.getLen();//System.out.println(path+"-->"+name+":"+len);// 文件的物理切块大小long blockSize = fileStatus.getBlockSize();short replication = fileStatus.getReplication();System.out.println(name+"--"+blockSize/1024/1024+"M"+"--:"+replication) ;}fs.close();}
}