本次配置使用的是Hadoop2.6.0和jdk1.8.0
第一步: 在我的电脑中,打开高级系统设置,进入环境变量
第二步: 在系统变量中新建一个HADOOP_HOME,输入变量名和变量值,变量值是安装的hadoop文件路径 第三步: 找到系统变量中的Path变量,打开,在下方新建两个, 输入hadoop文件下的bin和sbin两个目录。 注:bin目录主要是用来执行文件,sbin是启动hadoop的。
%HADOOP_HOME%\bin %HADOOP_HOME%\sbin完成后确定,重启电脑即可。
在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.txtjava和linux中执行效果是一样的。 执行完后我们可以在ip地址:50070中查看,这里有我们创建的目录和文件,进入相应路径可以看到我们刚才上传的目标文件(自动生成的)
我们可以在linux中查看上传的内容:
hadoop fs -cat /test/java/hdfs-test/readme2.txt上传成功。
执行后我们可以到hdfs中查看创建是否成功 注意如果我们即使在在文件后加上.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(); }