Hadoop full distributed clusterのステップを構築します.

11824 ワード

前言:
 今日はhadoop in actionのchapter 2.3を勉強しました.そこでfull distributed hadoop clusterを作りたいです.本のようにしてきましたが、問題が山積みになりました.最後に一つの問題の解決のもとで成功しました.後から来る同仁を防止するために、回り道をして、ここで措置と相応する注意事項を記録しておきます.
ここで、このブログの作者に感謝します.http://blog.csdn.net/a15039096218/article/details/7832152成果をありがとうございます.間違いの原因を見つけました.
環境: 
JDK 1.6.0_30
Hadoop:1.2.1
1 設定ファイル
A)xml設定
本のデフォルトの配置ファイルを使えばいいです.自分のnamenodeマシンのhostnameによって設定ファイルを変更します.木の上のものをコピーして適当に直したほうがいいです.最初から自分で書きます.
core-site.xml
<?xml version=”1.0”?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<property>
		<name>fs.default.name</name>
		<value>hdfs://master:9000</value>
		<description>The name of the default file system. A URI whose
			scheme and authority determine the FileSystem implementation.
		</description>
	</property>
</configuration>
hdfs-site.xml
<?xml version=”1.0”?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<property>
		<name>dfs.replication</name>
		<value>3</value>
		<description>The actual number of replications can be specified when the
			file is created.</description>
	</property>
</configuration>
mapred-site.xml
<?xml version=”1.0”?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<property>
		<name>mapred.job.tracker</name>
		<value>master:9001</value>
		<description>The host and port that the MapReduce job tracker runs at.
		</description>
	</property>
</configuration>
B) マスター、slaavesファイル
masters:second name nodeのhostnameを入れます.
slaaves:data nodeのhostnameを入れます.
2 ssh及びhostnameに関する準備
A)ssh無料登録設定:
    「hadoop in action」の設定を使って、基本的には問題がないです.問題があれば、チェックします.sshフォルダchmod 700、authorizdkeys chmod 600;
    name nodeマシンを創立して各ノードの登録を免除します.
B)hostnameの準備
     各ノードには、自分とname nodeのhostnameに対応するipを配置する. /etc/hostsファイルに配置する.
     例えば、hadoop 1ノードipは192.16.1.101であり、master ipは192.16.1.100である.hadoop 1ノードに配置する必要があります.
      192.16.1.100マスター
      192.16.1.11 hadoop 1
    二つのマッピング
   マスターノードには、ホームnameを各ノードのipマップに配置します.
   配置がよくなければ、エラーを出しやすいです.
C)iptablesは9000ポートを展開する.
    9000ポートを展開する配置規則を追加します.
     iptables-I INPUT 1-p tcp-m state--state NEW-m tcp--dport 9000-j ACCEPT
     service iptables save
     もちろん、簡単で乱暴な方法を使ってもいいです.service iptables stopまたはiptables-Fはiptablesを一時的に無効にします.
    この段階でやっていないと、エラーを出しやすいです.
    この時マスターのname nodeプロセスとjob trackerプロセスは起動に成功しましたが、すべてのslaaveノードのdatanodeとtasktrackerプロセスは成功しました.
3 namendoe-format
   前の二歩が完成したら、覚えてください.HOME/bin hadoop namenode-formatは、このステップを忘れたらエラーを報告します.
4 start-all.sh
    三歩前に完成したら、$HADOOP_を使用できます.HOME/bin start-all.shが起動し、各ノードが対応するプロセスがあるかどうかを確認すればいいです.
よくあるエラー
エラー1:Does not contain a valid host:port authority:file://
ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.lang.IllegalArgumentException: Does not contain a valid host:port authority: file:///
        at org.apache.hadoop.net.NetUtils.createSocketAddr(NetUtils.java:164)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.getAddress(NameNode.java:212)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.getAddress(NameNode.java:244)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:280)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:569)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1479)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1488)
