这节我们来学习如何将Hadoop与Java相结合进行开发,这也是大家学习大数据最后打交道最多的内容,毕竟Hadoop环境的搭建虽然复杂,但是一旦搭建好之后我们的任务便是在这个架构的基础上进行java代码的开发。
** 首先我们新建一个java工程,这个java工程所使用的JRE要与我们在Hadoop环境所使用的版本一致,避免一些不必要的错误。由于我在搭建Hadoop环境时用的是jdk1.7,因此,我新建的java工程所用的JRE版本也是1.7,如下图所示,我们刚建完工程是只有src和JRE System Library。**
** 为了让java和hadoop相结合,肯定要导入hadoop相关的Jar包,为了很好的管理这些jar包,避免jar包直接显示在hadoop01目录下,那样看着很乱,不舒服。我们需要新建一个User Library。操作步骤是:点击Window-------->Preferences就会弹出如下对话框,我们在对话框的搜索框中输入user library,便会出现如下图所示的内容,我们再点击一下左边红色圈住的User Libraries,就会出现右边的内容,让你新建User Library。**
** 我们点击上图中右侧的New按钮,就会弹出如下图所示的对话框,由于我们要将java与hadoop相结合,因此我在name输入框中输入了hadoopJar,当然,你可以随意起一个你自己喜欢的名字,需要注意的是,蓝色标注的那一行的复选框不要勾选,否则工程就把我们引入的包当成系统包来处理了。输入完名字之后点击OK。**
** 点击Ok后我们会看到User Libraries里面多了一个hadoopJar的Library,我们接下来便要向这个Library里面添加jar包了,我们点击“Add External JARs...”,会弹出文件对话框,让你选择导入的jar。**
** 在说选择jar目录前我们先说一下我们需要的jar包,我们将下载好的hadoop-2.2.0.tar.gz(如果不知道怎么下载请参考第三课:http://blog.csdn.net/u012453843/article/details/52431742进行下载)解压,解压后就出现如下图所示的hadoop-2.2.0文件夹。**
** 我们接着说我们需要哪些jar包,刚开始开发,就多引入了些jar包,如下图所示,先导入了hadoop--->common目录下的jar包,选中那三个jar包之后,点击下面的“打开”即可。**
** 我们接着再导入hadoop----->common----->lib目录下的jar包,如下图所示。**
** 我们接着再导入hdfs目录下的jar包,如下图所示。**
** 包都导完之后,我们点击下图中的OK按钮。**
** 创建完hadoopJar之后,我们需要将它引入到工程中来,我们点击工程名------->右键,在下拉菜单中鼠标放到Build path上-------->会出现Configure Build path...,我们点击这个Configure Build path...。在弹出的对话框中我们点击Add Library,然后又弹出一个对话框,我们点击User Library,然后点击Next,如下图所示。**
** 点击Next后会进入到如下图所示界面,我们勾选上hadoopJar,并且点击下面的Finish。然后我们再点击Java Build Path那个页面的OK。这样hadoopJar这个Library便被我们成功引入到工程中去了。**
** 引入hadoopJar这个User Library后,我们再来看看工程目录,如下图所示,发现确实多了一个Library。**
** 前面说了这么多东西都是为Java和Hadoop结合做准备的,下面我们正式进入主题。我们新建一个类,叫HDFSDemo1,如下图所示,我们先来测试一下从HDFS上下载的功能。我们在HDFS系统的根目录下有一个jdk1.7的文件,我们现在想把它下载到本地D://Hadoop目录下。下面代码中,IOUtils的第三个参数值4096是很多大师级人物在写文件读取时常用的值(4k),第四个参数true的意思是文件写完后返回true。**
** 在执行上面的代码之前,我们先看看D盘Hadoop目录下是否有jdk1.7这样的文件,如下图所示,我们发现并没有jdk1.7这样的文件。 **
** 接下来我们开始执行上面那段代码,执行完之后,我们再来看一看D盘Hadoop目录下是否多了一个jdk1.7的文件,如下图所示,我们发现确实多了一个jdk1.7的文件!**
说明我们Java和Hadoop结合的第一个小功能成功了!!
** 接下来我们再测试一下上传的功能,我们用Junit来进行测试,由于不论上传还是下载,fs都是必须用到的,FileSystem是一个抽象类,因此我们在使用之前需要先创建它的实现类,我们干脆把fs的获取放到@Before中去处理**
即在执行@Test方法之前先执行@Before,这样fs就可以先加载好了。红色部分是我们测试上传所需要的所有代码,我们执行testUpload,发现会报一个错误。
** 我们来看看报的错误信息,从描述中我们不难看出这是连接被拒绝的意思,也就是说我们缺乏写权限。**
** 既然我们没有root权限,我们不妨先来伪装一下root,让HDFS认为我就是root用户,伪装的方法是在加载fs的时候增加一个用户的参数"root"。添加完之后我们再来运行testUpload方法,发现运行成功了!这里值得说明的是,这种方式来操作HDFS显然是不好的,因为任何人都可以伪装成root来对HDFS进行写操作,很有可能出现恶意攻击。**
** 既然运行成功了,我们赶紧来看看HDFS的根目录下是否有我们刚才上传上去的文件。我们选择以浏览器的方式来查看HDFS根目录下的文件,我们发现根目录下确实多了一个FileZilla.exe的文件,说明我们上传成功了!**
** 接下来我们再尝试一下删除HDFS系统上的文件,如下图所示,我们试着把HDFS系统根目录下的jdk1.7文件给删除掉,运行后发现返回的值是true,说明我们删除成功!**
** 删除了文件,我们再来新建文件夹,执行完该方法后,到浏览器中查看HDFS的根目录,发现确实多了itcast001这个文件夹。**
** 我们接下来测试删除一个有子文件的文件夹,现在HDFS系统根目录下有itcast001这个文件,我们再向这个文件下上传一个文件,比如我们把root根目录下的install.log文件上传到了HDFS系统的根目录下,如下图所示,我们上传成功。**
** 既然上传成功了,那么此时HDFS系统的根目录下的itcast001文件便有子文件了,那么我们尝试删除掉它。这会儿我们一定要注意的是fs.delete方法的第二个参数必须是true才行,否则会报错,提示文件夹有子文件。**
** 删除完之后我们查看以下HDFS系统根目录下是否还有itcast001这个文件夹了,如下图所示,我们发现已经没有itcast001这个文件夹了,说明我们删除成功!**