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, 最好不要超过物理内存)


         截图如下:



                          

hadoop下hdfs服务拒绝链接 hadoop fs -ls拒绝连接_hadoop下hdfs服务拒绝链接



(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