23

CDH4 用の Cloudera の Hadoop Demo VM (Hadoop 2.0.0 を実行) をダウンロードして起動しました。Windows 7 マシン (VM が実行されているのと同じマシン/OS) から実行される Java プログラムを作成しようとしています。次のようなサンプルプログラムがあります。

public static void main(String[] args) {
    try{
        Configuration conf = new Configuration();
        conf.addResource("config.xml");
        FileSystem fs = FileSystem.get(conf);
        FSDataOutputStream fdos=fs.create(new Path("/testing/file01.txt"), true);
        fdos.writeBytes("Test text for the txt file");
        fdos.flush();
        fdos.close();
        fs.close();
    }catch(Exception e){
        e.printStackTrace();
    }

}

私の config.xml ファイルには、fs.default.name=hdfs://CDH4_IP:8020 というプロパティしか定義されていません。

実行すると、次の例外が発生します。

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /testing/file01.txt could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
    at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1322)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2170)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:471)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:297)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44080)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:898)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1693)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1689)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1687)
    at org.apache.hadoop.ipc.Client.call(Client.java:1160)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:202)
    at $Proxy9.addBlock(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:164)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:83)
    at $Proxy9.addBlock(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:290)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1150)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1003)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:463)

私はインターネットを見回しましたが、これはディスク容量が少ないときに発生するようですが、「hdfs dfsadmin -report」を実行すると、次のようになります。

Configured Capacity: 25197727744 (23.47 GB)
Present Capacity: 21771988992 (20.28 GB)
DFS Remaining: 21770715136 (20.28 GB)
DFS Used: 1273856 (1.21 MB)
DFS Used%: 0.01%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)

Live datanodes:
Name: 127.0.0.1:50010 (localhost.localdomain)
Hostname: localhost.localdomain
Decommission Status : Normal
Configured Capacity: 25197727744 (23.47 GB)
DFS Used: 1273856 (1.21 MB)
Non DFS Used: 3425738752 (3.19 GB)
DFS Remaining: 21770715136 (20.28 GB)
DFS Used%: 0.01%
DFS Remaining%: 86.4%
Last contact: Fri Jan 11 17:30:56 EST 201323 EST 2013

VM からこのコードを問題なく実行することもできます。問題が何であるか、またはそれを修正する方法がわかりません。Hadoop を使用するのはこれが初めてなので、おそらく基本的なものが欠けています。何か案は?

アップデート

ログに表示される唯一のものは、クライアントでの get に似た例外です。

java.io.IOException: File /testing/file01.txt could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
    at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1322)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2170)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:471)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:297)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44080)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:898)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1693)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1689)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1687)

データ ディレクトリ (/var/lib/hadoop-hdfs/cache/hdfs/dfs/data) のアクセス許可を変更しようとしましたが、修正されませんでした (全員にフル アクセスを許可するところまで行きました)。

HUE Web アプリを介して HDFS を参照しているときに、フォルダー構造が作成され、ファイルは存在するが空であることがわかります。を使用して、デフォルトのユーザーディレクトリの下にファイルを配置しようとしました

FSDataOutputStream fdos=fs.create(new Path("testing/file04.txt"), true); 

それ以外の

FSDataOutputStream fdos=fs.create(new Path("/testing/file04.txt"), true);

これにより、ファイルパスが「/user/dharris/testing/file04.txt」になります(「dharris」は私のWindowsユーザーです)。しかし、それは私に同じ種類のエラーを与えました。

4

11 に答える 11

3

Linux VM に移動し、ホスト名と IP アドレスを確認します (ifconfig コマンドを使用)。次に、Linux vm で /etc/host ファイルを次のように編集します。

IPADDRESS (SPALCE) ホスト名

例: 192.168.110.27 clouderavm

すべてのhadoop構成ファイルを次のように変更します

core-site.xml

hdfs-site.xml

mapred-site.xml

ヤーンサイト.xml

localhost または localhost.localdomain または 0.0.0.0ホスト名に変更します

その後、cloudera マネージャーを再起動します。

Windows マシンでC:\Windows\System32\Drivers\etc\hosts を編集します。

で最後に1行追加

VM マシンの IP とホスト名 (VM の /etc/host ファイルで行ったのと同じ)

VMIPADDRESS VMHOSTNAME

例 :

192.168.110.27 clouderavm

今すぐチェックしてください。動作するはずです。詳細な構成チェックについては、you tube のビデオに従ってください。

https://www.youtube.com/watch?v=fSGpYHjGIRY

于 2015-12-02T07:34:03.493 に答える
2

指定されたプロパティを追加hdfs-site.xml

<property>
   <name>dfs.replication</name>
   <value>1</value>
 </property>

このファイルをプログラムにも追加します

conf.addResource("hdfs-site.xml");

Hadoop を停止する

stop-all.sh

それから始めます

start-all.sh
于 2015-07-29T06:28:55.127 に答える
0

FSに問題があるようです。cross-site.xml のパラメーターが、読み取ろうとしているファイルと一致していないかのいずれかです。

また

パスにいくつかの一般的な不一致があります(WINDOWS参照があることがわかります)。

cygwin ツールを使用してパスを設定し、データノードと一時ファイルの場所が配置されている場所に配置することができます。

私によると、 PSレプリケーションはここでの主要な問題ではないようです

于 2015-08-10T05:13:57.537 に答える
0

同様の問題がありました。私の場合、次のフォルダーを空にしました${hadoop.tmp.dir}/nm-local-dir/usercache/{{hdfs_user}}/appcache/

于 2015-01-08T14:20:24.337 に答える
0

Hadoop 構成では、デフォルトのレプリケーションは 3 に設定されています。一度確認して、要件に応じて変更してください。

于 2013-03-14T09:52:34.387 に答える
0

HDFS でファイルを作成する方法は次のとおりです。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

FileSystem hdfs = FileSystem.get(context.getConfiguration());
Path outFile=new Path("/path to store the output file");

String line1=null;

if (!hdfs.exists(outFile)){
            OutputStream out = hdfs.create(outFile);
            BufferedWriter br = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
            br.write("whatever data"+"\n");
            br.close();
            hdfs.close();
        }
else{
            String line2=null;
            BufferedReader br1 = new BufferedReader(new InputStreamReader(hdfs.open(outFile)));
            while((line2=br1.readLine())!=null){
                line1=line1.concat(line2)+"\n";
            }
            br1.close();
            hdfs.delete(outFile, true);
            OutputStream out = hdfs.create(outFile);
            BufferedWriter br2 = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
            br2.write(line1+"new data"+"\n");
            br2.close();
            hdfs.close();
        }
于 2015-10-12T06:45:30.563 に答える
0

エラーメッセージから、レプリケーション係数は問題ないようです ie1. データノードが正常に機能しているか、権限に問題があるようです。パーミッションを確認し、hadoop を実行しようとしているユーザーから datanode のステータスを確認します。

于 2013-07-30T10:11:16.280 に答える