在一台机器上运行多个HDFS实例

HDFS设计为一台电脑上跑一个实例(一个Namenode或Datanode或SecondaryNamenode,在单机模式下可以同时运行三者),但默认不在一个电脑上运行同一角色的多个实例。

HDFS每个角色都占有一定端口和文件,如Namenode的IPC默认端口9000,以及文件镜像目录(默认在/tmp/hadoop-${user.name}/name)等。若直接启动第二个实例,必定会冲突,无法运行。

所以要同时运行多个文件系统,须修改默认配置,从端口和文件分别看:

要修改的端口有:

fs.default.name,Namenode的IPC地址

dfs.namenode.http-address,Namenode的HTTP管理地址

dfs.datanode.address,Datanode传输数据的地址

dfs.datanode.ipc.address,Datenode的IPC地址

若要使用SecondaryNamenode,还要修改dfs.namenode.secondary.http-address

其中fs.default.name在core-site.xml里设置,其他在hdfs-site.xml。

把以上端口改为每个实例独有的,或设置一个分配规则,比如一个区间为一个实例的……这样方便管理。

 

对于文件目录,无论是Namenode、Datanode还是SecondaryNamenode,默认的数据都存放在/tmp下,所以为每个实例分配子目录,就像/tmp/0  /tmp/1 … 

再将每个实例core-site.xml里的hadoop.tmp.dir属性改为对应目录即可。


这样似乎就ok了,但一运行,晕了,还是报错:

Starting namenodes on [localhost]
localhost: namenode running as process 20544. Stop it first.
localhost: datanode running as process 20786. Stop it first.
HDFS竟知道当前在运行其他实例,还找出了PID,这是怎么回事呢?

我们在/tmp下发现了这些文件:
hadoop-user-datanode.pid
hadoop-user-namenode.pid
hadoop-user-secondarynamenode.pid
原来每个实例都会把自己的PID以文件的形式保存起来,以便脚本操作它们。

PID文件保存的位置是可以设置的,通过HADOOP_PID_DIR环境变量指定。

我们在sbin/hadoop-daemon.sh里找到了如下代码:

if [ "$HADOOP_PID_DIR" = "" ]; then 
  HADOOP_PID_DIR=/tmp 
fi
修改为唯一的即可。
在这个文件里可以看到还有一些变量,诸如配置文件、日志文件位置,由于其默认位置在Hadoop根目录下,所以解决这些冲突的一个简单方法就是直接拷贝根目录到另一个地方,为每个实例拷贝一份。


这样问题就解决啦。


你可能感兴趣的:(在一台机器上运行多个HDFS实例)