在NFS上安装Hadoop

时间:2013-04-17 08:33:22

标签: hadoop

首先,我安装了Hadoop(0.15.2)并设置了3个节点的集群:NameNode,DataNode和JobTracker各一个。所有守护进程都已启动并运行。但是当我发出任何命令时,我得到了上述错误。例如,当我执行copyFromLocal时,我收到以下错误:

我错过了什么吗?

更多细节: 我正在尝试在NFS文件系统上安装Hadoop。我已经安装了1.0.4版本并尝试运行它但无济于事。 1.0.4版本不启动datanode。并且datanode的日志文件为空。因此我切换回0.15版本,至少启动了所有守护进程。

我认为问题是由于底层的NFS文件系统,即使用相同文件和文件夹的所有数据节点和主机。但我不确定是否真的如此。 但我没有看到任何原因导致我无法在NFS上运行Hadoop(在适当设置配置参数之后)。

目前我正在尝试并确定是否可以根据各个计算机名称为不同的计算机设置不同的名称和数据目录。

配置文件:(hadoop-site.xml)

 <property>
 <name>fs.default.name</name>
 <value>mumble-12.cs.wisc.edu:9001</value>
 </property>
 <property>
 <name>mapred.job.tracker</name>
 <value>mumble-13.cs.wisc.edu:9001</value>
 </property>
 <property>
 <name>dfs.replication</name>
 <value>1</value>
 </property>
 <property>
 <name>dfs.secondary.info.port</name>
 <value>9002</value>
 </property>
 <property>
 <name>dfs.info.port</name>
 <value>9003</value>
 </property>
 <property>
 <name>mapred.job.tracker.info.port</name>
 <value>9004</value>
 </property>
 <property>
 <name>tasktracker.http.port</name>
 <value>9005</value>
 </property>

使用Hadoop 1.0.4时出错(DataNode无法启动):

2013-04-22 18:50:50,438 INFO org.apache.hadoop.ipc.Server: IPC Server handler 7 on     9001, call addBlock(/tmp/hadoop-akshar/mapred/system/jobtracker.info, DFSClient_502734479, null) from 128.105.112.13:37204: error: java.io.IOException: File /tmp/hadoop-akshar/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1
java.io.IOException: File /tmp/hadoop-akshar/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1

使用Hadoop 0.15.2时出错:

[akshar@mumble-12] (38)$ bin/hadoop fs -copyFromLocal lib/junit-3.8.1.LICENSE.txt input

13/04/17 03:22:11 WARN fs.DFSClient: Error while writing.
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:189)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.net.SocketInputStream.read(SocketInputStream.java:203)
    at java.io.DataInputStream.readShort(DataInputStream.java:312)
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.endBlock(DFSClient.java:1660)
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.close(DFSClient.java:1733)
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:49)
    at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:64)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:55)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:83)
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:140)
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:826)
    at org.apache.hadoop.fs.FsShell.copyFromLocal(FsShell.java:120)
    at org.apache.hadoop.fs.FsShell.run(FsShell.java:1360)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
    at org.apache.hadoop.fs.FsShell.main(FsShell.java:1478)
13/04/17 03:22:12 WARN fs.DFSClient: Error while writing.
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:189)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.net.SocketInputStream.read(SocketInputStream.java:203)
    at java.io.DataInputStream.readShort(DataInputStream.java:312)
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.endBlock(DFSClient.java:1660)
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.close(DFSClient.java:1733)
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:49)
    at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:64)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:55)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:83)
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:140)
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:826)
    at org.apache.hadoop.fs.FsShell.copyFromLocal(FsShell.java:120)
    at org.apache.hadoop.fs.FsShell.run(FsShell.java:1360)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
    at org.apache.hadoop.fs.FsShell.main(FsShell.java:1478)
13/04/17 03:22:12 WARN fs.DFSClient: Error while writing.
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:189)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.net.SocketInputStream.read(SocketInputStream.java:203)
    at java.io.DataInputStream.readShort(DataInputStream.java:312)
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.endBlock(DFSClient.java:1660)
    at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.close(DFSClient.java:1733)
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:49)
    at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:64)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:55)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:83)
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:140)
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:826)
    at org.apache.hadoop.fs.FsShell.copyFromLocal(FsShell.java:120)
    at org.apache.hadoop.fs.FsShell.run(FsShell.java:1360)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
    at org.apache.hadoop.fs.FsShell.main(FsShell.java:1478)
copyFromLocal: Connection reset

1 个答案:

答案 0 :(得分:0)

我能够使用版本1.1.2让Hadoop在NFS上运行。它可能适用于其他版本,但我无法保证。

如果您有NFS文件系统,那么每个节点都应该有权访问文件系统。 fs.default.name告诉Hadoop要使用的文件系统URI,因此应该指向本地磁盘。我假设您的NFS目录已挂载到/ nfs处的每个节点。

在core-site.xml中,您应该定义:

<property>
  <name>fs.default.name</name>
  <value>file:///</value>
</property>

<property>
  <name>hadoop.tmp.dir</name>
  <value>/nfs/tmp</value>
</property>

在mapred-site.xml中,您应该定义:

<property>
  <name>mapred.job.tracker</name>
  <value>node1:8021</value>
</property>

<property>
  <name>mapred.local.dir</name>
  <value>/tmp/mapred-local</value>
</property>

由于hadoop.tmp.dir指向nfs驱动器,因此mapred.system.dir和mapreduce.jobtracker.staging.root.dir的默认位置指向nfs驱动器上的位置。它可以在保留mapred.local.dir的默认值的情况下运行,但它应该指向本地文件系统,所以为了安全起见,你可以把它放在/ tmp中。

您不必担心hdfs-site.xml。当您启动namenode时使用此配置文件,但是在nfs驱动器上分发所有内容时,您不应运行HDFS。

现在,您可以在jobtracker节点上运行start-mapred.sh并运行hadoop作业。不要运行start-all.sh或start-dfs.sh,因为这些将启动HDFS。如果您运行多个指向同一NFS目录的DataNode,则一个DataNode将锁定该目录,其他DataNode将关闭,因为它们无法获得锁定。

我用以下方法测试了配置:

bin/hadoop jar hadoop-examples-1.1.2.jar wordcount /nfs/data/test.text /nfs/out

请注意,您需要指定输入和输出位置的完整路径。

我也尝试过:

bin/hadoop jar hadoop-examples-1.1.2.jar grep /nfs/data/loremIpsum.txt /nfs/out2 lorem

它给了我与在Standalone中运行它时相同的输出,所以我认为它正在正确执行。

以下是有关fs.default.name的更多信息: http://www.greenplum.com/blog/dive-in/usage-and-quirks-of-fs-default-name-in-hadoop-filesystem