···
1
+
# This test is very comprehensive. It tests whether all hadoop services work well with each other.
2
+
# Run this when updating the Hadoop package or making significant changes to the hadoop module.
3
+
# For a more basic test, see hdfs.nix and yarn.nix
import ../make-test-python.nix ({pkgs, ...}: {
6
-
"fs.defaultFS" = "hdfs://master";
9
+
"fs.defaultFS" = "hdfs://ns1";
12
+
"dfs.namenode.rpc-bind-host" = "0.0.0.0";
13
+
"dfs.namenode.http-bind-host" = "0.0.0.0";
14
+
"dfs.namenode.servicerpc-bind-host" = "0.0.0.0";
16
+
# HA Quorum Journal Manager configuration
17
+
"dfs.nameservices" = "ns1";
18
+
"dfs.ha.namenodes.ns1" = "nn1,nn2";
19
+
"dfs.namenode.shared.edits.dir.ns1.nn1" = "qjournal://jn1:8485;jn2:8485;jn3:8485/ns1";
20
+
"dfs.namenode.shared.edits.dir.ns1.nn2" = "qjournal://jn1:8485;jn2:8485;jn3:8485/ns1";
21
+
"dfs.namenode.rpc-address.ns1.nn1" = "nn1:8020";
22
+
"dfs.namenode.rpc-address.ns1.nn2" = "nn2:8020";
23
+
"dfs.namenode.servicerpc-address.ns1.nn1" = "nn1:8022";
24
+
"dfs.namenode.servicerpc-address.ns1.nn2" = "nn2:8022";
25
+
"dfs.namenode.http-address.ns1.nn1" = "nn1:9870";
26
+
"dfs.namenode.http-address.ns1.nn2" = "nn2:9870";
28
+
# Automatic failover configuration
29
+
"dfs.client.failover.proxy.provider.ns1" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider";
30
+
"dfs.ha.automatic-failover.enabled.ns1" = "true";
31
+
"dfs.ha.fencing.methods" = "shell(true)";
32
+
"ha.zookeeper.quorum" = "zk1:2181";
35
+
"yarn.resourcemanager.zk-address" = "zk1:2181";
36
+
"yarn.resourcemanager.ha.enabled" = "true";
37
+
"yarn.resourcemanager.ha.rm-ids" = "rm1,rm2";
38
+
"yarn.resourcemanager.hostname.rm1" = "rm1";
39
+
"yarn.resourcemanager.hostname.rm2" = "rm2";
40
+
"yarn.resourcemanager.ha.automatic-failover.enabled" = "true";
41
+
"yarn.resourcemanager.cluster-id" = "cluster1";
42
+
# yarn.resourcemanager.webapp.address needs to be defined even though yarn.resourcemanager.hostname is set. This shouldn't be necessary, but there's a bug in
43
+
# hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmFilterInitializer.java:70
44
+
# that causes AM containers to fail otherwise.
45
+
"yarn.resourcemanager.webapp.address.rm1" = "rm1:8088";
46
+
"yarn.resourcemanager.webapp.address.rm2" = "rm2:8088";
9
-
master = {pkgs, options, ...}: {
50
+
services.zookeeper.enable = true;
51
+
networking.firewall.allowedTCPPorts = [ 2181 ];
55
+
nn1 = {pkgs, options, ...}: {
11
-
inherit package coreSite;
57
+
inherit package coreSite hdfsSite;
hdfs.namenode.enabled = true;
13
-
yarn.resourcemanager.enabled = true;
59
+
hdfs.zkfc.enabled = true;
15
-
virtualisation.memorySize = 1024;
62
+
nn2 = {pkgs, options, ...}: {
64
+
inherit package coreSite hdfsSite;
65
+
hdfs.namenode.enabled = true;
66
+
hdfs.zkfc.enabled = true;
18
-
worker = {pkgs, options, ...}: {
70
+
jn1 = {pkgs, options, ...}: {
72
+
inherit package coreSite hdfsSite;
73
+
hdfs.journalnode.enabled = true;
76
+
jn2 = {pkgs, options, ...}: {
20
-
inherit package coreSite;
78
+
inherit package coreSite hdfsSite;
79
+
hdfs.journalnode.enabled = true;
82
+
jn3 = {pkgs, options, ...}: {
84
+
inherit package coreSite hdfsSite;
85
+
hdfs.journalnode.enabled = true;
89
+
dn1 = {pkgs, options, ...}: {
91
+
inherit package coreSite hdfsSite;
hdfs.datanode.enabled = true;
97
+
rm1 = {pkgs, options, ...}: {
98
+
virtualisation.memorySize = 1024;
100
+
inherit package coreSite hdfsSite;
101
+
yarnSite = options.services.hadoop.yarnSite.default // yarnSiteHA;
102
+
yarn.resourcemanager.enabled = true;
105
+
rm2 = {pkgs, options, ...}: {
106
+
virtualisation.memorySize = 1024;
107
+
services.hadoop = {
108
+
inherit package coreSite hdfsSite;
109
+
yarnSite = options.services.hadoop.yarnSite.default // yarnSiteHA;
110
+
yarn.resourcemanager.enabled = true;
113
+
nm1 = {pkgs, options, ...}: {
114
+
virtualisation.memorySize = 2048;
115
+
services.hadoop = {
116
+
inherit package coreSite hdfsSite;
117
+
yarnSite = options.services.hadoop.yarnSite.default // yarnSiteHA;
yarn.nodemanager.enabled = true;
23
-
yarnSite = options.services.hadoop.yarnSite.default // {
24
-
"yarn.resourcemanager.hostname" = "master";
27
-
virtualisation.memorySize = 2048;
34
-
master.wait_for_unit("network.target")
35
-
master.wait_for_unit("hdfs-namenode")
126
+
#### HDFS tests ####
37
-
master.wait_for_open_port(8020)
38
-
master.wait_for_open_port(9870)
128
+
zk1.wait_for_unit("network.target")
129
+
jn1.wait_for_unit("network.target")
130
+
jn2.wait_for_unit("network.target")
131
+
jn3.wait_for_unit("network.target")
132
+
nn1.wait_for_unit("network.target")
133
+
nn2.wait_for_unit("network.target")
134
+
dn1.wait_for_unit("network.target")
40
-
worker.wait_for_unit("network.target")
41
-
worker.wait_for_unit("hdfs-datanode")
42
-
worker.wait_for_open_port(9864)
43
-
worker.wait_for_open_port(9866)
44
-
worker.wait_for_open_port(9867)
136
+
zk1.wait_for_unit("zookeeper")
137
+
jn1.wait_for_unit("hdfs-journalnode")
138
+
jn2.wait_for_unit("hdfs-journalnode")
139
+
jn3.wait_for_unit("hdfs-journalnode")
46
-
master.succeed("curl -f http://worker:9864")
47
-
worker.succeed("curl -f http://master:9870")
141
+
zk1.wait_for_open_port(2181)
142
+
jn1.wait_for_open_port(8480)
143
+
jn1.wait_for_open_port(8485)
144
+
jn2.wait_for_open_port(8480)
145
+
jn2.wait_for_open_port(8485)
49
-
worker.succeed("sudo -u hdfs hdfs dfsadmin -safemode wait")
147
+
# Namenodes must be stopped before initializing the cluster
148
+
nn1.succeed("systemctl stop hdfs-namenode")
149
+
nn2.succeed("systemctl stop hdfs-namenode")
150
+
nn1.succeed("systemctl stop hdfs-zkfc")
151
+
nn2.succeed("systemctl stop hdfs-zkfc")
51
-
master.wait_for_unit("yarn-resourcemanager")
153
+
# Initialize zookeeper for failover controller
154
+
nn1.succeed("sudo -u hdfs hdfs zkfc -formatZK 2>&1 | systemd-cat")
53
-
master.wait_for_open_port(8030)
54
-
master.wait_for_open_port(8031)
55
-
master.wait_for_open_port(8032)
56
-
master.wait_for_open_port(8088)
57
-
worker.succeed("curl -f http://master:8088")
156
+
# Format NN1 and start it
157
+
nn1.succeed("sudo -u hdfs hadoop namenode -format 2>&1 | systemd-cat")
158
+
nn1.succeed("systemctl start hdfs-namenode")
159
+
nn1.wait_for_open_port(9870)
160
+
nn1.wait_for_open_port(8022)
161
+
nn1.wait_for_open_port(8020)
59
-
worker.wait_for_unit("yarn-nodemanager")
60
-
worker.wait_for_open_port(8042)
61
-
worker.wait_for_open_port(8040)
62
-
master.succeed("curl -f http://worker:8042")
163
+
# Bootstrap NN2 from NN1 and start it
164
+
nn2.succeed("sudo -u hdfs hdfs namenode -bootstrapStandby 2>&1 | systemd-cat")
165
+
nn2.succeed("systemctl start hdfs-namenode")
166
+
nn2.wait_for_open_port(9870)
167
+
nn2.wait_for_open_port(8022)
168
+
nn2.wait_for_open_port(8020)
169
+
nn1.succeed("netstat -tulpne | systemd-cat")
64
-
assert "Total Nodes:1" in worker.succeed("yarn node -list")
171
+
# Start failover controllers
172
+
nn1.succeed("systemctl start hdfs-zkfc")
173
+
nn2.succeed("systemctl start hdfs-zkfc")
66
-
assert "Estimated value of Pi is" in worker.succeed("HADOOP_USER_NAME=hdfs yarn jar $(readlink $(which yarn) | sed -r 's~bin/yarn~lib/hadoop-*/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar~g') pi 2 10")
67
-
assert "SUCCEEDED" in worker.succeed("yarn application -list -appStates FINISHED")
68
-
worker.succeed("sudo -u hdfs hdfs dfs -ls / | systemd-cat")
175
+
# DN should have started by now, but confirm anyway
176
+
dn1.wait_for_unit("hdfs-datanode")
177
+
# Print states of namenodes
178
+
dn1.succeed("sudo -u hdfs hdfs haadmin -getAllServiceState | systemd-cat")
179
+
# Wait for cluster to exit safemode
180
+
dn1.succeed("sudo -u hdfs hdfs dfsadmin -safemode wait")
181
+
dn1.succeed("sudo -u hdfs hdfs haadmin -getAllServiceState | systemd-cat")
183
+
dn1.succeed("echo testfilecontents | sudo -u hdfs hdfs dfs -put - /testfile")
184
+
assert "testfilecontents" in dn1.succeed("sudo -u hdfs hdfs dfs -cat /testfile")
187
+
nn1.succeed("systemctl stop hdfs-namenode")
188
+
assert "active" in dn1.succeed("sudo -u hdfs hdfs haadmin -getAllServiceState")
189
+
dn1.succeed("sudo -u hdfs hdfs haadmin -getAllServiceState | systemd-cat")
190
+
assert "testfilecontents" in dn1.succeed("sudo -u hdfs hdfs dfs -cat /testfile")
192
+
nn1.succeed("systemctl start hdfs-namenode")
193
+
nn1.wait_for_open_port(9870)
194
+
nn1.wait_for_open_port(8022)
195
+
nn1.wait_for_open_port(8020)
196
+
assert "standby" in dn1.succeed("sudo -u hdfs hdfs haadmin -getAllServiceState")
197
+
dn1.succeed("sudo -u hdfs hdfs haadmin -getAllServiceState | systemd-cat")
199
+
#### YARN tests ####
201
+
rm1.wait_for_unit("network.target")
202
+
rm2.wait_for_unit("network.target")
203
+
nm1.wait_for_unit("network.target")
205
+
rm1.wait_for_unit("yarn-resourcemanager")
206
+
rm1.wait_for_open_port(8088)
207
+
rm2.wait_for_unit("yarn-resourcemanager")
208
+
rm2.wait_for_open_port(8088)
210
+
nm1.wait_for_unit("yarn-nodemanager")
211
+
nm1.wait_for_open_port(8042)
212
+
nm1.wait_for_open_port(8040)
213
+
nm1.wait_until_succeeds("yarn node -list | grep Nodes:1")
214
+
nm1.succeed("sudo -u yarn yarn rmadmin -getAllServiceState | systemd-cat")
215
+
nm1.succeed("sudo -u yarn yarn node -list | systemd-cat")
218
+
rm1.succeed("systemctl stop yarn-resourcemanager")
219
+
assert "standby" not in nm1.succeed("sudo -u yarn yarn rmadmin -getAllServiceState")
220
+
nm1.succeed("sudo -u yarn yarn rmadmin -getAllServiceState | systemd-cat")
221
+
rm1.succeed("systemctl start yarn-resourcemanager")
222
+
rm1.wait_for_unit("yarn-resourcemanager")
223
+
rm1.wait_for_open_port(8088)
224
+
assert "standby" in nm1.succeed("sudo -u yarn yarn rmadmin -getAllServiceState")
225
+
nm1.succeed("sudo -u yarn yarn rmadmin -getAllServiceState | systemd-cat")
227
+
assert "Estimated value of Pi is" in nm1.succeed("HADOOP_USER_NAME=hdfs yarn jar $(readlink $(which yarn) | sed -r 's~bin/yarn~lib/hadoop-*/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar~g') pi 2 10")
228
+
assert "SUCCEEDED" in nm1.succeed("yarn application -list -appStates FINISHED")