Hadoop的核心框架就 是HDFS和MapReduce,我们在这个帖子分别跑一跑案例并且做一些小调试:
HDFS为海量数据提供了存储,存储方式如下
hdfs为常用命令行有: -put、-get、-ls、-mkdir、-rm、-rmdir、-cat,下面是一些操作:
相应的HDFS命令行生成的文件可以在HDFS界面中监控:
***************************HDFS JAVA API***************************
我尝试在Windows上建立Eclipse通过Hadoop plugin去实现HDFS连接,但是尝试了2天还是没有解决通信问题。QLing随彩:Hadoop + Eclipse IDEzhuanlan.zhihu.com
于是,我觉得可以在windows上完成开发,但是把代码放在linux上跑,HDFS的操作个人觉得通过上面的命令行操作也可以接受,目前暂时搁置,未来有空优化,先focus在核心问题上!
下面尝试一下hadoop中常用的文件操作接口吧,以下帖子总结了几个例子可以调试看看:HDFS文件系统的JAVA-API操作(一) - CJZhaoSimons - 博客园www.cnblogs.com
**********************java.net.URL访问HDFS文件系统*********************
下面看看在windows上build出来的jar文件是否能在linux的HDFS中使用对上面的例子只是把报错e直接打印出来,别的没改!其他都是默认的
package Demo;
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
/*** @author SimonsZhao* HDFS的API使用* 1.如果要访问HDFS,HDFS客户端必须有一份HDFS的配置文件* 也就是hdfs-site.xml,从而读取Namenode的信息。* 2.每个应用程序也必须拥有访问Hadoop程序的jar文件* 3.操作HDFS,也就是HDFS的读和写,最常用的类FileSystem* 操作:显示HDFS文件夹中的文件内容* 1.使用java.net.URL对象打开数据流* 2.使用静态代码块使得java程序识别Hadoop的HDFS url*/
public class MyCat {
static{
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) {
InputStream input=null;
try {
input = new URL(args[0]).openStream();
IOUtils.copyBytes(input,System.out,4096,false);
} catch (Exception e) {
System.err.println(e);
}finally{
IOUtils.closeStream(input);
}
}
}
通过SecureCRT上传jar包至Linux中的指定文件夹下。
执行hdfs命令把需要java代码中读入的文件上传到hdfs文件系统中
hdfs dfs -put /usr/local/HadoopTest/lisatest.txt /user/root/
hadoop jar /usr/local/HadoopTest/MyCat.jar hdfs://master:8020/user/root/lisatest.txt
***************************FileSystem API访问HDFS文件系统***************************
***************************FileSystem的HDFS输入及输出流***************************
package Demo;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/*** @author 张良均* HDFS的FileSystem API使用* 1.操作HDFS,也就是HDFS的读和写,最常用的类FileSystem* 2.使用HDFS的输出流写文件* 3.使用HDFS的输入流读文件并打印输出* 4.这个案例跟MyCat的区别是文件名是写死的,并不是动态的*/
public class FileSystemAPIDemo {
public static void main(String[] args) {
try {
Configuration conf=new Configuration();
conf.set("fs.defaultFS", "hdfs://master:8020");
FileSystem fs=FileSystem.get(conf);
//create a new file path Path newFile= new Path("hdfs://master:8020/user/root/new.txt");
//delete it if exist if(fs.exists(newFile)) {
fs.delete(newFile,false);
}
//create newFile in HDFS, and it includes path info FSDataOutputStream out=fs.create(newFile);
out.writeUTF("Hello World!");
out.close();
//read newFile in HDFS, and it includes path info FSDataInputStream in=fs.open(newFile);
String info=in.readUTF();
System.out.println(info);
fs.close();
} catch (Exception e) {
System.err.println(e);
}finally{
System.out.println("Finally!");
}
}
}
当直接保存代码,并且把中文注释全部删掉,上传到Linux下,javac命令会没法编译通过
下面通过hadoop jar方式来调用,前面生成jar文件的步骤同上,此处省略:
********************HDFS输入及输出流使用hadoop执行*******************