Our Community is getting an upgrade! To get everything ready for the relaunch, we’ll be placing the site in read-only mode starting September 21st.
We really appreciate your understanding while we get things set up behind the scenes. Catch up on all the exciting details about the move here.
Need help or have questions? Drop us a line at [email protected]
Created on 03-29-2017 08:29 AM
Servers used in this document:
node1.localdomain = HAProxy server node2.localdomain = NameNode1 node3.localdomain = NameNode2
1. Install HAProxy
[root@node1 ~]# yum install -y haproxy
2. Set up HAProxy with minimum configuration
[root@node1 ~]# cp -p /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg
... (snip) ...
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:50070
default_backend app
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
option httpchk GET /webhdfs/v1/?op=CHECKACCESS
http-check expect rstatus ([23][0-9][0-9]|401)
server node2 node2.localdomain:50070 check
server node3 node3.localdomain:50070 check
3. Create a new service principal for HAProxy from your KDC server
kadmin.local -q "addprinc -randkey HTTP/node1.localdomain@HO-UBU02"
4. Create a keytab. If same file already exists, just in case, taking a backup
[root@node1 ~]# mv /etc/security/keytabs/spnego.service.keytab /etc/security/keytabs/spnego.service.keytab.old [root@node1 ~]# kadmin -p ambari/admin -q "ktadd -k /etc/security/keytabs/spnego.service.keytab HTTP/node1.localdomain@HO-UBU02" Authenticating as principal ambari/admin with password. Password for ambari/admin@HO-UBU02: ...
5. Copy this keytab into NameNode servers:
[root@node1 ~]# scp /etc/security/keytabs/spnego.service.keytab node2.localdomain:/tmp/node1.spnego.service.keytab spnego.service.keytab 100% 306 0.3KB/s 00:00 [root@node1 ~]# scp /etc/security/keytabs/spnego.service.keytab node3.localdomain:/tmp/node1.spnego.service.keytab spnego.service.keytab 100% 306 0.3KB/s 00:00
6. Merge keytabs:
First, confirm the keytabl path:
[root@node2 ~]# grep 'dfs.web.authentication.kerberos.keytab' -A1 /etc/hadoop/conf/hdfs-site.xml <name>dfs.web.authentication.kerberos.keytab</name> <value>/etc/security/keytabs/spnego.service.keytab</value>
Make a backup:
[root@node2 ~]# mv /etc/security/keytabs/spnego.service.keytab /etc/security/keytabs/spnego.service.keytab.orig
Merge keytabs with ktutil:
[root@node2 ~]# ktutil ktutil: rkt /etc/security/keytabs/spnego.service.keytab.orig ktutil: rkt /tmp/node1.spnego.service.keytab ktutil: wkt /etc/security/keytabs/spnego.service.keytab ktutil: quit
Make sure owner and permission:
[root@node2 ~]# chown root:hadoop /etc/security/keytabs/spnego.service.keytab [root@node2 ~]# chmod 440 /etc/security/keytabs/spnego.service.keytab
Confirm:
[root@node2 ~]# klist -kte /etc/security/keytabs/spnego.service.keytab Keytab name: FILE:/etc/security/keytabs/spnego.service.keytab KVNO Timestamp Principal ---- ----------------- -------------------------------------------------------- 2 03/22/17 08:45:02 HTTP/node2.localdomain@HO-UBU02 (aes256-cts-hmac-sha1-96) 2 03/22/17 08:45:02 HTTP/node2.localdomain@HO-UBU02 (aes128-cts-hmac-sha1-96) 2 03/22/17 08:45:02 HTTP/node2.localdomain@HO-UBU02 (des3-cbc-sha1) 2 03/22/17 08:45:02 HTTP/node2.localdomain@HO-UBU02 (arcfour-hmac) 5 03/22/17 08:45:02 HTTP/node1.localdomain@HO-UBU02 (aes256-cts-hmac-sha1-96) 5 03/22/17 08:45:02 HTTP/node1.localdomain@HO-UBU02 (aes128-cts-hmac-sha1-96) 5 03/22/17 08:45:02 HTTP/node1.localdomain@HO-UBU02 (des3-cbc-sha1) 5 03/22/17 08:45:02 HTTP/node1.localdomain@HO-UBU02 (arcfour-hmac)
7. Do above steps on Node3 as well
8. From Ambari, search and change dfs.web.authentication.kerberos.principal to "*"
NOTE: Newer Ambari does not allow to change this. In that case, please use configs.sh (deprecated) or configs.py
9. (Optional but strongly recommended) Just in case, stop ambari-server and take a database backup, for example:
ambari-server stop pg_dump -Uambari -Z 9 -f ./ambari_$(date +"%Y%m%d%H%M%S").sql.gz
10. Login to Ambari database, for example: psql -Uambari ambari then run UPDATE statement below:
update alert_definition set alert_source = replace(alert_source, '{hdfs-site/dfs.web.authentication.kerberos.principal}', '{hdfs-site/dfs.namenode.kerberos.internal.spnego.principal}') where alert_source like '%{hdfs-site/dfs.web.authentication.kerberos.principal}%' and component_name in ('NAMENODE', 'JOURNALNODE', 'DATANODE');11. Login to Ambari-server with SSH as *root*, then type the following commands:
cd /var/lib/ambari-server/resources/common-services/HDFS/2.1.0.2.0/package/alerts sed -i_$(date +"%Y%m%d%H%M%S").bak 's/dfs.web.authentication.kerberos.principal/dfs.namenode.kerberos.internal.spnego.principal/' *.py ambari-server restart
12. From Ambari UI, Disable and Enable each Alerts which are failing due to ".../spnego.service.keytab * > ..." error.
When you disable an Alert, please wait until all red alerts are disappeared.
13. Restart HDFS components from Ambari
14. Test ("HTTP/1.1 200 OK" means good)
[root@node1 ~]# curl --negotiate -u : -X GET 'http://node3.localdomain:50070/webhdfs/v1/?op=CHECKACCESS'
[root@node1 ~]# curl --negotiate -u : -X GET 'http://node2.localdomain:50070/webhdfs/v1/?op=CHECKACCESS'
{"RemoteException":{"exception":"StandbyException","javaClassName":"org.apache.hadoop.ipc.StandbyException","message":"Operation category READ is not supported in state standby"}}[root@node1 ~]#
[root@node1 ~]# curl -s -I --negotiate -u : 'http://node1.localdomain:50070/webhdfs/v1/?op=CHECKACCESS' | grep ^HTTP
HTTP/1.1 401 Authentication required
HTTP/1.1 200 OK
Created on 04-01-2017 01:42 AM
Many thanks @Hajime San for writing this one. Now haproxy can't frighten me any more 🙂
Cheers !
Created on 07-25-2018 10:19 AM
You can find HAProxy configs for the Big Data ecosystem and other open source technologies on GitHub:
Created on 01-30-2025 05:42 AM
With these haproxy parameters, HA doesn't actually work. It shows the active nn, then the standby