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

第一个Hadoop程序

[复制链接]

尚未签到

发表于 2015-11-11 13:32:33 | 显示全部楼层 |阅读模式
  最近对海量数据处理的兴趣,正在学习Hadoop,呵呵,这是笔者的第一个hadoop程序,通过这个程序,终于把hadoop程序的编写执行流程搞清楚了!
  首先上代码
  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.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;


public class PutMerge
{
    /**
     * @param args
     */
    public static void main(String[] args) throws IOException
    {
        // TODO Auto-generated method stub
        Configuration conf = new Configuration();
        FileSystem hdfs = FileSystem.get(conf);
        FileSystem local = FileSystem.getLocal(conf);
        
        Path inputDir = new Path(args[0]);
        Path hdfsFile = new Path(args[1]);
        
        try
        {
            FileStatus[] inputFiles = local.listStatus(inputDir);
            FSDataOutputStream out = hdfs.create(hdfsFile);
            
            for(int i = 0; i < inputFiles.length; i&#43;&#43; )
            {
                System.out.println(inputFiles.getPath().getName());
                FSDataInputStream in = local.open(inputFiles.getPath());
                byte buffer[] = new byte[1024];
                int bytesRead = 0;
                while( (bytesRead = in.read(buffer)) > 0)
                {
                    out.write(buffer, 0, bytesRead);
                }
                in.close();
            }
            out.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

}

  运行程序:
  需要在eclipse中设置命令行参数,与java同志失去联系很多年了,eclipse开发环境也很生疏,所以摸索了半天才知道怎么设置命令行参数,呵呵,java小菜。
  Run->Debug Configuration 选择Arguments选项卡,在第一个文本框中设置命令行参数如下:
  /home/dm/workspace/PutMerge/input output/sum.txt

  其中,/home/dm/workspace/PutMerge/input是本地文件系统的绝对路径,指定输入文件在本地文件系统的位置;output/sum.txt是hdfs文件系统的相对路径路径(在hdfs文件系统中他的全路径是/user/dm/output)。
  但是,由于笔者的机器配置了hadoop的伪分布模式,并把hadoop的bin包符号链接在eclipse根目录的jre目录下,所以hadoop在workspace/PutMerge下模拟了hdfs文件系统,eclipse按照java application运行程序,输出结果会保存在当前目录下。这里有一点就是在不删除输出文件的情况下重复运行hadoop程序,不会出现问题,即便jar包在hadoop上跑也是如此,不知是不是因为没有Map-Reduce模式,这个解释不确定,请大牛指教???
  好了,确定程序没有问题了,一切正常,下一步小试牛刀,把程序打成jar包在hadoop上运行
  这里只打包程序文件和打包整个项目都是一样的。
  这里笔者只打包了程序文件:右击PutMerge.java文件,选择Export -> java -> JAR file,然后一路next,直到finish,这样就完成了打包工作;
  当然这是用的Eclipse,如果用命令行编译java程序,可用如下步骤,稍微有点儿繁琐:
  cd /usr/local/hadoop              //hadoop的解压根目录
sudo mkdir putmerge           //在此创建一个目录用来存放程序和生成的jar文件
sudo mkdir putmerge/src     
sudo mkdir putmerge/classes
sudo cp ~/workspace/PutMerge/src/PutMerge.java putmerge/src    //源码拷进
cd putmerge/src
cd ../..
sudo javac -classpath hadoop-core-1.0.1.jar:lib/commons-cli-1.2.jar -d putmerge/classes putmerge/src/PutMerge.java   //编译
sudo jar -cvf putmerge/PutMerge.jar -C putmerge/classes/ .
  上面是两种生成jar文件的方法,下面应该运行程序了
  其实jar包是不需要复制到hdfs上的,但是这两天笔者一直认为需要,惭愧啊!!!  hadoop的jar命令是在本地找jar包的。
  笔者对“文件复制到hdfs”这一过程是这样理解的,文件复制到hdfs的过程其实就是文件分散到各个DataNode的过程,也就是分割文件的过程,毕竟hdfs是一个分布式文件系统,而本机系统不是分布式的。
  dm@cloud:~$ ls
eclipse           PutMerge.jar  workspace    test

  
dm@cloud:~$ ls test/                    #显示测试文件
1.txt  2.txt  3.txt  4.txt
  
dm@cloud:~$ start-all.sh            #启动hadoop
starting namenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-dm-namenode-cloud.out
localhost: starting datanode, logging to /usr/local/hadoop/libexec/../logs/hadoop-dm-datanode-cloud.out
localhost: starting secondarynamenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-dm-secondarynamenode-cloud.out
starting jobtracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-dm-jobtracker-cloud.out
localhost: starting tasktracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-dm-tasktracker-cloud.out
  
dm@cloud:~$ hadoop fs -lsr   #查看当前目录

dm@cloud:~$ hadoop fs -mkdir /user/dm/putmerge    #创建存放数据文件
  
dm@cloud:~$ hadoop fs -lsr     #文件创建成功
drwxr-xr-x   - dm supergroup          0 2012-05-16 00:03 /user/dm/putmerge
  
dm@cloud:~$ hadoop jar PutMerge.jar PutMerge test/ putmerge/output/sum.txt      #执行程序
3.txt
1.txt
2.txt
4.txt
dm@cloud:~$ hadoop fs -lsr        #程序执行后,递归查看当前目录中的文件
drwxr-xr-x   - dm supergroup          0 2012-05-16 00:05 /user/dm/putmerge
drwxr-xr-x   - dm supergroup          0 2012-05-16 00:05 /user/dm/putmerge/output
-rw-r--r--   1 dm supergroup         47 2012-05-16 00:05 /user/dm/putmerge/output/sum.txt
  
dm@cloud:~$ hadoop fs -cat putmerge/output/sum.txt   #检查合成文件sum.txt的内容
Daniel
my name
is Sun
in Xiamen University.
  dm@cloud:~$ stop-all.sh     #关闭hadoop程序
stopping jobtracker
localhost: stopping tasktracker
stopping namenode
localhost: stopping datanode
localhost: stopping secondarynamenode
  
dm@cloud:~$
  

  笔者是hadoop的初学者,处于菜鸟阶段,以上内容是结合这两天学习所写,不乏存在错误或不足,如果大牛看到请指正!!!
  

  声明上面代码是引自《Hadoop实战》(Chuck Lam 著, 韩冀中译人民邮电出版社):37页

         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 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-137930-1-1.html 上篇帖子: Hadoop+Spark+Hbase部署整合篇 下篇帖子: Hadoop单节点环境搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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