设为首页 收藏本站
查看: 1130|回复: 0

[经验分享] Hadoop学习笔记(5) ——编写HelloWorld(2)

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-7-11 08:26:10 | 显示全部楼层 |阅读模式
  Hadoop学习笔记(5)
   ——编写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函数:
  public static void main(String[] args) {
  
  }
  也可以在添加类时,勾选上创建main,则会自动添加上。
  在Main函数中添加以下内容:
  try {
   Configuration conf = new Configuration();
   conf.set("fs.default.name", "hdfs://localhost:9000");
  
   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();
  }
  直接添加进来会报错,然后需要添加一些引用才行:
  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:
DSC0000.png
  然后,每个类下都建一个main函数,内容打印类名:
      public static void main(String[] args) {
   System.out.println(ch1.class.getName());
  }
  注意,复制到ch2 ch3中后要改一下里面的类名。
  
  然后每当你切换到一个新的类代码中,点击运行,都会提示Run As ,都选Java Application。 然后就可以看到结果了,每个类都可以作为入口执行。
  OK,程序好了,如何发布呢,或如何从命令行运行呢?
  我们进入目录先看一下:
DSC0001.png
  进入工程目录,可以看到有src和bin,进入bin,就可以看到一个个的class文件了,的确跟前面描述一样,目录与代码相同结构。
DSC0002.png
  输入java ch1 就可以看到结果了。执行ch3时,注意中间不是斜线,而是点,因为这里输入的是命名空间+类名,而不是class文件的路径。
  如果不在这个目录执行,看到会报错,或命名空间输错了,也是这个错。
DSC0003.png
  
  如果我就在这里想执行呢? 可以这样:
DSC0004.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
DSC0005.png
   同样,输入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 //运行我们写的程序
然后就可以看到与之前一样的结果了。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85344-1-1.html 上篇帖子: hadoop集群默认配置和常用配置 下篇帖子: Hadoop的本地库(Native Libraries)介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表