Hadoop的环境变量配置及与java的交互

本次配置使用的是Hadoop2.6.0和jdk1.8.0

环境变量配置

第一步:
在我的电脑中,打开高级系统设置,进入环境变量
在这里插入图片描述

在这里插入图片描述
第二步:
在系统变量中新建一个HADOOP_HOME,输入变量名和变量值,变量值是安装的hadoop文件路径
在这里插入图片描述
在这里插入图片描述
第三步:
找到系统变量中的Path变量,打开,在下方新建两个,
输入hadoop文件下的bin和sbin两个目录。
注:bin目录主要是用来执行文件,sbin是启动hadoop的。

%HADOOP_HOME%\bin
%HADOOP_HOME%\sbin

在这里插入图片描述
完成后确定,重启电脑即可。

Hadoop与java的交互

在idea中打开Maven,选择quicjstart模板
在这里插入图片描述
然后设置包名和工程名:
GroupId一般是域名的反写,也作为项目中类的包名
ArtifactId是工程名,即文件的根文件夹名
在这里插入图片描述
然后选择我们的Maven路径:
User setting file在conf路径下
在这里插入图片描述
下一步完成,工程名我们前面已经设置过,这里会直接调用。路径可以根据自身需要设置
在这里插入图片描述
完成后进入到idea界面,右下角会提示我们下载一些数据,这里可以点击Import下载,也可auto-import实现自动下载,以后如果有什么需要下载会自动进行。
在这里插入图片描述
我在这里做了修改,原先的1.7改成了1.8,junit版本从4.11改成了4.12,并且导入了新的包

在这里插入图片描述
为了实现和java和hadoop的交互,我们需要下载一些安装包。可以到网上搜索Maven,进入到Maven Repository中进行下载
或者直接点击此链接hadoop

在Search搜索hadoop就可查出我们需要下载的包。这里下载common、hdfs、core三个包,点进去后,会让我们选择版本,再进入会有相应的Maven代码,复制到idea中运行,就能实现下载:
在这里插入图片描述

<dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-core</artifactId>
      <version>1.2.0</version>
    </dependency>

在这里插入图片描述
上述包输入,如果在前面点了自动下载会自行下载,否则需要手动下载,即点击import.
下面我们就开始实现java和hadoop之间的交互。

交互实现

新建一个hdfs类。前面建的Test.HDFS包下会有一个App类,hdfs要是它的次一级。
在这里插入图片描述
建立main方法,Configuration要用hadoop.conf包下的
在这里插入图片描述
下位具体的代码,这里为了方便查看,直接在main方法上抛出异常:

public class hdfs {
    public static void main(String[] args) throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.136.30:9000");//IP地址
        //获取文件系统
        FileSystem fs=FileSystem.get(conf);//也是hadoop包下的
        //上述可以详写为:
        //FileSystem fs = FileSystem.get(new URI("hdfs://192.168.136.30:9000"), new Configuration(), "root");
        FSDataInputStream fis = fs.open(new Path("/test/java/hdfs-test/README.txt"));//hdfs上的文件路径,我提前上传好的
        //查看流
        int tmp;
        while ((tmp = fis.read()) != -1) {
            //不为-1说明读取成功,然后输出
            System.out.print((char)tmp);//这里不能设置自动换行
        }
        fis.close();//关闭流
    }
}

文件输出我们上传的文件内容:
在这里插入图片描述
从hdfs中读取文件
我们可以利用java把hdfs中的文件读取出来,具体操作如下。
为了方便调用args,我们可以提前设置好读写的地址,也可以直接在代码中的args位置写入地址:
"/test/java/hdfs-test/README.txt"是hdfs上的文件路径,"test1"是我们读取后要写入的文件,不用提前创建,执行完会自动在idea中创建。如果想写入到其他文件,我们需要输入目标文件的具体路径。在这里可以把它们看成是一个数组,下标分别为0和1,对应args中的0和1.
(可以像这样直接写入地址)
在这里插入图片描述
地址设置:
在这里插入图片描述
在这里插入图片描述

