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


目录

  • 环境变量配置
  • Hadoop与java的交互
  • 交互实现
  • 文件复制
  • 文件上传
  • 创建文件
  • 删除文件目录


环境变量配置

第一步:

在我的电脑中,打开高级系统设置,进入环境变量

hadoop hive 环境变量 hadoop环境变量设置_大数据

hadoop hive 环境变量 hadoop环境变量设置_java_02


第二步:

在系统变量中新建一个HADOOP_HOME,输入变量名和变量值,变量值是安装的hadoop文件路径

hadoop hive 环境变量 hadoop环境变量设置_大数据_03


hadoop hive 环境变量 hadoop环境变量设置_大数据_04


第三步:

找到系统变量中的Path变量,打开,在下方新建两个,

输入hadoop文件下的bin和sbin两个目录。

注:bin目录主要是用来执行文件,sbin是启动hadoop的。

%HADOOP_HOME%\bin
%HADOOP_HOME%\sbin

hadoop hive 环境变量 hadoop环境变量设置_大数据_05


完成后确定,重启电脑即可。

Hadoop与java的交互

在idea中打开Maven,选择quicjstart模板

hadoop hive 环境变量 hadoop环境变量设置_hadoop_06


然后设置包名和工程名:

GroupId一般是域名的反写,也作为项目中类的包名

ArtifactId是工程名,即文件的根文件夹名

hadoop hive 环境变量 hadoop环境变量设置_hadoop_07


然后选择我们的Maven路径:

User setting file在conf路径下

hadoop hive 环境变量 hadoop环境变量设置_大数据_08


下一步完成,工程名我们前面已经设置过,这里会直接调用。路径可以根据自身需要设置

hadoop hive 环境变量 hadoop环境变量设置_hdfs_09


完成后进入到idea界面,右下角会提示我们下载一些数据,这里可以点击Import下载,也可auto-import实现自动下载,以后如果有什么需要下载会自动进行。

hadoop hive 环境变量 hadoop环境变量设置_大数据_10


我在这里做了修改,原先的1.7改成了1.8,junit版本从4.11改成了4.12,并且导入了新的包

hadoop hive 环境变量 hadoop环境变量设置_java_11


为了实现和java和hadoop的交互,我们需要下载一些安装包。可以到网上搜索Maven,进入到Maven Repository中进行下载

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

hadoop hive 环境变量 hadoop环境变量设置_大数据_12

<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>

hadoop hive 环境变量 hadoop环境变量设置_java_13


上述包输入,如果在前面点了自动下载会自行下载,否则需要手动下载,即点击import.

下面我们就开始实现java和hadoop之间的交互。

交互实现

新建一个hdfs类。前面建的Test.HDFS包下会有一个App类,hdfs要是它的次一级。

hadoop hive 环境变量 hadoop环境变量设置_hadoop_14


建立main方法,Configuration要用hadoop.conf包下的

hadoop hive 环境变量 hadoop环境变量设置_hadoop_15


下位具体的代码,这里为了方便查看,直接在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();//关闭流
    }
}

文件输出我们上传的文件内容:

hadoop hive 环境变量 hadoop环境变量设置_hadoop hive 环境变量_16


从hdfs中读取文件

我们可以利用java把hdfs中的文件读取出来,具体操作如下。

为了方便调用args,我们可以提前设置好读写的地址,也可以直接在代码中的args位置写入地址:

"/test/java/hdfs-test/README.txt"是hdfs上的文件路径,"test1"是我们读取后要写入的文件,不用提前创建,执行完会自动在idea中创建。如果想写入到其他文件,我们需要输入目标文件的具体路径。在这里可以把它们看成是一个数组,下标分别为0和1,对应args中的0和1.

(可以像这样直接写入地址)

hadoop hive 环境变量 hadoop环境变量设置_hadoop_17


地址设置:

hadoop hive 环境变量 hadoop环境变量设置_hadoop hive 环境变量_18


hadoop hive 环境变量 hadoop环境变量设置_java_19

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文件

hadoop hive 环境变量 hadoop环境变量设置_hadoop_20


点进去查看是否为我们读取到的内容

hadoop hive 环境变量 hadoop环境变量设置_hadoop_21

文件复制

实现把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,就不会出错:

hadoop hive 环境变量 hadoop环境变量设置_java_22


hadoop hive 环境变量 hadoop环境变量设置_hdfs_23


标记处是jar包的路径

hadoop hive 环境变量 hadoop环境变量设置_hadoop_24


hadoop hive 环境变量 hadoop环境变量设置_hadoop_25


打好的jar包在这里可以找到:

hadoop hive 环境变量 hadoop环境变量设置_java_26


把jar包拉到虚拟机中,根据自身选择路径,这里我用的是Mobaxterm工具

hadoop hive 环境变量 hadoop环境变量设置_hadoop_27


然后输入指令:

这里为了方便我把包名改了,原先因为失误在包名中加了点,这会影响我们指令的书写。

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

格式:

hadoop jar jar包名 main方法所在的路径 hdfs文件路径 需要写入的文件路径。

执行完成后,在目标路径下会多一个t1文件,可以查看是否是我们需要的内容:

hadoop hive 环境变量 hadoop环境变量设置_hadoop_28


hadoop hive 环境变量 hadoop环境变量设置_大数据_29

文件上传

和复制文件一样,需要打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中查看,这里有我们创建的目录和文件,进入相应路径可以看到我们刚才上传的目标文件(自动生成的)

hadoop hive 环境变量 hadoop环境变量设置_大数据_30

hadoop hive 环境变量 hadoop环境变量设置_hadoop hive 环境变量_31


我们可以在linux中查看上传的内容:

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

hadoop hive 环境变量 hadoop环境变量设置_hadoop_32


上传成功。

创建文件

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中查看创建是否成功

hadoop hive 环境变量 hadoop环境变量设置_hdfs_33


注意如果我们即使在在文件后加上.txt也不会创建一个文件,依然是目录

hadoop hive 环境变量 hadoop环境变量设置_hadoop hive 环境变量_34

删除文件目录

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();
    }