1{ config, lib, pkgs, ...}:
2let
3 cfg = config.services.hadoop;
4 hadoopConf = import ./conf.nix { hadoop = cfg; pkgs = pkgs; };
5in
6with lib;
7{
8 options.services.hadoop.hdfs = {
9 namenode.enabled = mkOption {
10 type = types.bool;
11 default = false;
12 description = ''
13 Whether to run the Hadoop YARN NameNode
14 '';
15 };
16 datanode.enabled = mkOption {
17 type = types.bool;
18 default = false;
19 description = ''
20 Whether to run the Hadoop YARN DataNode
21 '';
22 };
23 };
24
25 config = mkMerge [
26 (mkIf cfg.hdfs.namenode.enabled {
27 systemd.services."hdfs-namenode" = {
28 description = "Hadoop HDFS NameNode";
29 wantedBy = [ "multi-user.target" ];
30
31 environment = {
32 HADOOP_HOME = "${cfg.package}";
33 };
34
35 preStart = ''
36 ${cfg.package}/bin/hdfs --config ${hadoopConf} namenode -format -nonInteractive || true
37 '';
38
39 serviceConfig = {
40 User = "hdfs";
41 SyslogIdentifier = "hdfs-namenode";
42 ExecStart = "${cfg.package}/bin/hdfs --config ${hadoopConf} namenode";
43 };
44 };
45 })
46 (mkIf cfg.hdfs.datanode.enabled {
47 systemd.services."hdfs-datanode" = {
48 description = "Hadoop HDFS DataNode";
49 wantedBy = [ "multi-user.target" ];
50
51 environment = {
52 HADOOP_HOME = "${cfg.package}";
53 };
54
55 serviceConfig = {
56 User = "hdfs";
57 SyslogIdentifier = "hdfs-datanode";
58 ExecStart = "${cfg.package}/bin/hdfs --config ${hadoopConf} datanode";
59 };
60 };
61 })
62 (mkIf (
63 cfg.hdfs.namenode.enabled || cfg.hdfs.datanode.enabled
64 ) {
65 users.users.hdfs = {
66 description = "Hadoop HDFS user";
67 group = "hadoop";
68 uid = config.ids.uids.hdfs;
69 };
70 })
71
72 ];
73}