public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.136.30:9000"), new Configuration(), "root");
        FSDataInputStream fis = fs.open(new Path(args[0]));
        FileOutputStream fos =new FileOutputStream(args[1]);
        //查看流
        int tmp;
        while ((tmp = fis.read()) != -1) {
            //不为-1说明读取成功,然后写入
            fos.write(tmp);
        }
        fos.close();
        fis.close();
    }

执行完成后会自动创建一个test1文件
在这里插入图片描述
点进去查看是否为我们读取到的内容
在这里插入图片描述

文件复制

实现把hdfs上的文件复制到虚拟机中查看。
路径根据自身需要设置,同前面。

        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.136.30:9000"), new Configuration(), "root");
        //从hdfs上复制到本地,0代表的是hdfs路径,1就是我们选择的路径
        fs.copyToLocalFile(new Path(args[0]),new Path(args[1]));//不要选boolean类型的

(其实这个方法也可实现在idea中查看,执行完后,hdfs上的文件会写入到我们的目标路径)
为了实现利用虚拟机查看我们首先打jar包,如果把路径直接写在代码里,当jar包导入后,再输入命令时会报错,建议先设置好,然后args,就不会出错:
在这里插入图片描述
在这里插入图片描述
标记处是jar包的路径
在这里插入图片描述
在这里插入图片描述
打好的jar包在这里可以找到:
在这里插入图片描述
把jar包拉到虚拟机中,根据自身选择路径,这里我用的是Mobaxterm工具
在这里插入图片描述
然后输入指令:
这里为了方便我把包名改了,原先因为失误在包名中加了点,这会影响我们指令的书写。

hadoop jar HADOOP.jar TestHdfs.test.hdfs /test/java/hdfs-test/README.txt /opt/hadoop/share/f1.txt

格式:
hadoop jar jar包名 main方法所在的路径 hdfs文件路径 需要写入的文件路径。
执行完成后,在目标路径下会多一个t1文件,可以查看是否是我们需要的内容:
在这里插入图片描述
在这里插入图片描述

文件上传

和复制文件一样,需要打jar包上传。路径根据自身想要上传的文件设置对应的路径

Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.136.30:9000"), new Configuration(), "root");
        //从hdfs上复制到本地,0代表的是hdfs路径,1就是我们选择的路径
        fs.copyFromLocalFile(new Path(args[1]),new Path(args[0]));//从本地上传到hdfs

在linux中上传的指令:
这里我把f2中的内容上传到readme2中

hadoop jar HADOOP.jar TestHdfs.test.hdfs /test/java/hdfs-test/readme2.txt /opt/hadoop/share/f2.txt

java和linux中执行效果是一样的。
执行完后我们可以在ip地址:50070中查看,这里有我们创建的目录和文件,进入相应路径可以看到我们刚才上传的目标文件(自动生成的)
在这里插入图片描述

在这里插入图片描述
我们可以在linux中查看上传的内容:

hadoop fs -cat /test/java/hdfs-test/readme2.txt

在这里插入图片描述
上传成功。

创建文件

        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.136.30:9000"), new Configuration(), "root");
        fs.mkdirs(new Path("/Hello/everyone/person.txt"));
    }

执行后我们可以到hdfs中查看创建是否成功
在这里插入图片描述
注意如果我们即使在在文件后加上.txt也不会创建一个文件,依然是目录
在这里插入图片描述

删除文件目录

    Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.136.30:9000"), new Configuration(), "root");
        fs.delete(new Path("/Hello/everyone/person.txt"));

删除文件输入我们想要删除的目标路径即可删除,在hdfs中查看是否成功.

补充
listFile

 @Test
    public void listFiles() throws Exception{
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.136.30:9000"), conf, "root");

        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/hadoop/hdfs"), true);
        while (listFiles.hasNext()) {
            LocatedFileStatus status = listFiles.next();
            System.out.println(status.getPath().getName());
            System.out.println(status.getLen());
            System.out.println(status.getReplication());
            System.out.println(status.getGroup());

            BlockLocation[] blockLocations = status.getBlockLocations();
            for (BlockLocation blockLocation : blockLocations) {
                System.out.println(blockLocation.getHosts());
                System.out.println(blockLocation.getLength());
            }
        }
        fs.close();
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值