Hadoop教程之编写HelloWorld(2)
前面我们写了一个Hadoop程序,并让它跑起来了。但想想不对啊,Hadoop不是有两块功能么,DFS和MapReduce。没错,上一节我们写了一个MapReduce的HelloWorld程序,那这一节,我们就也学一学DFS程序的编写。
DFS 是什么,之前已经了解过,它是一个分布式文件存储系统。不管是远程或本地的文件系统,其实从接口上讲,应该是一至的,不然很难处理。同时在第2节的最后, 我们列出了很多一些DFS的操作命令,仔细看一下,这些命令其实跟linux中的文件操作命令很相似,所以说,对于分布式文件系统,我们完全可以用本地文 件的方式来理解。
那理一下,一般常用操作有哪些? 当然我们可以从编程角度来:
创建、读、写一个文件,列出文件夹中的文件及文件夹列表,删除文件夹,删除目录,移动文件或文件夹,重命名文件或文件夹。
同样,这里我们就依葫芦画瓢跑起个程序来:
启 动eclipse,新建Hadoop项目,名称MyDFSTest,新建类DFSTest,点击确定,然后同样工程属性Configure BuildPath中把 build/ivy/lib/Hadoop下的所有jar包都引用进来。「这里就不详细截图了,可以参考前一节中的内容」
在类中,添加main函数:
|
1
2
|
public static void main(String[] args) {} |
也可以在添加类时,勾选上创建main,则会自动添加上。
在Main函数中添加以下内容:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
try {Configuration conf = new Configuration();FileSystem hdfs = FileSystem.get(conf);Path path = new Path("in/test3.txt");FSDataOutputStream outputStream = hdfs.create(path);byte[] buffer = " 你好Hello".getBytes();outputStream.write(buffer, 0, buffer.length);outputStream.flush();outputStream.close();System.out.println("Create OK");} catch (IOException e) {e.printStackTrace();} |
直接添加进来会报错,然后需要添加一些引用才行:
|
1
2
3
4
|
import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataOutputStream;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path; |
在没有错误后,点击工具条上的运行, 但这次跟前次不一样,选择Run as Java Application。然后,就可以在输出框中看到Create OK的字样了,表明程序运行成功。
这段代码的意思是在in文件夹下,创建test3.txt,里面的内容是"你好Hello"。 在运行完后,我们可以到eclipse的Project Explorer中查看是否有这文件以及内容。同样也可以用命令行查看$bin/hadoop fs -ls in。
好了,第一个操作DFS的程序跑起来了,那其它功能只要套上相应的处理类就可以了。
为了方便查找操作,我们列举了张表:
|
操作说明 |
操作本地文件 |
操作DFS文件 |
|
主要命名空间 |
java.io.File java.io.FileInputStream java.io.FileOutputStream |
org.apache.hadoop.conf.Configuration org.apache.hadoop.fs.FileSystem org.apache.hadoop.fs.Path org.apache.hadoop.fs.FSDataInputStream; org.apache.hadoop.fs.FSDataOutputStream |
|
初使化对象 |
new File(路径); |
Configuration FileSystem hdfs |
|
创建文件 |
File.createNewFile(); |
FSDataOutputStream = hdfs.create(path) FSDataOutputStream.write( buffer, 0, buffer.length); |
|
创建文件夹 |
File.mkdir() |
hdfs.mkdirs(Path); |
|
读文件 |
new FileInputStream(); FileInputStream.read(buffer) |
FSDataInputStream = hdfs.open(path); FSDataInputStream.read(buffer); |
|
写文件 |
FileOutputStream.write( buffer, 0, buffer.length); |
FSDataOutputStream = hdfs.append(path) FSDataOutputStream.write( buffer, 0, buffer.length); |
|
删除文件(夹) |
File.delete() |
FileSystem.delete(Path) |
|
列出文件夹内容 |
File.list(); |
FileSystem.listStatus() |
|
重命令文件(夹) |
File.renameTo(File) |
FileSystem.rename(Path, Path) |
有了这张表,以后不怕了,代码搬搬即可。
接下来换个话题。
本人主要从事.net开发的,所以对于java上,还是有点生。所以接下来半章中,简要的把JAVA的学习列一列。
JAVA和.net现在从语言角度看,的确有很多相似之处。但也有不同之处,这就是我们要学的。
在.Net中,主要有dll和exe, dll为类库, exe为可执行程序,在exe中有唯一的main函数,作为函数入口。dll 类库是无法执行的,exe可以双击运行,也可以命令行执行。编译后,.net会把所有定义的类编译进exe或dll中,一个工程产出文件就是一个。
在JAVA中,jar 对应的类库,可以被别人调用。exe就不存在了。一个工程编译后,产出物是一堆的.class文件,在开发中每一个定义的类,都会被编译成这 个.class文件。而且一个.java文件中,不能定义多个顶级类(嵌套类是可以的),且文件名与类名必须相同,文件所以的目录必须和命名空间相同。所 以编译后,可以讲一个.java文件将会编译成一个.class文件,且有与原先的目录相同。
也就是说,java有点像散装的一样,产物就是一堆的.class文件。 那jar文件呢,简单的说,就是一个zip包,把一堆的.class文件打包成一个压缩包。
同时,一个工程中,支持多个main函数,即多个入口。
说了一堆,还不如实践一下:
在eclipse中,创建一个JAVA project 取名为JAVAStudy。
然后创建两个类,没有目录的,ch1 ch2 再创建一个包叫pkg1,在这个包下创建一个类ch3:

然后,每个类下都建一个main函数,内容打印类名:
|
1
2
3
|
public static void main(String[] args) {System.out.println(ch1.class.getName());} |
注意,复制到ch2 ch3中后要改一下里面的类名。
然后每当你切换到一个新的类代码中,点击运行,都会提示Run As ,都选Java Application。 然后就可以看到结果了,每个类都可以作为入口执行。
OK,程序好了,如何发布呢,或如何从命令行运行呢?
我们进入目录先看一下:

进入工程目录,可以看到有src和bin,进入bin,就可以看到一个个的class文件了,的确跟前面描述一样,目录与代码相同结构。

输入java ch1 就可以看到结果了。执行ch3时,注意中间不是斜线,而是点,因为这里输入的是命名空间+类名,而不是class文件的路径。
如果不在这个目录执行,看到会报错,或命名空间输错了,也是这个错。

如果我就在这里想执行呢? 可以这样:
.png)
利用classpath指定class的路径。
如何打成jar包:
进入bin目录:
$cd bin
$jar cvf test.jar ch1.class ch2.class pkg1/.class
然后在bin目录下就可以看到test.jar文件了。
如何执行jar呢,为了防止与里面的class文件冲突,我们将test.jar复制到外面来:
$cp test.jar ../
$cd ..
再执行:
$java –classpath test.jar ch1

