Deploying an enterprise Apache Hadoop (CDH) cluster across dozens of hosts requires consistent OS-level tuning across every node (kernel parameters, Transparent Huge Pages, file descriptor limits, /etc/hosts, database connectors, and service accounts) before installing Cloudera Manager Server and its backing relational databases.
This guide documents the cdhmgr-chef-setup Chef cookbook, which automates host preparation and Cloudera Manager installation on CentOS/RHEL 6 so clusters across development, test, pre-production, and production environments can be provisioned reproducibly via Chef, Python, and the Cloudera Manager API.
- Cookbook Repository: github.com/ahmedzbyr/cdhmgr-chef-setup
Historical Note: Cloudera CDH 5 and CentOS 6 have both reached End of Life and were succeeded by Cloudera Data Platform (CDP Private Cloud Base). The two-phase host preparation and management-server architecture described below remains a useful reference for legacy CDH maintenance and automated cluster bootstrapping.
Architecture Overview: Two-Phase Deployment
The cookbook divides cluster deployment into two phases based on node roles:
- Phase 1 — Node Pre-Configuration (
cdhmgr-chef-setup::pre_config): Applied to all nodes in the cluster (Edge, Master, Worker/DataNode, and Admin/Cloudera Manager hosts). Configures OS prerequisites required by Cloudera Manager and CDH. - Phase 2 — Cloudera Manager Server Installation (
cdhmgr-chef-setup::cloudera_manager): Applied only to the Admin (Cloudera Manager) node. Installs and configures the relational database (MySQL or PostgreSQL, defaulting to MySQL), provisions schemas for Cloudera services, installs Cloudera Manager Server/Daemons, and installs the Pythoncm_apiclient library.
| Node Type | Assigned Chef Run List |
|---|---|
| Edge Nodes | recipe[cdhmgr-chef-setup::pre_config] |
| Master Nodes (NameNode, ResourceManager, etc.) | recipe[cdhmgr-chef-setup::pre_config] |
| Worker / DataNodes | recipe[cdhmgr-chef-setup::pre_config] |
| Admin Node (Cloudera Manager Server) | recipe[cdhmgr-chef-setup::pre_config], recipe[cdhmgr-chef-setup::cloudera_manager] |
Phase 1: Preparing Cluster Nodes (pre_config)
Including cdhmgr-chef-setup::pre_config orchestrates the following sub-recipes on every cluster node:
- SELinux configuration (
pre_config_selinux_update): Sets SELinux topermissivemode during initial cluster setup:include_recipe 'cdhmgr-chef-setup::pre_config_selinux_update' - Host firewall rules (
pre_config_iptables_setup): Stops and disablesiptablesfor internal cluster communication (in production, ensure perimeter network segmentation or explicit port rules are enforced):include_recipe 'cdhmgr-chef-setup::pre_config_iptables_setup' - Kerberos & SSSD integration (
pre_config_security_setup): Optional recipe (commented out by default until Active Directory/KDC is available) to configure/etc/krb5.confand/etc/sssd/sssd.conf:# include_recipe 'cdhmgr-chef-setup::pre_config_security_setup' - Administrative accounts &
sudo(pre_config_user_setup): Creates the cluster administration account (sysadmin/cmadmin) and configures passwordlesssudoaccess for Cloudera Manager agent orchestration:include_recipe 'cdhmgr-chef-setup::pre_config_user_setup' - Kernel
sysctltuning (pre_config_sysctl_config): Reducesvm.swappiness(e.g.,vm.swappiness = 1) so Hadoop JVM heaps are not aggressively swapped to disk:include_recipe 'cdhmgr-chef-setup::pre_config_sysctl_config' - Transparent Huge Pages (THP) & common utilities (
pre_config_hadoop_commons_config): Disables Linux Transparent Huge Pages compaction (transparent_hugepage/defragandtransparent_hugepage/enabled) in/etc/rc.localand installs base utilities (rpcbind,telnet):include_recipe 'cdhmgr-chef-setup::pre_config_hadoop_commons_config' - System resource limits (
pre_config_hadoop_ulimits): Configures open file descriptor (nofile) and process (nproc) limits in/etc/security/limits.d/hadoop-cluster.conf:include_recipe 'cdhmgr-chef-setup::pre_config_hadoop_ulimits' - Database JDBC connectors (
pre_config_database_connectors): Deploys the MySQL Connector/J (mysql-connector-java.jar) or PostgreSQL JDBC driver required by Hive, Oozie, Hue, and Sentry:include_recipe 'cdhmgr-chef-setup::pre_config_database_connectors' - Cluster
/etc/hostsresolution (pre_config_hostfile_setup): Populates/etc/hostswith forward/reverse mappings and short aliases for all cluster nodes defined in the Chef role attributes:include_recipe 'cdhmgr-chef-setup::pre_config_hostfile_setup'
Phase 2: Cloudera Manager Server Installation (cloudera_manager)
The cdhmgr-chef-setup::cloudera_manager recipe runs on the Admin node and executes three sub-recipes:
# 1. Install and configure MySQL/PostgreSQL and create service schemas
include_recipe 'cdhmgr-chef-setup::cloudera_manager_database_setup'
# 2. Install Cloudera Manager Server, Daemons, and Agent
include_recipe 'cdhmgr-chef-setup::cloudera_manager_setup'
# 3. Install Python dependencies for Cloudera Manager API automation
include_recipe 'cdhmgr-chef-setup::cloudera_manager_python_api'
Provisioned Service Databases
During cloudera_manager_database_setup, the cookbook creates dedicated databases and users for Cloudera Manager and CDH ecosystem components (replace the placeholder passwords below via Chef Vault or Encrypted Data Bags in production):
| Cloudera Service | Database Name | Database User | Password Placeholder |
|---|---|---|---|
| Cloudera Manager Server | cmdb |
cmadmin |
cmadmin_password |
| Activity Monitor | amon |
amon |
amon_password |
| Reports Manager | rman |
rman |
rman_password |
| Hive Metastore Server | metastore |
hive |
hive_password |
| Sentry Server | sentry |
sentry |
sentry_password |
| Cloudera Navigator Audit Server | nav |
nav |
nav_password |
| Cloudera Navigator Metadata Server | navms |
navms |
navms_password |
| Hue Server | hue |
hue |
hue_password |
| Oozie Server | oozie |
oozie |
oozie_password |
Sample Chef Roles
1. Basic Roles (Using Public Repositories)
When cluster nodes have outbound internet access (directly or via proxy), only the cluster /etc/hosts map and the Cloudera Manager server FQDN need to be overridden.
Basic NON-ADMIN Role
name "non_admin_roles_cdh_hadoop_cluster"
description "Pre-configuration for Cloudera Hadoop Cluster non-admin nodes"
run_list "recipe[cdhmgr-chef-setup::pre_config]"
default_attributes(
"cdhmgr-chef-setup" => {
"etc_hosts_entries" => {
"192.168.13.2" => { "hostname" => "ahmedservere001.ahmed.com", "aliases" => ["ahmedservere001"], "comment" => "Edge 01 - Cloudera Hadoop Node" },
"192.168.13.3" => { "hostname" => "ahmedservere002.ahmed.com", "aliases" => ["ahmedservere002"], "comment" => "Edge 02 - Cloudera Hadoop Node" },
"192.168.13.4" => { "hostname" => "ahmedservera001.ahmed.com", "aliases" => ["ahmedservera001"], "comment" => "Admin 01 - Cloudera Hadoop Node" },
"192.168.13.6" => { "hostname" => "ahmedserverm001.ahmed.com", "aliases" => ["ahmedserverm001"], "comment" => "Master 01 - Cloudera Hadoop Node" },
"192.168.13.7" => { "hostname" => "ahmedserverm002.ahmed.com", "aliases" => ["ahmedserverm002"], "comment" => "Master 02 - Cloudera Hadoop Node" },
"192.168.13.9" => { "hostname" => "ahmedserverw001.ahmed.com", "aliases" => ["ahmedserverw001"], "comment" => "Worker 01 - Cloudera Hadoop Node" },
"192.168.13.10" => { "hostname" => "ahmedserverw002.ahmed.com", "aliases" => ["ahmedserverw002"], "comment" => "Worker 02 - Cloudera Hadoop Node" }
}
}
)
override_attributes(
"cdhmgr-chef-setup" => {
"cloudera_mgr_services" => {
"server_host_fqdn_for_agent" => "ahmedservera001.ahmed.com"
}
}
)
Basic ADMIN Role
name "admin_roles_cdh_hadoop_cluster"
description "Pre-configuration and Cloudera Manager installation for Admin node"
run_list "recipe[cdhmgr-chef-setup::pre_config]", "recipe[cdhmgr-chef-setup::cloudera_manager]"
default_attributes(
"cdhmgr-chef-setup" => {
"etc_hosts_entries" => {
"192.168.13.2" => { "hostname" => "ahmedservere001.ahmed.com", "aliases" => ["ahmedservere001"], "comment" => "Edge 01 - Cloudera Hadoop Node" },
"192.168.13.3" => { "hostname" => "ahmedservere002.ahmed.com", "aliases" => ["ahmedservere002"], "comment" => "Edge 02 - Cloudera Hadoop Node" },
"192.168.13.4" => { "hostname" => "ahmedservera001.ahmed.com", "aliases" => ["ahmedservera001"], "comment" => "Admin 01 - Cloudera Hadoop Node" },
"192.168.13.6" => { "hostname" => "ahmedserverm001.ahmed.com", "aliases" => ["ahmedserverm001"], "comment" => "Master 01 - Cloudera Hadoop Node" },
"192.168.13.7" => { "hostname" => "ahmedserverm002.ahmed.com", "aliases" => ["ahmedserverm002"], "comment" => "Master 02 - Cloudera Hadoop Node" },
"192.168.13.9" => { "hostname" => "ahmedserverw001.ahmed.com", "aliases" => ["ahmedserverw001"], "comment" => "Worker 01 - Cloudera Hadoop Node" },
"192.168.13.10" => { "hostname" => "ahmedserverw002.ahmed.com", "aliases" => ["ahmedserverw002"], "comment" => "Worker 02 - Cloudera Hadoop Node" }
}
}
)
override_attributes(
"cdhmgr-chef-setup" => {
"cloudera_mgr_services" => {
"server_host_fqdn_for_agent" => "ahmedservera001.ahmed.com"
}
}
)
2. Custom Air-Gapped / Internal Mirror Roles
In enterprise environments without direct internet access, override the internal YUM repository URLs, pinned RPM package versions, and internal MySQL Connector/J artifact URL:
name "admin_roles_cdh_hadoop_cluster"
description "Cloudera Manager Admin Node Role using Internal YUM Mirror"
run_list "recipe[cdhmgr-chef-setup::pre_config]", "recipe[cdhmgr-chef-setup::cloudera_manager]"
default_attributes(
"cdhmgr-chef-setup" => {
"etc_hosts_entries" => {
"192.168.13.2" => { "hostname" => "ahmedservere001.ahmed.com", "aliases" => ["ahmedservere001"], "comment" => "Edge 01 - Cloudera Hadoop Node" },
"192.168.13.3" => { "hostname" => "ahmedservere002.ahmed.com", "aliases" => ["ahmedservere002"], "comment" => "Edge 02 - Cloudera Hadoop Node" },
"192.168.13.4" => { "hostname" => "ahmedservera001.ahmed.com", "aliases" => ["ahmedservera001"], "comment" => "Admin 01 - Cloudera Hadoop Node" },
"192.168.13.6" => { "hostname" => "ahmedserverm001.ahmed.com", "aliases" => ["ahmedserverm001"], "comment" => "Master 01 - Cloudera Hadoop Node" },
"192.168.13.7" => { "hostname" => "ahmedserverm002.ahmed.com", "aliases" => ["ahmedserverm002"], "comment" => "Master 02 - Cloudera Hadoop Node" },
"192.168.13.9" => { "hostname" => "ahmedserverw001.ahmed.com", "aliases" => ["ahmedserverw001"], "comment" => "Worker 01 - Cloudera Hadoop Node" },
"192.168.13.10" => { "hostname" => "ahmedserverw002.ahmed.com", "aliases" => ["ahmedserverw002"], "comment" => "Worker 02 - Cloudera Hadoop Node" }
}
}
)
override_attributes(
"cdhmgr-chef-setup" => {
"cloudera_mgr_services" => {
"common_packages" => ["oracle-j2sdk1.7", "cloudera-manager-daemons", "cloudera-manager-agent", "openldap-clients"],
"common_packages_versions" => ["1.7.0+update67-1", "5.12.0-1.cm5120.p0.120.el6", "5.12.0-1.cm5120.p0.120.el6", "2.4.40-16.el6"],
"server_packages" => ["cloudera-manager-server", "openldap-clients"],
"server_packages_versions" => ["5.12.0-1.cm5120.p0.120.el6", "2.4.40-16.el6"],
"server_host_fqdn_for_agent" => "localhost"
},
"database_to_install" => "mysql"
},
"mysql_connector" => {
"j" => {
"url" => "http://repo.ahmed.com/mysql-connector/Connector-J/mysql-connector-java-5.1.40.tar.gz"
}
},
"authorization" => {
"sudo" => {
"groups" => ["cmadmin"]
}
},
"yum_repository" => {
"cm" => {
"description" => "Packages for Cloudera Manager, Version 5, on RedHat or CentOS 6 x86_64",
"baseurl" => "http://repo.ahmed.com/cm5/redhat/6/x86_64/cm/5.12.0/",
"gpgkey" => "http://repo.ahmed.com/cm5/redhat/6/x86_64/cm/RPM-GPG-KEY-cloudera"
}
}
)
References
- GitHub —
cdhmgr-chef-setupCookbook Repository - Cloudera Documentation — Installation Path B (Manual Installation Using Cloudera Manager Packages)
- Cloudera Documentation — Configuring an External MySQL Database for Cloudera Manager
- Cloudera Documentation — Configuring an External PostgreSQL Database for Cloudera Manager
- Cloudera Engineering Blog — How to Deploy Apache Hadoop Clusters Like a Boss