本次配置使用的是Hadoop2.6.0和jdk1.8.0
目录
- 环境变量配置
- Hadoop与java的交互
- 交互实现
- 文件复制
- 文件上传
- 创建文件
- 删除文件目录
环境变量配置
第一步:
在我的电脑中,打开高级系统设置,进入环境变量
第二步:
在系统变量中新建一个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();
}