同样,输入classpath就可以搞定了的。
了解了这些后,我们又可以做个试验证了。 第一章中我们运行hadoop中Helloword时,是调用了example的jar包。所以这里我们可以把上一章的程序也来打个jar包,试下是否能运行:
$cd ~/workspace/MyHelloWorld //进入HelloWorld代码目录
$cd bin
$jar cvf test.jar *.class //打上jar包
$cp test.jar ../../hadoop-0.20.2 //将jar包复制到hadoop目录下
$cd ../../hadoop-0.20.2
$bin/start-all.sh //启动hadoop
$bin/hadoop test.jar WordCount in out //运行我们写的程序
然后就可以看到与之前一样的结果了。
Hadoop教程之编写HelloWorld(2)的更多相关文章
- typecho插件编写教程1 - 从HelloWorld说起
typecho插件编写教程1 - 从HelloWorld说起 老高 187 5月25日 发布 推荐 0 推荐 收藏 2 收藏,189 浏览 最近老高正在编写一个关于typecho的插件,由于typec ...
- Hadoop学习笔记(5) ——编写HelloWorld(2)
Hadoop学习笔记(5) ——编写HelloWorld(2) 前面我们写了一个Hadoop程序,并让它跑起来了.但想想不对啊,Hadoop不是有两块功能么,DFS和MapReduce.没错,上一节我 ...
- 在 Windows 上安装 Hadoop 教程(转)
在 Windows 上安装 Hadoop 教程 一见 2010.1.6 www.hadoopor.com/hadoopor@foxmail.com 1. 安装 JDK 不建议只安装 JRE,而是建议直 ...
- Hadoop教程(一)
英文原文:cloudera,编译:ImportNew – Royce Wong Hadoop从这里开始!和我一起学习下使用Hadoop的基本知识,下文将以Hadoop Tutorial为主体带大家走一 ...
- 微信iOS消息拦截插件教程-Tweak HelloWorld
微信iOS消息拦截插件教程-Tweak HelloWorld 标签(空格分隔): 越狱开发教程 1.环境准备 准备一台越狱的手机,具体参照上一篇教程 搭建Theos越狱开发环境 2.开发过程 新建一个 ...
- 开天辟地-用visualstudio2010编写helloworld
安装好visual之后,创建新项目 向源文件添加helloworld.cpp 编写helloworld代码,编译运行即可 在运行时候出现一个错误,错误和解决方法如下:
- Hadoop教程(五)Hadoop分布式集群部署安装
Hadoop教程(五)Hadoop分布式集群部署安装 1 Hadoop分布式集群部署安装 在hadoop2.0中通常由两个NameNode组成,一个处于active状态,还有一个处于standby状态 ...
- Hadoop生态圈-hive编写自定义函数
Hadoop生态圈-hive编写自定义函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- iOS Sprite Kit教程之编写程序以及Xcode的介绍
iOS Sprite Kit教程之编写程序以及Xcode的介绍 Xcode界面介绍 一个Xcode项目由很多的文件组成,例如代码文件.资源文件等.Xcode会帮助开发者对这些文件进行管理.所以,Xco ...
随机推荐
- spring mvc官网下最新jar搭建框架-静态资源访问处理-注解-自动扫描
1.从官网下载spring相关jar http://spring.io/projects 点击SPRING FRAMEWORK
- 四则运算之C++版
一.设计思想 之前的版本是用Java语言实现的,在这次的练习中,我用C++语言将其功能逐一实现,其实C++与Java有很多相似之处,只是一些书写格式不同,思路还是一样的. 二.源代码 #include ...
- WEB 容器、WEB服务和应用服务器的区别与联系
Web容器: 何为容器? 容器是一种服务调用规范框架,j2ee大量运用了容器和组件技术来构建分层的企业级应用,在J2EE规范中,相应的有Web Container和EJB Containe ...
- 一个Linq
public class CalendaerCollectItem { public int ID { get; set; } public string Name { get; set; } pub ...
- Jenkins-测试自动化(实例1-RF)
1. Jenkins新建任务列表:RF测试 2. 对任务进行配置: 源码管理:None 构建:Execute Windows batch command (下图中的脚本是robotframework ...
- UVALive - 6952 Cent Savings dp
题目链接: http://acm.hust.edu.cn/vjudge/problem/116998 Cent Savings Time Limit: 3000MS 问题描述 To host a re ...
- 临时文档9--dfs
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> usi ...
- C# Redis
概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string( ...
- 版本控制 - Git
此篇blog只是对http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 研读后的总结,还 ...
- 数据类型的处理(提取自FMDB)
if ((!obj) || ((NSNull *)obj == [NSNull null])) { sqlite3_bind_null(pStmt, idx); } // FIXME - someda ...