Hadoop开发---经验总结1

来源:互联网 发布:php接口有哪些 编辑:程序博客网 时间:2024/05/12 13:04
2016年5月12日11:04:42
基于MapReduce的非平衡大数据集分类任务总结
作者:数据分析玩家
        本篇博客将详细记录在本次项目当中所遇到的技术问题。
      (1)在eclipse当中通过编程对Hadoop的HDFS进行操作时,总是显示连接不到主机或被主机拒绝连接?
        原因:
        ①linux的防火墙iptables没有关闭,或者关闭之后又自动启动了,而且有的时候我明明通过
             chkconfig iptables off 命令关闭了防火墙的自启动功能但是防火墙后来还是启动了。
        ②HDFS的安全模式没有关闭:通过hadoop dfsadmin   -safemode  stop 关闭安全模式即可
        ③检查Hadoop集群的主机名和IP地址的映射关系在windows的hosts文件中是否进行了添加
      (2)在eclipse当中通过编程对Hadoop的HDFS进行操作时,显示eclipse的

JVM内存不足?

         解决措施:增大对运行程序的内存配置即可

              

-Xms是设置内存初始化的大小(如下面的256m)

              -Xmx是设置最大能够使用内存的大小(如下面的1024m, 最好不要超过物理内存)

         截图如下:
                          
     (3)在linux中通过shell命令运行jar包的时候,显示 

Java heap space,这明显是运行时内存不足的原因,和上述(2)操作  一样,我们只需要修改HDFS的配置文件mapred-site.xml即可,从而增大运行时的内存。

       具体操作:修改配置文件mapred-site.xml增大内存

                          

<property>

                          <name>mapred.child.java.opts</name>

                          <value>-Xmx800m</value>

                   </property>

     (4)在linux中运行hadoop时,有的时候DataNode或者NameNode进程启动不起来?

       常见的解决措施:

         ①检查所有节点的防火墙是否关闭 

           

简述HDFS是否处于安全模式 

         ③在/etc/hosts文件中检查Ip地址与主机名的映射关系

         ④对HDFS中的数据在linux中进行备份,然后删除所有节点的logs文件和tmp文件,之后对NameNode进 行格式化

     (5)之前在eclipse当中编程的时候,本来希望打包运行程序,因为jar包方式的运行速度快于eclipse当中运行的速度,因为在eclipse当中运行程序本身就需要解析主机名与IP地址的映射关系等等,但是由于当时只能从windows当中导入数据,所以只能在eclipse当中运行 程序,现在找到了从HDFS当中导入数据的方式:利用FileSystem这个api即可.

       部分代码展示: 

        public  ArrayList<Instance>  arr1 = new ArrayList<Instance>();    //用于存放70%中的正的数据集 public  ArrayList<Instance>  arr2 = new ArrayList<Instance>();    //用于存放70%中的负的数据集        protected void setup(Context context)throws IOException, InterruptedException    {   //进行资源的初始化工作,将70%的训练样本放到容器当中           FileSystem fileSystem = null;   try  {     fileSystem = FileSystem.get(new URI("hdfs://hadoop80:9000/"), new Configuration());       } catch (Exception e){}  FSDataInputStream fr0 = fileSystem.open(new Path("hdfs://hadoop80:9000/poker70z.txt"));   BufferedReader fr1 = new BufferedReader(new InputStreamReader(fr0));       String str = fr1.readLine();         while(str!=null)         {         Instance instancez = new Instance(str);         arr1.add(instancez);         str = fr1.readLine();         }       FSDataInputStream fr00 = fileSystem.open(new Path("hdfs://hadoop80:9000/poker70f.txt"));    BufferedReader fr2 = new BufferedReader(new InputStreamReader(fr00));      String str2 = fr2.readLine();         while(str2!=null)         {         Instance instancef = new Instance(str2);         arr2.add(instancef);         str2 = fr2.readLine();         }      }</span></strong></span>
     (6)之前在eclipse当中编写程序的时候,如果输出路径事先存在,通过fileSystem这个api可以将其给删掉,但是程序打成jar包之后,这个api还起作用吗?

      答案:fileSystem这个api在shell下运行jar包的时候,仍是起作用的,可以将事先存在的输出路径进行删除。

     (7)之前在eclipse当中编写程序的时候,我们可以通过println这个命令对重要的数据进行输出以供核实,但是当我们在shell下jar包的方式运行程序的时候,println是失效的,此时我们该怎么做?

       解决方法:利用counter计数器替代println的功能  

<span style="font-size:14px;"><strong><span style="font-size:14px;">   protected void cleanup(Context context)throws IOException, InterruptedException   {       Counter counter = context.getCounter("num", "arr3.size");       counter.setValue(arr3.size());       for(int i=0;i<arr3.size();i++)       {           context.write(new Text(arr3.get(i)),NullWritable.get());       }     }</span></strong></span>
    (8)MapReduce中任务的运行情况总结。     

     ①任务job并不会随着客户端的关闭而停止运行,除非ctrl + c 

     ②hadoop  job -list 命令可以查看正在运行的job

    ③hadoop job -kill 任务号可以杀死正在运行的job

                                                                                                                                                2016年5月12日14:05:02


     

0 0
原创粉丝点击