2017-02-20 7 views
0

仮想マシンUbuntuで動作するhadoopクラスタからホストマシン(ウィンドウ)からファイルを取得する際に問題があります。私は、ホストマシン(http://192.168.56.105:8088/cluster)、およびJavaスクリプトからクラスタ見るHadoop Virtualbox Cluster上のファイルへのアクセス

は、HDFS上のフォルダ構造を参照してください、私は読んでファイルをしようとすると、私はこのエラーを取得:

org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-1570018429-127.0.0.1-1484660807169:blk_1073742497_1673 file=/Item/part-r-00000 

Iクラスタvmbox上でこの同じスクリプトを実行すると、 ubuntu私はファイルを取得し、正しい。

おそらく問題は、IPアドレスまたはユーザーが異なる場合、別の場所(_1673?)でnamenodeの検索データを試してみることですが、この問題の正しい設定が見つからない可能性があります。

ありがとうございました。

Linuxユーザー:wukkie

これはスクリプトです:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URI; 
import java.net.URISyntaxException; 

import java.security.PrivilegedExceptionAction; 

import org.apache.hadoop.conf.*; 
import org.apache.hadoop.fs.FSDataInputStream; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.security.UserGroupInformation; 

public class InsertReommendationToDB { 

    private static Configuration getConfiguration(){ 
     Configuration conf = new Configuration(); 
     conf.set("fs.defaultFS", "hdfs://192.168.56.105:54310/");  
     conf.set("hadoop.job.ugi", "wukkie"); 
     return conf; 
    } 

    public static void main(String args[]){  
     try { 

      UserGroupInformation ugi = UserGroupInformation.createProxyUser("wukkie", UserGroupInformation.getLoginUser()); 
      ugi.doAs(new PrivilegedExceptionAction<Void>() { 


       Path filepath = new Path("/Item/part-r-00000");    
       public Void run() throws Exception { 

        FileSystem fs = filepath.getFileSystem(getConfiguration()); 

        FSDataInputStream inputStream = fs.open(filepath); 
        String line; 
        line = inputStream.readLine(); 

        while(line != null){ 
         System.out.println(line); 
         line = inputStream.readLine(); 
        } 
        return null; 
       } 

      }); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

答えて

0

私が理由と回避策の解決策を見つけます。その方法で

Hadoopの作業:

  1. アプリケーション要求されたファイルを保存データノード(複数可)に関する情報を送信する - およびデータノードのアドレスを取得する名前ノード
  2. ファイルに関する名前ノードをお願いします。
  3. アプリケーション受信したURLに関するファイルにdatanode(s)を入力してファイルストリームを取得します。

仮想ボックスとホストアーキテクチャの問題。

アドレス/ localhost:50070 /に仮想ボックスhadoopの起動データノード。ホストアプリケーションがファイルに関するnamenodeを要求すると、データノード "localhost:50070"のローカルアドレスを取得します。その結果、アプリケーションは見えないアドレスからファイルを取得しようとします。

回避策ソリューション

1)当社は、VirtualBoxのマシンのアドレスを取得する必要があります(i)は、VirtualBoxの接続設定でホストオンリーaddapter使用しています。 ifconfig | grepのaddrの

私はアドレス192.168.56.104

2を取得)現在のホスト・マシン(Windowsの場合)にリバースプロキシを設定することができます。管理者権限でcmdを起動して入力してください

netsh interface portproxy add v4tov4 listenport=50070 listenaddress=localhost connectport=50070 connectaddress=192.168.56.104 
netsh interface portproxy add v4tov4 listenport=50020 listenaddress=localhost connectport=50020 connectaddress=192.168.56.104 
netsh interface portproxy add v4tov4 listenport=50090 listenaddress=localhost connectport=50090 connectaddress=192.168.56.104 
netsh interface portproxy add v4tov4 listenport=50010 listenaddress=localhost connectport=50010 connectaddress=192.168.56.104 

ホストアプリケーションがデータホストのローカルホスト:50010アドレスを取得すると、クライアントマシンにプロキシされます。

関連する問題