| # ============LICENSE_START==================================================== |
| # org.onap.dcae |
| # ============================================================================= |
| # Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. |
| # ============================================================================= |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # ============LICENSE_END====================================================== |
| |
| set -x |
| # |
| # get configuration |
| # |
| CODE_SOURCE=$1 |
| CODE_VERSION=$2 |
| CLUSTER_INDEX=$3 |
| CLUSTER_SIZE=$4 |
| CLUSTER_FQDNS=$5 |
| CLUSTER_LOCAL_IPS=$6 |
| CLUSTER_FLOATING_IPS=$7 |
| DATACENTER=$8 |
| REGISTERED_NAME=$9 |
| export JAVA_HOME=/usr/lib/jvm/default-java |
| md5sum /root/.sshkey/id_rsa | awk '{ print $1 }' >/root/.mysqlpw |
| chmod 400 /root/.mysqlpw |
| # |
| # enable outside apt repositories |
| # |
| wget -qO- http://public-repo-1.hortonworks.com/HDP/ubuntu16/2.x/updates/2.6.0.3/hdp.list >/etc/apt/sources.list.d/hdp.list |
| wget -qO- http://repository.cask.co/ubuntu/precise/amd64/cdap/4.1/cask.list >/etc/apt/sources.list.d/cask.list |
| wget -qO- http://repository.cask.co/ubuntu/precise/amd64/cdap/4.1/pubkey.gpg | apt-key add - |
| apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 B9733A7A07513CAD |
| apt-get update |
| # |
| # install software from apt repositories |
| # |
| apt-get install -y default-jdk hadoop-hdfs hadoop-mapreduce hive hbase libsnappy-dev liblzo2-dev hadooplzo spark-master spark-python zip unzip |
| usermod -a -G hadoop hive |
| if [ $CLUSTER_INDEX -lt 3 ] |
| then |
| apt-get install -y zookeeper-server |
| cat <<!EOF >>/etc/zookeeper/conf/zookeeper-env.sh |
| export JAVA_HOME=/usr/lib/jvm/default-java |
| export ZOOCFGDIR=/etc/zookeeper/conf |
| export ZOO_LOG_DIR=/var/log/zookeeper |
| export ZOOPIDFILE=/var/run/zookeeper/zookeeper_server.pid |
| !EOF |
| mkdir -p /var/lib/zookeeper |
| chown zookeeper:zookeeper /var/lib/zookeeper |
| cp /usr/hdp/current/zookeeper-server/etc/init.d/zookeeper-server /etc/init.d/. |
| update-rc.d zookeeper-server defaults |
| service zookeeper-server start |
| fi |
| if [ $CLUSTER_INDEX -eq 2 ] |
| then |
| debconf-set-selections <<! |
| mysql-server mysql-server/root_password password $(cat /root/.mysqlpw) |
| ! |
| debconf-set-selections <<! |
| mysql-server mysql-server/root_password_again password $(cat /root/.mysqlpw) |
| ! |
| apt-get install -y cdap cdap-cli cdap-gateway cdap-kafka cdap-master cdap-security cdap-ui mysql-server mysql-connector-java |
| set +x |
| echo + mysql_secure_installation --use-default |
| mysql_secure_installation --use-default --password=$(cat /root/.mysqlpw) |
| set -x |
| mysql_install_db |
| cp /usr/share/java/mysql-connector-java-*.jar /usr/hdp/current/hive-client/lib/. |
| mkdir -p /usr/lib/hive/logs |
| chown -R hive:hadoop /usr/lib/hive |
| chmod -R 755 /usr/lib/hive |
| fi |
| # |
| # make directories |
| # |
| mkdir -p /hadoop/hdfs/journalnode/cl /hadoop/hdfs/namenode /hadoop/hdfs/data /etc/hadoop/conf /hadoop/yarn/local /hadoop/yarn/log /usr/lib/hadoop/logs /usr/lib/hadoop-mapreduce/logs /usr/lib/hadoop-yarn/logs /usr/lib/hbase/logs /etc/cdap/conf |
| # |
| # set up config files |
| # |
| HDPVER=$(ls /usr/hdp | grep -v current) |
| echo -Dhdp.version=$HDPVER >/usr/hdp/current/spark-client/conf/java-opts |
| echo "export OPTS=\"\${OPTS} -Dhdp.version=$HDPVER\"" >>/etc/cdap/conf/cdap-env.sh |
| cat >/etc/profile.d/hadoop.sh <<'!EOF' |
| HADOOP_PREFIX=/usr/hdp/current/hadoop-client |
| HADOOP_YARN_HOME=/usr/hdp/current/hadoop-yarn-nodemanager |
| HADOOP_HOME=/usr/hdp/current/hadoop-client |
| HADOOP_COMMON_HOME=$HADOOP_HOME |
| HADOOP_CONF_DIR=/etc/hadoop/conf |
| HADOOP_HDFS_HOME=/usr/hdp/current/hadoop-hdfs-namenode |
| HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec |
| YARN_LOG_DIR=/usr/lib/hadoop-yarn/logs |
| HADOOP_LOG_DIR=/usr/lib/hadoop/logs |
| JAVA_HOME=/usr/lib/jvm/default-java |
| JAVA=$JAVA_HOME/bin/java |
| PATH=$PATH:$HADOOP_HOME/bin |
| HBASE_LOG_DIR=/usr/lib/hbase/logs |
| HADOOP_MAPRED_LOG_DIR=/usr/lib/hadoop-mapreduce/logs |
| HBASE_CONF_DIR=/etc/hbase/conf |
| export HADOOP_PREFIX HADOOP_HOME HADOOP_COMMON_HOME HADOOP_CONF_DIR HADOOP_HDFS_HOME JAVA_HOME PATH HADOOP_LIBEXEC_DIR JAVA JARN_LOG_DIR HADOOP_LOG_DIR HBASE_LOG_DIR HADOOP_MAPRED_LOG_DIR HBASE_CONF_DIR |
| !EOF |
| chmod 755 /etc/profile.d/hadoop.sh |
| cat </etc/profile.d/hadoop.sh >>/etc/hadoop/conf/hadoop-env.sh |
| mv /root/.sshkey /var/lib/hadoop-hdfs/.ssh |
| cp /var/lib/hadoop-hdfs/.ssh/id_rsa.pub /var/lib/hadoop-hdfs/.ssh/authorized_keys |
| >/etc/hadoop/conf/dfs.exclude |
| >/etc/hadoop/conf/yarn.exclude |
| chown -R hdfs:hadoop /var/lib/hadoop-hdfs/.ssh /hadoop /usr/lib/hadoop |
| chown -R yarn:hadoop /usr/lib/hadoop-yarn /hadoop/yarn |
| chown -R mapred:hadoop /usr/lib/hadoop-mapreduce |
| chown -R hbase:hbase /usr/lib/hbase |
| chmod 700 /var/lib/hadoop-hdfs/.ssh |
| chmod 600 /var/lib/hadoop-hdfs/.ssh/* |
| sed -i -e '/maxClientCnxns/d' /etc/zookeeper/conf/zoo.cfg |
| |
| cat >/tmp/init.py <<!EOF |
| import os |
| with open('/root/.mysqlpw', 'r') as f: |
| mysqlpw = f.readline().strip() |
| myid=int('$CLUSTER_INDEX') |
| count=$CLUSTER_SIZE |
| fqdns='$CLUSTER_FQDNS'.split(',') |
| localips='$CLUSTER_LOCAL_IPS'.split(',') |
| floatingips='$CLUSTER_FLOATING_IPS'.split(',') |
| with open('/etc/hosts', 'a') as f: |
| f.write("\n") |
| for index in range(0, count): |
| hn=fqdns[index][0: fqdns[index].index('.')] |
| f.write("{ip} {fqdn} {hn}\n".format(ip=localips[index],hn=hn,fqdn=fqdns[index])) |
| |
| def pxc(f, m): |
| a = "<?xml version='1.0' encoding='UTF-8'?>\n<?xml-stylesheet type='text/xsl' href='configuration.xsl'?>\n<configuration>" |
| for n in m.keys(): |
| a = a + "\n <property>\n <name>{n}</name>\n <value>{v}</value>\n </property>".format(n=n,v=m[n]) |
| a = a + "\n</configuration>\n" |
| with open(f, 'w') as xml: |
| xml.write(a) |
| pxc('/etc/hadoop/conf/core-site.xml', { |
| 'fs.defaultFS':'hdfs://cl' |
| }) |
| pxc('/etc/hadoop/conf/hdfs-site.xml', { |
| 'dfs.namenode.datanode.registration.ip-hostname-check':'false', |
| 'dfs.namenode.name.dir':'/hadoop/hdfs/namenode', |
| 'dfs.hosts.exclude':'/etc/hadoop/conf/dfs.exclude', |
| 'dfs.datanode.data.dir':'/hadoop/hdfs/data', |
| 'dfs.journalnode.edits.dir':'/hadoop/hdfs/journalnode', |
| 'dfs.nameservices':'cl', |
| 'dfs.ha.namenodes.cl':'nn1,nn2', |
| 'dfs.namenode.rpc-address.cl.nn1':localips[0]+':8020', |
| 'dfs.namenode.rpc-address.cl.nn2':localips[1]+':8020', |
| 'dfs.namenode.http-address.cl.nn1':localips[0]+':50070', |
| 'dfs.namenode.http-address.cl.nn2':localips[1]+':50070', |
| 'dfs.namenode.shared.edits.dir':'qjournal://'+localips[0]+':8485;'+localips[1]+':8485;'+localips[2]+':8485/cl', |
| 'dfs.journalnode.edits.dir':'/hadoop/hdfs/journalnode', |
| 'dfs.client.failover.proxy.provider.cl':'org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider', |
| 'dfs.ha.fencing.methods':'sshfence(hdfs),shell(/bin/true)', |
| 'dfs.ha.fencing.ssh.private-key-files':'/var/lib/hadoop-hdfs/.ssh/id_rsa', |
| 'dfs.ha.fencing.ssh.connect-timeout':'30000', |
| 'dfs.ha.automatic-failover.enabled':'true', |
| 'ha.zookeeper.quorum':localips[0]+':2181,'+localips[1]+':2181,'+localips[2]+':2181' |
| }) |
| pxc('/etc/hadoop/conf/yarn-site.xml', { |
| 'yarn.nodemanager.vmem-check-enabled':'false', |
| 'yarn.application.classpath':'/etc/hadoop/conf,/usr/hdp/current/hadoop-client/*,/usr/hdp/current/hadoop-client/lib/*,/usr/hdp/current/hadoop-hdfs-client/*,/usr/hdp/current/hadoop-hdfs-client/lib/*,/usr/hdp/current/hadoop-yarn-client/*,/usr/hdp/current/hadoop-yarn-client/lib/*', |
| 'yarn.nodemanager.delete.debug-delay-sec':'43200', |
| 'yarn.scheduler.minimum-allocation-mb':'512', |
| 'yarn.scheduler.maximum-allocation-mb':'8192', |
| 'yarn.nodemanager.local-dirs':'/hadoop/yarn/local', |
| 'yarn.nodemanager.log-dirs':'/hadoop/yarn/log', |
| 'yarn.resourcemanager.zk-address':localips[0]+':2181,'+localips[1]+':2181,'+localips[2]+':2181', |
| 'yarn.resourcemanager.ha.enabled':'true', |
| 'yarn.resourcemanager.ha.rm-ids':'rm1,rm2', |
| 'yarn.resourcemanager.hostname.rm1':localips[1], |
| 'yarn.resourcemanager.hostname.rm2':localips[2], |
| 'yarn.resourcemanager.cluster-id':'cl', |
| 'yarn.resourcemanager.recovery-enabled':'true', |
| 'yarn.resourcemanager.store.class':'org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore', |
| 'yarn.resourcemanager.nodes.exclude-path':'/etc/hadoop/conf/yarn.exclude' |
| }) |
| pxc('/etc/hadoop/conf/mapred-site.xml', { |
| 'mapreduce.application.classpath':'/etc/hadoop/conf,/usr/lib/hadoop/lib/*,/usr/lib/hadoop/*,/usr/hdp/current/hadoop-hdfs-namenode/,/usr/hdp/current/hadoop-hdfs-namenode/lib/*,/usr/hdp/current/hadoop-hdfs-namenode/*,/usr/hdp/current/hadoop-yarn-nodemanager/lib/*,/usr/hdp/current/hadoop-yarn-nodemanager/*,/usr/hdp/current/hadoop-mapreduce-historyserver/lib/*,/usr/hdp/current/hadoop-mapreduce-historyserver/*', |
| 'mapreduce.jobhistory.intermediate-done-dir':'/mr-history/tmp', |
| 'mapreduce.jobhistory.done-dir':'/mr-history/done', |
| 'mapreduce.jobhistory.address':localips[1], |
| 'mapreduce.jobhistory.webapp.address':localips[1] |
| }) |
| pxc('/etc/hbase/conf/hbase-site.xml', { |
| 'hbase.zookeeper.quorum':localips[0]+':2181,'+localips[1]+':2181,'+localips[2]+':2181', |
| 'hbase.rootdir':'hdfs://cl/apps/hbase/data', |
| 'hbase.cluster.distributed':'true' |
| }) |
| pxc('/etc/hive/conf/hive-site.xml', { |
| 'fs.file.impl.disable.cache':'true', |
| 'fs.hdfs.impl.disable.cache':'true', |
| 'hadoop.clientside.fs.operations':'true', |
| 'hive.auto.convert.join.noconditionaltask.size':'1000000000', |
| 'hive.auto.convert.sortmerge.join.noconditionaltask':'true', |
| 'hive.auto.convert.sortmerge.join':'true', |
| 'hive.enforce.bucketing':'true', |
| 'hive.enforce.sorting':'true', |
| 'hive.mapjoin.bucket.cache.size':'10000', |
| 'hive.mapred.reduce.tasks.speculative.execution':'false', |
| 'hive.metastore.cache.pinobjtypes':'Table,Database,Type,FieldSchema,Order', |
| 'hive.metastore.client.socket.timeout':'60s', |
| 'hive.metastore.local':'true', |
| 'hive.metastore.uris':'thrift://' + fqdns[2] + ':9083', |
| 'hive.metastore.warehouse.dir':'/apps/hive/warehouse', |
| 'hive.optimize.bucketmapjoin.sortedmerge':'true', |
| 'hive.optimize.bucketmapjoin':'true', |
| 'hive.optimize.mapjoin.mapreduce':'true', |
| 'hive.optimize.reducededuplication.min.reducer':'1', |
| 'hive.security.authorization.manager':'org.apache.hadoop.hive.ql.security.authorization.DefaultHiveAuthorizationProvider', |
| 'hive.semantic.analyzer.factory.impl':'org.apache.hivealog.cli.HCatSemanticAnalyzerFactory', |
| 'javax.jdo.option.ConnectionDriverName':'com.mysql.jdbc.Driver', |
| 'javax.jdo.option.ConnectionPassword': mysqlpw, |
| 'javax.jdo.option.ConnectionURL':'jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true', |
| 'javax.jdo.option.ConnectionUserName':'root' |
| }) |
| if myid == 2: |
| pxc('/etc/cdap/conf/cdap-site.xml', { |
| 'zookeeper.quorum':localips[0]+':2181,'+localips[1]+':2181,'+localips[2]+':2181/\${root.namespace}', |
| 'router.server.address':localips[2], |
| 'explore.enabled':'true', |
| 'enable.unrecoverable.reset':'true', |
| 'kafka.seed.brokers':localips[2] + ':9092', |
| 'app.program.jvm.opts':'-XX:MaxPermSize=128M \${twill.jvm.gc.opts} -Dhdp.version=$HDPVER -Dspark.yarn.am.extraJavaOptions=-Dhdp.version=$HDPVER' |
| }) |
| with open('/etc/hbase/conf/regionservers', 'w') as f: |
| for ip in localips: |
| f.write('{ip}\n'.format(ip=ip)) |
| with open('/etc/hbase/conf/hbase-env.sh', 'a') as f: |
| f.write("export HBASE_MANAGES_ZK=false\n") |
| with open('/etc/zookeeper/conf/zoo.cfg', 'a') as f: |
| f.write("server.1={L1}:2888:3888\nserver.2={L2}:2888:3888\nserver.3={L3}:2888:3888\nmaxClientCnxns=0\nautopurge.purgeInterval=6\n".format(L1=localips[0],L2=localips[1],L3=localips[2])) |
| with open('/etc/clustermembers', 'w') as f: |
| f.write("export me={me}\n".format(me=myid)) |
| for idx in range(len(localips)): |
| f.write("export n{i}={ip}\n".format(i=idx, ip=localips[idx])) |
| f.write("export N{i}={ip}\n".format(i=idx, ip=floatingips[idx])) |
| with open('/etc/hadoop/conf/slaves', 'w') as f: |
| for idx in range(len(localips)): |
| if idx != myid: |
| f.write("{x}\n".format(x=localips[idx])) |
| if myid < 3: |
| with open('/var/lib/zookeeper/myid', 'w') as f: |
| f.write("{id}".format(id=(myid + 1))) |
| os.system('service zookeeper-server restart') |
| for ip in localips: |
| os.system("su - hdfs -c \"ssh -o StrictHostKeyChecking=no -o NumberOfPasswordPrompts=0 {ip} echo Connectivity to {ip} verified\"".format(ip=ip)) |
| !EOF |
| |
| python /tmp/init.py |
| |
| . /etc/clustermembers |
| waitfor() { |
| while ( ! nc $1 $2 </dev/null ) |
| do |
| echo waiting for $1 port $2 |
| sleep 30 |
| done |
| } |
| # journal nodes are on port 8485 |
| if [ $me -lt 3 ] |
| then |
| su - hdfs -c '$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode' |
| waitfor $n0 8485 |
| waitfor $n1 8485 |
| waitfor $n2 8485 |
| fi |
| if [ $me -eq 0 -a "$setupdone" = "" ] |
| then |
| su - hdfs -c 'hdfs namenode -format -nonInteractive' |
| su - hdfs -c 'hdfs zkfc -formatZK' |
| fi |
| if [ $me -eq 1 -a "$setupdone" = "" ] |
| then |
| waitfor $n0 8020 |
| su - hdfs -c 'hdfs namenode -bootstrapStandby -nonInteractive' |
| su - yarn -c 'yarn resourcemanager -format-state-store' |
| fi |
| if [ $me -eq 0 -o $me -eq 1 ] |
| then |
| su - hdfs -c '$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc' |
| su - hdfs -c '$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode' |
| fi |
| su - hdfs -c '$HADOOP_HOME/sbin/hadoop-daemon.sh start datanode' |
| if [ $me -eq 1 -o $me -eq 2 ] |
| then |
| su - yarn -c '/usr/hdp/current/hadoop-yarn-nodemanager/sbin/yarn-daemon.sh start resourcemanager' |
| fi |
| su - yarn -c '/usr/hdp/current/hadoop-yarn-nodemanager/sbin/yarn-daemon.sh start nodemanager' |
| waitfor $n0 8020 |
| waitfor $n1 8020 |
| su - hdfs -c 'hdfs dfsadmin -safemode wait' |
| if [ $me -eq 1 ] |
| then |
| if [ "$setupdone" = "" ] |
| then |
| su - hdfs -c 'hdfs dfs -mkdir -p /mr-history/tmp' |
| su - hdfs -c 'hdfs dfs -chmod -R 1777 /mr-history/tmp' |
| su - hdfs -c 'hdfs dfs -mkdir -p /mr-history/done' |
| su - hdfs -c 'hdfs dfs -chmod -R 1777 /mr-history/done' |
| su - hdfs -c 'hdfs dfs -chown -R mapred:hdfs /mr-history' |
| su - hdfs -c 'hdfs dfs -mkdir -p /app-logs' |
| su - hdfs -c 'hdfs dfs -chmod -R 1777 /app-logs' |
| su - hdfs -c 'hdfs dfs -chown yarn:hdfs /app-logs' |
| su - hdfs -c 'hdfs dfs -mkdir -p /apps/hbase/staging /apps/hbase/data' |
| su - hdfs -c 'hdfs dfs -chown hbase:hdfs /apps/hbase/staging /apps/hbase/data' |
| su - hdfs -c 'hdfs dfs -chmod 711 /apps/hbase/staging' |
| su - hdfs -c 'hdfs dfs -chmod 755 /apps/hbase/data' |
| su - hdfs -c 'hdfs dfs -chown hdfs:hdfs /apps/hbase' |
| su - hdfs -c 'hdfs dfs -mkdir -p /user/yarn' |
| su - hdfs -c 'hdfs dfs -chown yarn:yarn /user/yarn' |
| su - hdfs -c 'hdfs dfs -mkdir -p /cdap/tx.snapshot' |
| su - hdfs -c 'hdfs dfs -chown yarn:yarn /cdap /cdap/tx.snapshot' |
| su - hdfs -c 'hdfs dfs -mkdir -p /user/hive /apps/hive/warehouse /tmp/hive' |
| su - hdfs -c 'hdfs dfs -chown -R hive:hadoop /user/hive /apps/hive /tmp/hive' |
| su - hdfs -c 'hdfs dfs -chmod -R 775 /apps/hive' |
| su - hdfs -c 'hdfs dfs -chmod -R 777 /tmp/hive' |
| fi |
| su - mapred -c '/usr/hdp/current/hadoop-mapreduce-historyserver/sbin/mr-jobhistory-daemon.sh start historyserver' |
| su - hbase -c '/usr/hdp/current/hbase-master/bin/hbase-daemon.sh start master' |
| fi |
| while [ "" != "$( echo get /hbase/master | hbase zkcli 2>&1 | grep 'Node does not exist: /hbase/master')" ] |
| do |
| echo Waiting for hbase master to come up |
| sleep 30 |
| done |
| su - hbase -c '/usr/hdp/current/hbase-regionserver/bin/hbase-daemon.sh start regionserver' |
| |
| if [ $me -eq 2 ] |
| then |
| if [ "$setupdone" = "" ] |
| then |
| su - hive -c '/usr/hdp/current/hive-metastore/bin/schematool -initSchema -dbType mysql' |
| fi |
| su - hive -c 'nohup /usr/hdp/current/hive-metastore/bin/hive --service metastore >>/var/log/hive/hive.out 2>>/var/log/hive/hive.log </dev/null &' |
| (cd /bin; wget https://raw.githubusercontent.com/caskdata/cdap-monitoring-tools/develop/nagios/check_cdap/bin/check_cdap) |
| chmod 755 /bin/check_cdap |
| wget -qO- $CODE_SOURCE/${CODE_VERSION}/cloud_init/instconsulagentub16.sh >/tmp/cinst.sh |
| bash /tmp/cinst.sh <<!EOF |
| { |
| "bind_addr": "0.0.0.0", |
| "client_addr": "0.0.0.0", |
| "advertise_addr": "$n2", |
| "data_dir": "/opt/consul/data", |
| "datacenter": "$DATACENTER", |
| "http_api_response_headers": { |
| "Access-Control-Allow-Origin": "*" |
| }, |
| "rejoin_after_leave": true, |
| "server": false, |
| "ui": false, |
| "enable_syslog": true, |
| "log_level": "info", |
| "service": { |
| "id": "$REGISTERED_NAME", |
| "name": "$REGISTERED_NAME", |
| "address": "$N2", |
| "port": 11015, |
| "checks": [ |
| { |
| "script": "/bin/check_cdap", |
| "interval": "60s" |
| } |
| ] |
| } |
| } |
| !EOF |
| for i in $(cd /etc/init.d; echo *cdap*) |
| do |
| service $i start |
| done |
| fi |
| |
| if [ "$setupdone" = "" ] |
| then |
| echo setupdone=true >>/etc/clustermembers |
| fi |