エラーの原因:配置ファイルにあって、自分で手書きする時は「property」属性が少なくなりました.この問題があったら、プロファイルの属性が正しいか確認してください.
エラー2:org.apache.hadoop.hdfs.server.datanode.DataNode:java.net.Uniknown HostException
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.net.UnknownHostException: hadoop1: hadoop1
        at java.net.InetAddress.getLocalHost(InetAddress.java:1360)
        at org.apache.hadoop.security.SecurityUtil.getLocalHostName(SecurityUtil.java:271)
        at org.apache.hadoop.security.SecurityUtil.login(SecurityUtil.java:289)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:313)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1712)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1651)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1669)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1795)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1812)
にこのエラーが発生すると、対応するノードのhostnameが対応するipアドレスをマッピングしていないので、マッピングを修正すれば良い.
エラー3: NoRouteToHost Exception:No route to host
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to hadoop1/192.168.1.101:9000 failed on local exception: java.net.NoRouteToHostException: No route to host
        at org.apache.hadoop.ipc.Client.wrapException(Client.java:1150)
        at org.apache.hadoop.ipc.Client.call(Client.java:1118)
        at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:229)
        at $Proxy5.getProtocolVersion(Unknown Source)
        at org.apache.hadoop.ipc.RPC.checkVersion(RPC.java:422)
        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:414)
        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:392)
        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:374)
        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:453)
        at org.apache.hadoop.ipc.RPC.waitForProxy(RPC.java:335)
        at org.apache.hadoop.ipc.RPC.waitForProxy(RPC.java:300)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:385)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:321)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1712)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1651)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1669)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1795)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1812)
Caused by: java.net.NoRouteToHostException: No route to host
        at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
        at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
        at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
        at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:511)
        at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:481)
        at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:457)
        at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:583)
        at org.apache.hadoop.ipc.Client$Connection.access$2200(Client.java:205)
        at org.apache.hadoop.ipc.Client.getConnection(Client.java:1249)
        at org.apache.hadoop.ipc.Client.call(Client.java:1093)
        ... 16 more
これは一般的にdatanodeに現れて、この異常が発生しました.理由はmasterの9000ポートにアクセスできないことです.原因はiptablesファイアウォールでブロックされたり、masterのnamenodeが起動できなかったりします.
エラー4: org.apache.hadoop.hdfs.server.namenode.FSS Namesystem:FSS Namesystem initialization failed.
ERROR org.apache.hadoop.hdfs.server.namenode.FSNamesystem: FSNamesystem initialization failed.
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-lscm/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
        at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:304)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:104)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:427)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:395)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:299)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:569)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1479)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1488)
2014-07-10 18:50:59,385 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-lscm/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
        at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:304)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:104)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:427)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:395)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:299)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:569)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1479)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1488)
このエラーを報告したのは、namenodeがフォーマットされていないからです.HOME/bin hadoop namenode-formatフォーマットで結構です.
エラー5:Incomppatible namespaceIDs in/tmp/hadoop-lscm/dfs/data:namenode namespaceID=1585693735;datanode namespaceID=1804912251       
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /tmp/hadoop-lscm/dfs/data: namenode namespaceID = 1585693735; datanode namespaceID = 1804912251
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:232)
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:147)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:414)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:321)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1712)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1651)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1669)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1795)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1812)
理由:
Your Hadoop namespaceID became corupted.Unfortunally the easure st thing to do reformat the HFS.
ソリューション:
You need to do something like this:
bin/stop-all.sh 
rm -Rf /tmp/hadoop-your-username/* 
bin/hadoop namenode -format
データを削除する時は、すべてのデータノードのデータを削除してください.
参考記事:
hadoop起動エラーのまとめ http://blog.csdn.net/a15039096218/article/details/7832152
Hadoop初体験——問題のまとめ  http://www.cnblogs.com/hustcat/archive/2010/06/30/1768506.html