Hadoop HDFS 部署及高可用
HDFS是master/slave架构,一个HDFS集群包括一台NameNode和多台DataNode,NameNode负责文件系统空间和访问控制,DataNode负责实际数据的存储。集群内部,每个存储的文件会被分割存在一个或者多个block里,这些block分布在不同的DataNode上。NameNode负责诸如打开(opening)、关闭(closing)和重命名(renaming)文件或者目录的操作,同时维护block和DataNode的映射关系。DataNode为client提供读和写的服务,同时执行来自NameNode 的block的创建、删除、复制等指令。
HDFS的NameNode(NN)主要包括以下元数据:
- fsimage: 包括某个时间点整个文件系统状态的快照;
- edit logs: 最近生成的fsimage之后文件系统的所有变更(file creationg/deletion/modification)
当NameNode启动时,进程会加载fsimage和应用edit logs的变更,同时会做大量的一致性检查,如果检查不通过,进程会起不来,需要修复。
下文将介绍HDFS的安装,在安装之前,假定操作环境如下:
- OS:CentOS 7.x
- Java: 1.8.x
- Hadoop: 3.2.x
HDFS集群安装 - one NameNode
首先我们安装一个3个节点的hdfs集群:master1、 node1、 node2:
- master1: 10.8.0.10
- node1: 10.8.0.11
- node2: 10.8.0.12
master1作为NameNode节点,node1和node2为两个DataNode节点。
节点间互相通信可以使用域名,也可以配置/etc/hosts
,这里我们配置hosts文件,所有节点都配置:
1 | 10.8.0.10 master1 |
Hadoop有一系列管理脚本,可以通过master节点进行ssh管理其他节点,接下来配置master到其他各个节点的ssh免密登录,先创建key-pair,在master1上执行:
1 | ssh-keygen -b 4096 |
这里为了方便,直接使用root账户安装运行(生成环境可以创建普通用户安装),生成的key-pair在/root/.ssh目录下,把公钥(/root/.ssh/id_rsa.pub)复制到所有节点(包括master节点master1)的/root/.ssh/authorized_keys文件里,测试是否可以免密登录:
1 | ssh -p xxxx root@10.8.0.10 |
下载hadoop,下载完成后,拷贝都所有节点,解压:
1 | wget https://mirrors.huaweicloud.com/apache/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz |
设置环境变量,可以配置在家目录的.bashrc里,所有节点都配置:
1 | export HADOOP_HOME=/usr/local/hadoop |
接下来首先配置master1,配置完成后,所有配置文件再复制到其他节点,配置文件可以保持一致。
设置JAVA_HOME,JAVA_HOME环境变量可以设置在用户环境变量里,也可以配置在hadoop的配置文件里,这里我们配置在/usr/local/hadoop/etc/hadoop/hadoop-env.sh文件里:
1 | export JAVA_HOME=/path/to/java_home |
配置HDFS相关路径,配置文件etc/hadoop/hdfs-site.conf:
1 | <configuration> |
dfs.replication
为block副本数,其值不能大于DataNode数量。
配置工作节点,在这里为DataNode,配置文件etc/hadoop/workers:
1 | node1 |
配置core-site.xml:
1 | <configuration> |
把配置文件拷贝都其他两个节点:
1 | for node in node1 node2; do |
像本地文件系统一样,使用前都需要格式化,在master1上格式化HDFS:
1 | hdfs namenode -format |
到此hdfs安装完成,我们启动hdfs,在master1上执行:
1 | # sbin/start-dfs.sh |
如果这里使用root账户启动hdfs,会报错,如下:
1 | Starting namenodes on [master1] |
设置如下环境变量就能正常启动:
1 | export HDFS_NAMENODE_USER="root" |
如果节点主机ssh服务配置的不是默认端口22,需要设置环境变量,配置文件为etc/hadoop/hadoop-env.sh:
1 | export HADOOP_SSH_OPTS="-p xxxx" |
启动完成之后,master1上会启动 NameNode 和 SecondaryNameNode 的进程,node1 和 node2 会启动 DataNode 的进程,可以通过jps查看。停止整个集群执行:
1 | stop-dfs.sh |
如果不想通过master1来启动各个节点的进程,可以使用hdfs命令(bin/hdfs)在节点上单独启动:
1 | # 启动namenode |
查看hdfs状态,可以使用hdfs dfsadmin
指令:
1 | hdfs dfsadmin -report |
更多指令:
1 | hdfs help |
一些简单的文件操作,比如把本地文件发送到hdfs:
1 | hdfs dfs -mkdir /test |
把hdfs文件复制到本地:
1 | hdfs dfs -get /test/1.txt |
更多文件操作指令:
1 | hdfs dfs -help |
下面是一个完整配置例子:
1 | <configuration> |
HDFS高可用
前文讲述了如何部署配置单个NameNode节点的HDFS集群,因为NameNode保存了整个集群的元数据信息,一旦故障,整个集群都不能使用,所以,接下来讲述如何配置NameNode的高可用。
NameNode的高可用是一种Active/Passive的架构,同一个集群中,只有一台NameNode是Active状态对外提供服务,其他NameNode都是Standby状态提供热备。当前Active状态的NN出现故障时,会进行故障转移到热备的节点上去。
NameNode的元数据包括两部分: fsimage和edit logs,Standby为了跟Active保持数据同步,hdfs的高可用增加了一个叫JournalNodes(JNs)的服务,用来持久化edit logs,任何Active NN的变更都会被持久化到JNs。Standby读取JNs上的edit log,并应用到自己的命名空间,当Active发生故障时,Standby会确保执行了所有edit log然后再进行故障转移提升为Active。
上文已经部署了一个HDFS集群,接下来讲述如何在这个集群上配置高可用,这里我们增加一台服务器作为NameNode,ip如下
- master2: 10.8.0.13
以下配置在master2上操作。
HDFS HA集群需要配置nameservice ID
,这个ID为同个集群下NameNode共有,不同NameNode通过NameNode ID
进行区别。接下来是一些配置细节。
HDFS HA的配置文件也是hdfs-site.xml,首先假定nameservice ID为testcluster1,有些配置的key会跟id名称有关,如dfs.ha.namenodes.[nameservice ID],最后字段需要使用实际的nameservice ID。
dfs.nameservices - the logical name for this new nameservice
本文使用testcluster1作为nameservice ID,配置如下:1
2
3
4<property>
<name>dfs.nameservices</name>
<value>testcluster1</value>
</property>dfs.ha.namenodes.[nameservice ID] - unique identifiers for each NameNode in the nameservice
配置所有的namenode id,以逗号分隔,如本例:1
2
3
4<property>
<name>dfs.ha.namenodes.testcluster1</name>
<value>master1,master2</value>
</property>这里要注意,NameNode HA最小数量要2台。
dfs.namenode.rpc-address.[nameservice ID].[name node ID] - the fully-qualified RPC address for each NameNode to listen on
所有NameNode的RPC地址,可以使用域名,也可以使用IP,程序启动后会监听配置中指定的IP和端口(如果使用的是域名,会使用域名解析的IP):1
2
3
4
5
6
7
8
9<property>
<name>dfs.namenode.rpc-address.testcluster1.master1</name>
<value>master1:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.testcluster1.master2</name>
<value>master2:9000</value>
</property>如果想简单所有ip(0.0.0.0),增加监听的配置:
1
2
3
4<property>
<name>dfs.namenode.rpc-bind-host</name>
<value>0.0.0.0</value>
</property>dfs.namenode.http-address.[nameservice ID].[name node ID] - the fully-qualified HTTP address for each NameNode to listen on
跟rpc-address类似,配置http监听地址:1
2
3
4
5
6
7
8
9<property>
<name>dfs.namenode.http-address.testcluster1.master1</name>
<value>master1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.testcluster1.master2</name>
<value>master2:9870</value>
</property>同样,也可以指定监听所有ip:
1
2
3
4<property>
<name>dfs.namenode.http-bind-host</name>
<value>0.0.0.0</value>
</property>dfs.namenode.shared.edits.dir - the URI which identifies the group of JNs where the NameNodes will write/read edits
配置JNs地址列表,用于存储NN共享的edit logs,Active NN写入,Standby NN读取,多个HDFS集群可以共享一个JNs集群,不同HDFS集群通过nameservice id来区分。,这里使用一个DataNode节点来部署JN,配置如下:1
2
3
4<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master1:8485;master2:8485;node1:8485/testcluster1</value>
</property>dfs.client.failover.proxy.provider.[nameservice ID] - the Java class that HDFS clients use to contact the Active NameNode
配置java class name,当使用客户端时,用来确定当前Active NN。配置如下:
1 | <property> |
- dfs.ha.fencing.methods - a list of scripts or Java classes which will be used to fence the Active NameNode during a failover
为了保证系统的正确性,在任何时间只有一个NameNode处于Active状态。 重要的是,在使用 Quorum Journal Manager 时,将只允许一个NameNode写入JournalNodes,因此不会因为裂脑而损坏文件系统的元数据。但是,当发生故障转移时,以前的 Active NameNode 元数据可能已经过期,但仍然有可能向客户端提供读取请求,直到该NameNode在尝试写入JournalNodes时关闭为止。 因此,即使使用Quorum Journal Manager,仍然需要配置一些fencing method(围栏方法?)。但是为了在防护机制(fencing mechanisms)失败的情况下提高系统的可用性,建议配置一种fencing method,以确保最终有一种fencing method返回成功。 请注意,如果选择不使用任何fencing method,则仍必须为此设置进行配置,比如”shell(/bin/true)”。
Hadoop 内置了两种方法: shell 和 sshfence。
sshfence - SSH to the Active NameNode and kill the processsshfence
方式会登陆到目标节点,使用fuser
杀掉监听具体端口的进程。要使用这种方式,需要配置ssh免密登录,所以,所有的NameNode都要互相可以免密登录,dfs.ha.fencing.ssh.private-key-files 指定私钥文件,可以指定多个,以逗号分隔。 dfs.ha.fencing.ssh.connect-timeout 设置ssh超时时间。配置如下,根据实际情况,可以指定用户和端口号:
1 | <property> |
shell - run an arbitrary shell command to fence the Active NameNode
这种方式可以执行任意命令和脚本。当Active NN宕机时,使用sshfence对宕机的NN总是会失败,导致故障转移失败,这是需要再增加一个fencing method,以保障fencing method最终总是成功的:
1 | <property> |
- dfs.journalnode.edits.dir - the path where the JournalNode daemon will store its local state
JournalNode在本地存储元数据的目录,可以设置多个目录做冗余,多个目录以逗号分隔,每个目录存储完整副本,也可以使用raid做冗余,配置如下:1
2
3
4<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hadoop/data/journalNode</value>
</property> - fs.defaultFS - the default path prefix used by the Hadoop FS client when none is given
Hadoop client使用新的HA集群的默认路径,可选,配置在core-site.xml:以上是关于新的NN和JNs的配置,接下来阐述如何启动和初始化新的NN和JNs。1
2
3
4<property>
<name>fs.default.name</name>
<value>hdfs://testcluster1</value>
</property>
首先,我们要启动JournalNode daemon,可以通过如下命令一台一台启动:
1 | hdfs --daemon start journalnode |
JournalNode启动之后,这时需要进行初始化,把两台HA Namenode的元数据进行同步,这里分3种情况:
第一种情况是整个集群完全是新的,那只要按照上文关于hdfs的安装文档,再任意台NameNode上对HDFS进行格式化,命令如下:
1
hdfs namenode -format
格式化完成之后,启动HA NameNode就可以。
第二种情况是现有集群已经格式化了NameNode,或者正将未启用HA的群集转换为启用HA,则需要将NameNode元数据目录的内容复制到其他未格式化的NameNode上,并在未格式化的NameNode上执行如下命令:
1
hdfs namenode -bootstrapStandby
执行完成后,JournalNodes(dfs.namenode.shared.edits.dir)就会包含现有NameNode的edit log,这样两个NN就可以共享edit log。这种情况一般是新增HA NameNode。
第三种情况是将非HA NameNode转换为HA,则应执行命令:
1
hdfs namenode -initializeSharedEdits
该命令将使用本地NameNode edits目录中的edits数据初始化JournalNode。
完成之后启动所有NameNode,可以通过NN的网页页面查看哪台是Active,哪些是Standby。这时,master1和master2会启动NameNode和JournalNode进程,node1会启动DataNode和JournalNode进程。
如果是在现有HA NN增加新的NN节点,需要重新刷新集群中的DataNode以识别新的NameNode,进行数据上报,命令如下:
1 | hdfs dfsadmin -refreshNamenodes <datanode_host_name>:<datanode_rpc_port> |
故障自动转移(automatic failover)
前面只是通过JNs做了edits数据的共享,实现了NameNode的高可用,在Active出现故障时,可以提升热备Standby为Active,还不能做到自动故障转移。接下来就要说明如何来实现自动切换。
要实现自动故障转移,需要额外的两个组件: zookeeper和ZKFailoverController(ZKFC)。Zookeeper是一个高可用的key-value分布式系统,用来保存协调数据,zookeeper在HDFS的自动故障转移主要做了以下两件事:
- 失败检测(Failure detection) - 每个NameNode与zookeeper都保持一个持久的session,当有NN宕机时,session过期,zookeeper会把这个事件通知给其他NN,以判断是否要做failover;
- Action NameNode选举 - ZooKeeper提供了一种简单的机制来选择一个节点为活动节点。 如果当前活动的NameNode崩溃,则另一个节点可能会在ZooKeeper中获取到排他锁,以表明它将成为下一个Active NameNode。
ZKFailoverController(ZKFC)是一个zookeeper client,同时它会检测和管理NameNode的状态,每个运行NameNode的服务器都要运行一个ZKFC。ZKFC的作用有以下几点:
- 健康检测(Health monitoring) - the ZKFC pings its local NameNode on a periodic basis with a health-check command. So long as the NameNode responds in a timely fashion with a healthy status, the ZKFC considers the node healthy. If the node has crashed, frozen, or otherwise entered an unhealthy state, the health monitor will mark it as unhealthy
- ZooKeeper session management - when the local NameNode is healthy, the ZKFC holds a session open in ZooKeeper. If the local NameNode is active, it also holds a special “lock” znode. This lock uses ZooKeeper’s support for “ephemeral” nodes; if the session expires, the lock node will be automatically deleted.
- ZooKeeper-based election - if the local NameNode is healthy, and the ZKFC sees that no other node currently holds the lock znode, it will itself try to acquire the lock. If it succeeds, then it has “won the election”, and is responsible for running a failover to make its local NameNode active. The failover process is similar to the manual failover described above: first, the previous active is fenced if necessary, and then the local NameNode transitions to active state.
本文关于zookeeper的部署,略。
配置故障自动转移,在hdfs-site.xml增加如下配置:
1 | <property> |
在core-site.xml增加如下配置:
1 | <property> |
配置完成后,初始化zookeeper中HA state:
1 | hdfs zkfc -formatZK |
启动zkfc进程:
1 | hdfs --daemon start zkfc |
手动增加JournalNode
在日常运维中,服务器故障总是很难避免的,当发生服务器故障,需要使用新的机器替换时,NameNode和DataNode新增比较简单,只要根据现有配置增加新节点就可以,JournalNode增加稍微麻烦点。本节将介绍如何增加JournalNode。
新增JournalNode遵循以下步骤:
修改配置文件hdfs-site.xml,在
dfs.namenode.shared.edits.dir
配置项增加新的journal地址,把配置文件同步到其他所有节点;把现有正常的JournalNode中的数据拷贝一份到新的JournalNode数据目录,启动新增的JournalNode:
1
hdfs --daemon start journalnode
重启 Standby NameNode,在Standby NameNode上执行:
1
2hdfs --daemon stop namenode
hdfs --daemon start namenode通过NameNode页面检查JournalNode列表是否更新。
进行手动NN切换:
1
hdfs haadmin -failover master1 master2
重启原Active NameNode,在原Active Namenode上执行:
1
2hdfs --daemon stop namenode
hdfs --daemon start namenode最后附上core-site.xml和hdfs-site.xml的完整配置:
- core-site.xml
1
2
3
4
5
6
7
8
9
10
11<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://testcluster1:9000</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
</property>
</configuration> - hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96<configuration>
<property>
<name>dfs.nameservices</name>
<value>testcluster1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/hadoop/data/nameNode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/hadoop/data/dataNode</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.ha.namenodes.testcluster1</name>
<value>master1,master2</value>
</property>
<property>
<name>dfs.namenode.rpc-bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>dfs.namenode.http-bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>dfs.namenode.rpc-address.testcluster1.master1</name>
<value>master1:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.testcluster1.master2</name>
<value>master2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.testcluster1.master1</name>
<value>master1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.testcluster1.master2</name>
<value>master2:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master1:8485;master2:8485;node1:8485/testcluster1</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.testcluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hadoop/data/journalNode</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>移除DataNode
实际运维中,难免需要对服务器进行迁移,这就涉及到先增加DataNode然后再移除DataNode,DataNode的移除也比较简单,过程如下:
- 首先创建 dfs.hosts.exclude 文件(如果没有配置这个参数的话),假设这里使用的文件名为 dfs.exclude:
1
touch /usr/local/hadoop/etc/hadoop/dfs.exclude
- HDFS配置文件 hdfs-site.xml 增加如下配置,并重启NameNode:
1
2
3
4<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/hadoop/dfs.exclude</value>
</property> - 把需要移除的节点写入/usr/local/hadoop/etc/hadoop/dfs.exclude文件,多台host的话每台占一行。然后执行如下指令,强制NameNode读取exclude file被开始decommissioning process:
1
hdfs dfsadmin -refreshNodes
- 如果需要停止的话,移除/usr/local/hadoop/etc/hadoop/dfs.exclude里的DataNode,重新执行上面的指令:
1
hdfs dfsadmin -refreshNodes
- 移除的过程中,可以通过ui和命令来观察进程以及结果:
1
hdfs dfsadmin -report
实际操作中,当把要移除的datanode加入到dfs.exclude文件里,执行
hdfs dfsadmin -refreshNodes
,没有任何反应,直到重启NN之后才开始file被开始 decommissioning;file被开始decommissioning 结束之后,再把节点从dfs.exclude移除并关掉datanode上的进程之后,执行hdfs dfsadmin -refreshNodes
也无效,也需要重启NN。原因待查。
问题处理
- org.apache.hadoop.hdfs.server.blockmanagement.DatanodeManager: Unresolved datanode registration: hostname cannot be resolved
此异常跟参数dfs.namenode.datanode.registration.ip-hostname-check
有关,默认配置是true,NameNode会反向解析DataNode ip,如果解析成功,NameNode才会注册此DataNode,目的是防止误注册。官方解释如下:
If true (the default), then the namenode requires that a connecting datanode’s address must be resolved to a hostname. If necessary, a reverse DNS lookup is performed. All attempts to register a datanode from an unresolvable address are rejected. It is recommended that this setting be left on to prevent accidental registration of datanodes listed by hostname in the excludes file during a DNS outage. Only set this to false in environments where there is no infrastructure to support reverse DNS lookup.
- block数异常
此异常一般发生在磁盘故障或者重启后恢复时,异常信息如下:
1 | The reported blocks 11884 needs additional 191 blocks to reach the threshold 0.9990 of total blocks 12088. |
DataNode上报的block数量少于默认设置(dfs.namenode.safemode.threshold-pct)的99.9%,集群处理safemode,即只读模式下,可以通过更改NameNode的参数dfs.namenode.safemode.threshold-pct来达到恢复的目的,也可以通过hdfs dfsadmin -safemode leave
强制让NameNode离开safemode,然后在来处理实际的问题。dfs.namenode.safemode.threshold-pct配置说明如下:
Specifies the percentage of blocks that should satisfy the minimal replication requirement defined by dfs.namenode.replication.min. Values less than or equal to 0 mean not to wait for any particular percentage of blocks before exiting safemode. Values greater than 1 will make safe mode permanent.
- fsck连接被拒问题
当使用hdfs fsck命令时,会报如下错误:fsck执行会请求hdfs http服务,但是一直访问到9870端口,而namenode实际配置的端口是50070,即使命令指定-fs参数结果也是一样:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31Connecting to namenode via http://namenode:9870/fsck?ugi=root&path=%2F
Exception in thread "main" java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:607)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
at sun.net.www.http.HttpClient.New(HttpClient.java:339)
at sun.net.www.http.HttpClient.New(HttpClient.java:357)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1570)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
at org.apache.hadoop.hdfs.tools.DFSck.doWork(DFSck.java:359)
at org.apache.hadoop.hdfs.tools.DFSck.access$000(DFSck.java:72)
at org.apache.hadoop.hdfs.tools.DFSck$1.run(DFSck.java:159)
at org.apache.hadoop.hdfs.tools.DFSck$1.run(DFSck.java:156)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
at org.apache.hadoop.hdfs.tools.DFSck.run(DFSck.java:155)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:90)
at org.apache.hadoop.hdfs.tools.DFSck.main(DFSck.java:402)最后通过配置hdfs-site.xml解决:1
hdfs fsck -fs "hdfs://namenode:9000" /
其他hdfs子命令没有出现这种问题,fsck执行机制还有待查明。1
2
3
4<property>
<name>dfs.namenode.http-address</name>
<value>namenode-ha:50070</value>
</property>
参考
- HDFS Architecture
- How to Install and Set Up a 3-Node Hadoop Cluster
- HDFS_NAMENODE_USER, HDFS_DATANODE_USER & HDFS_SECONDARYNAMENODE_USER not defined
- Change ssh default port in hadoop multi cluster
- Unable to Start the Name Node in hadoop
- HDFS High Availability Using the Quorum Journal Manager
- HDFS Support for Multihomed Networks
- core-default.xml(r3.2.0)
- hdfs-default.xml(r3.2.0)
- 手动增加Journal Node节点
- What is the Role of Journal nodes in Namenode HA
- Hadoop NameNode 高可用实现解析
- How do I correctly remove nodes in Hadoop?
- HDFS DataNode Admin Guide
- Add a NameNode to an existing HDFS cluster