| #!/usr/bin/env bash |
| |
| # Copyright 2015 TappingStone, Inc. |
| # |
| # This script will install PredictionIO onto your computer! |
| # |
| # Documentation: http://docs.prediction.io |
| # |
| # License: http://www.apache.org/licenses/LICENSE-2.0 |
| |
| OS=`uname` |
| PIO_VERSION=0.9.4 |
| SPARK_VERSION=1.4.1 |
| ELASTICSEARCH_VERSION=1.4.4 |
| HBASE_VERSION=1.0.0 |
| PIO_DIR=$HOME/PredictionIO |
| USER_PROFILE=$HOME/.profile |
| PIO_FILE=PredictionIO-${PIO_VERSION}.tar.gz |
| TEMP_DIR=/tmp |
| |
| DISTRO_DEBIAN="Debian/Ubuntu" |
| DISTRO_OTHER="Other" |
| |
| PGSQL="PostgreSQL" |
| MYSQL="MySQL" |
| ES_HB="Elasticsearch + HBase" |
| |
| # Ask a yes/no question, with a default of "yes". |
| confirm () { |
| echo -ne $@ "[Y/n] " |
| read -r response |
| |
| case ${response} in |
| [yY][eE][sS]|[yY]|"") |
| true |
| ;; |
| [nN][oO]|[nN]) |
| false |
| ;; |
| *) |
| confirm $@ |
| ;; |
| esac |
| } |
| |
| echo -e "\033[1;32mWelcome to PredictionIO $PIO_VERSION!\033[0m" |
| |
| # Detect OS |
| if [[ "$OS" = "Darwin" ]]; then |
| echo "Mac OS detected!" |
| SED_CMD="sed -i ''" |
| elif [[ "$OS" = "Linux" ]]; then |
| echo "Linux OS detected!" |
| SED_CMD="sed -i" |
| else |
| echo -e "\033[1;31mYour OS $OS is not yet supported for automatic install :(\033[0m" |
| echo -e "\033[1;31mPlease do a manual install!\033[0m" |
| exit 1 |
| fi |
| |
| if [[ $USER ]]; then |
| echo "Using user: $USER" |
| else |
| echo "No user found - this is OK!" |
| fi |
| |
| if [[ "$OS" = "Linux" && $(cat /proc/1/cgroup) == *cpu:/docker/* ]]; then |
| # Docker |
| # REQUIRED: No user input for Docker! |
| echo -e "\033[1;33mDocker detected!\033[0m" |
| echo -e "\033[1;33mForcing Docker defaults!\033[0m" |
| pio_dir=${PIO_DIR} |
| vendors_dir=${pio_dir}/vendors |
| |
| spark_dir=${vendors_dir}/spark-${SPARK_VERSION} |
| elasticsearch_dir=${vendors_dir}/elasticsearch-${ELASTICSEARCH_VERSION} |
| hbase_dir=${vendors_dir}/hbase-${HBASE_VERSION} |
| zookeeper_dir=${vendors_dir}/zookeeper |
| |
| echo "--------------------------------------------------------------------------------" |
| echo -e "\033[1;32mOK, looks good!\033[0m" |
| echo "You are going to install PredictionIO to: $pio_dir" |
| echo -e "Vendor applications will go in: $vendors_dir\n" |
| echo "Spark: $spark_dir" |
| echo "Elasticsearch: $elasticsearch_dir" |
| echo "HBase: $hbase_dir" |
| echo "ZooKeeper: $zookeeper_dir" |
| echo "--------------------------------------------------------------------------------" |
| |
| # Java Install |
| echo -e "\033[1;36mStarting Java install...\033[0m" |
| |
| sudo apt-get update |
| sudo apt-get install openjdk-7-jdk libgfortran3 -y |
| |
| echo -e "\033[1;32mJava install done!\033[0m" |
| |
| JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") |
| elif [[ "$1" == "-y" ]]; then |
| # Non-interactive |
| echo -e "\033[1;33mNon-interactive installation requested!\033[0m" |
| echo -e "\033[1;33mForcing defaults!\033[0m" |
| pio_dir=${PIO_DIR} |
| vendors_dir=${pio_dir}/vendors |
| source_setup=${ES_HB} |
| |
| spark_dir=${vendors_dir}/spark-${SPARK_VERSION} |
| elasticsearch_dir=${vendors_dir}/elasticsearch-${ELASTICSEARCH_VERSION} |
| hbase_dir=${vendors_dir}/hbase-${HBASE_VERSION} |
| zookeeper_dir=${vendors_dir}/zookeeper |
| |
| echo "--------------------------------------------------------------------------------" |
| echo -e "\033[1;32mOK, looks good!\033[0m" |
| echo "You are going to install PredictionIO to: $pio_dir" |
| echo -e "Vendor applications will go in: $vendors_dir\n" |
| echo "Spark: $spark_dir" |
| echo "Elasticsearch: $elasticsearch_dir" |
| echo "HBase: $hbase_dir" |
| echo "ZooKeeper: $zookeeper_dir" |
| echo "--------------------------------------------------------------------------------" |
| |
| # Java Install |
| echo -e "\033[1;36mStarting Java install...\033[0m" |
| |
| # todo: make java installation platform independent |
| sudo apt-get update |
| sudo apt-get install openjdk-7-jdk libgfortran3 python-pip -y |
| sudo pip install predictionio |
| |
| echo -e "\033[1;32mJava install done!\033[0m" |
| |
| JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") |
| else |
| # Interactive |
| while true; do |
| echo -e "\033[1mWhere would you like to install PredictionIO?\033[0m" |
| read -e -p "Installation path ($PIO_DIR): " pio_dir |
| pio_dir=${pio_dir:-$PIO_DIR} |
| |
| read -e -p "Vendor path ($pio_dir/vendors): " vendors_dir |
| vendors_dir=${vendors_dir:-$pio_dir/vendors} |
| |
| echo -e "\033[1mPlease choose between the following sources (1, 2 or 3):\033[0m" |
| select source_setup in "$PGSQL" "$MYSQL" "$ES_HB"; do |
| case ${source_setup} in |
| "$PGSQL") |
| break |
| ;; |
| "$MYSQL") |
| break |
| ;; |
| "$ES_HB") |
| break |
| ;; |
| *) |
| ;; |
| esac |
| done |
| |
| if confirm "Receive updates?"; then |
| guess_email='' |
| if hash git 2>/dev/null; then |
| # Git installed! |
| guess_email=$(git config --global user.email) |
| fi |
| |
| if [ -n "${guess_email}" ]; then |
| read -e -p "Email (${guess_email}): " email |
| else |
| read -e -p "Enter email: " email |
| fi |
| email=${email:-$guess_email} |
| |
| url="http://direct.prediction.io/$PIO_VERSION/install.json/install/install/$email/" |
| curl --silent ${url} > /dev/null |
| fi |
| |
| spark_dir=${vendors_dir}/spark-${SPARK_VERSION} |
| elasticsearch_dir=${vendors_dir}/elasticsearch-${ELASTICSEARCH_VERSION} |
| hbase_dir=${vendors_dir}/hbase-${HBASE_VERSION} |
| zookeeper_dir=${vendors_dir}/zookeeper |
| |
| echo "--------------------------------------------------------------------------------" |
| echo -e "\033[1;32mOK, looks good!\033[0m" |
| echo "You are going to install PredictionIO to: $pio_dir" |
| echo -e "Vendor applications will go in: $vendors_dir\n" |
| echo "Spark: $spark_dir" |
| case $source_setup in |
| "$PGSQL") |
| # PostgreSQL installed by apt-get so no path is printed beforehand |
| break |
| ;; |
| "$MYSQL") |
| # MySQL installed by apt-get so no path is printed beforehand |
| break |
| ;; |
| "$ES_HB") |
| echo "Elasticsearch: $elasticsearch_dir" |
| echo "HBase: $hbase_dir" |
| echo "ZooKeeper: $zookeeper_dir" |
| break |
| ;; |
| esac |
| echo "--------------------------------------------------------------------------------" |
| if confirm "\033[1mIs this correct?\033[0m"; then |
| break; |
| fi |
| done |
| |
| echo -e "\033[1mSelect your linux distribution:\033[0m" |
| select distribution in "$DISTRO_DEBIAN" "$DISTRO_OTHER"; do |
| case $distribution in |
| "$DISTRO_DEBIAN") |
| break |
| ;; |
| "$DISTRO_OTHER") |
| break |
| ;; |
| *) |
| ;; |
| esac |
| done |
| |
| # Java Install |
| if [[ ${OS} = "Linux" ]] && confirm "\033[1mWould you like to install Java?\033[0m"; then |
| case ${distribution} in |
| "$DISTRO_DEBIAN") |
| echo -e "\033[1;36mStarting Java install...\033[0m" |
| |
| echo -e "\033[33mThis script requires superuser access!\033[0m" |
| echo -e "\033[33mYou will be prompted for your password by sudo:\033[0m" |
| |
| sudo apt-get update |
| sudo apt-get install openjdk-7-jdk libgfortran3 python-pip -y |
| sudo pip install predictionio |
| |
| echo -e "\033[1;32mJava install done!\033[0m" |
| break |
| ;; |
| "$DISTRO_OTHER") |
| echo -e "\033[1;31mYour disribution not yet supported for automatic install :(\033[0m" |
| echo -e "\033[1;31mPlease install Java manually!\033[0m" |
| exit 2 |
| ;; |
| *) |
| ;; |
| esac |
| fi |
| |
| # Try to find JAVA_HOME |
| echo "Locating JAVA_HOME..." |
| if [[ "$OS" = "Darwin" ]]; then |
| JAVA_VERSION=`echo "$(java -version 2>&1)" | grep "java version" | awk '{ print substr($3, 2, length($3)-2); }'` |
| JAVA_HOME=`/usr/libexec/java_home` |
| elif [[ "$OS" = "Linux" ]]; then |
| JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") |
| fi |
| echo "Found: $JAVA_HOME" |
| |
| # Check JAVA_HOME |
| while [ ! -f "$JAVA_HOME/bin/javac" ]; do |
| echo -e "\033[1;31mJAVA_HOME is incorrect!\033[0m" |
| echo -e "\033[1;33mJAVA_HOME should be a directory containing \"bin/javac\"!\033[0m" |
| read -e -p "Please enter JAVA_HOME manually: " JAVA_HOME |
| done; |
| fi |
| |
| if [ -n "$JAVA_VERSION" ]; then |
| echo "Your Java version is: $JAVA_VERSION" |
| fi |
| echo "JAVA_HOME is now set to: $JAVA_HOME" |
| |
| # PredictionIO |
| echo -e "\033[1;36mStarting PredictionIO setup in:\033[0m $pio_dir" |
| cd ${TEMP_DIR} |
| |
| # delete existing tmp file before download again |
| if [[ -e ${PIO_FILE} ]]; then |
| if confirm "Delete existing $PIO_FILE?"; then |
| rm ${PIO_FILE} |
| fi |
| fi |
| |
| if [[ ! -e ${PIO_FILE} ]]; then |
| echo "Downloading PredictionIO..." |
| curl -O https://d8k1yxp8elc6b.cloudfront.net/${PIO_FILE} |
| fi |
| tar zxf ${PIO_FILE} |
| rm -rf ${pio_dir} |
| mv PredictionIO-${PIO_VERSION} ${pio_dir} |
| |
| if [[ $USER ]]; then |
| chown -R $USER ${pio_dir} |
| fi |
| |
| echo "Updating ~/.profile to include: $pio_dir" |
| PATH=$PATH:${pio_dir}/bin |
| echo "export PATH=\$PATH:$pio_dir/bin" >> ${USER_PROFILE} |
| |
| echo -e "\033[1;32mPredictionIO setup done!\033[0m" |
| |
| mkdir ${vendors_dir} |
| |
| # Spark |
| echo -e "\033[1;36mStarting Spark setup in:\033[0m $spark_dir" |
| if [[ -e spark-${SPARK_VERSION}-bin-hadoop2.6.tgz ]]; then |
| if confirm "Delete existing spark-$SPARK_VERSION-bin-hadoop2.6.tgz?"; then |
| rm spark-${SPARK_VERSION}-bin-hadoop2.6.tgz |
| fi |
| fi |
| if [[ ! -e spark-${SPARK_VERSION}-bin-hadoop2.6.tgz ]]; then |
| echo "Downloading Spark..." |
| curl -O http://d3kbcqa49mib13.cloudfront.net/spark-${SPARK_VERSION}-bin-hadoop2.6.tgz |
| fi |
| tar xf spark-${SPARK_VERSION}-bin-hadoop2.6.tgz |
| rm -rf ${spark_dir} |
| mv spark-${SPARK_VERSION}-bin-hadoop2.6 ${spark_dir} |
| |
| echo "Updating: $pio_dir/conf/pio-env.sh" |
| ${SED_CMD} "s|SPARK_HOME=.*|SPARK_HOME=$spark_dir|g" ${pio_dir}/conf/pio-env.sh |
| |
| echo -e "\033[1;32mSpark setup done!\033[0m" |
| |
| case $source_setup in |
| "$PGSQL") |
| if [[ ${distribution} = "$DISTRO_DEBIAN" ]]; then |
| echo -e "\033[1;36mInstalling PostgreSQL...\033[0m" |
| sudo apt-get install postgresql -y |
| echo -e "\033[1;36mPlease use the default password 'pio' when prompted to enter one\033[0m" |
| sudo -u postgres createdb pio |
| sudo -u postgres createuser -P pio |
| echo -e "\033[1;36mPlease update $pio_dir/conf/pio-env.sh if you did not enter the default password\033[0m" |
| else |
| echo -e "\033[1;31mYour disribution not yet supported for automatic install :(\033[0m" |
| echo -e "\033[1;31mPlease install PostgreSQL manually!\033[0m" |
| exit 3 |
| fi |
| ;; |
| "$MYSQL") |
| if [[ ${distribution} = "$DISTRO_DEBIAN" ]]; then |
| echo -e "\033[1;36mInstalling MySQL...\033[0m" |
| echo -e "\033[1;36mPlease update $pio_dir/conf/pio-env.sh with your database configuration\033[0m" |
| sudo apt-get install mysql-server -y |
| sudo mysql -e "create database pio; grant all on pio.* to pio@localhost identified by 'pio'" |
| echo -e "\033[1;36mUpdating: $pio_dir/conf/pio-env.sh\033[0m" |
| ${SED_CMD} "s|PIO_STORAGE_REPOSITORIES_METADATA_SOURCE=PGSQL|PIO_STORAGE_REPOSITORIES_METADATA_SOURCE=MYSQL|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=PGSQL|PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=MYSQL|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE=PGSQL|PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE=MYSQL|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|PIO_STORAGE_SOURCES_PGSQL|# PIO_STORAGE_SOURCES_PGSQL|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|# PIO_STORAGE_SOURCES_MYSQL|PIO_STORAGE_SOURCES_MYSQL|" ${pio_dir}/conf/pio-env.sh |
| else |
| echo -e "\033[1;31mYour disribution not yet supported for automatic install :(\033[0m" |
| echo -e "\033[1;31mPlease install MySQL manually!\033[0m" |
| exit 4 |
| fi |
| ;; |
| "$ES_HB") |
| # Elasticsearch |
| echo -e "\033[1;36mStarting Elasticsearch setup in:\033[0m $elasticsearch_dir" |
| if [[ -e elasticsearch-${ELASTICSEARCH_VERSION}.tar.gz ]]; then |
| if confirm "Delete existing elasticsearch-$ELASTICSEARCH_VERSION.tar.gz?"; then |
| rm elasticsearch-${ELASTICSEARCH_VERSION}.tar.gz |
| fi |
| fi |
| if [[ ! -e elasticsearch-${ELASTICSEARCH_VERSION}.tar.gz ]]; then |
| echo "Downloading Elasticsearch..." |
| curl -O https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-${ELASTICSEARCH_VERSION}.tar.gz |
| fi |
| tar zxf elasticsearch-${ELASTICSEARCH_VERSION}.tar.gz |
| rm -rf ${elasticsearch_dir} |
| mv elasticsearch-${ELASTICSEARCH_VERSION} ${elasticsearch_dir} |
| |
| echo "Updating: $elasticsearch_dir/config/elasticsearch.yml" |
| echo 'network.host: 127.0.0.1' >> ${elasticsearch_dir}/config/elasticsearch.yml |
| |
| echo "Updating: $pio_dir/conf/pio-env.sh" |
| ${SED_CMD} "s|PIO_STORAGE_REPOSITORIES_METADATA_SOURCE=PGSQL|PIO_STORAGE_REPOSITORIES_METADATA_SOURCE=ELASTICSEARCH|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=PGSQL|PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=LOCALFS|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE=PGSQL|PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE=HBASE|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|PIO_STORAGE_SOURCES_PGSQL|# PIO_STORAGE_SOURCES_PGSQL|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|# PIO_STORAGE_SOURCES_LOCALFS|PIO_STORAGE_SOURCES_LOCALFS|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|# PIO_STORAGE_SOURCES_ELASTICSEARCH_TYPE|PIO_STORAGE_SOURCES_ELASTICSEARCH_TYPE|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|# PIO_STORAGE_SOURCES_ELASTICSEARCH_HOME=.*|PIO_STORAGE_SOURCES_ELASTICSEARCH_HOME=$elasticsearch_dir|" ${pio_dir}/conf/pio-env.sh |
| |
| echo -e "\033[1;32mElasticsearch setup done!\033[0m" |
| |
| # HBase |
| echo -e "\033[1;36mStarting HBase setup in:\033[0m $hbase_dir" |
| if [[ -e hbase-${HBASE_VERSION}-bin.tar.gz ]]; then |
| if confirm "Delete existing hbase-$HBASE_VERSION-bin.tar.gz?"; then |
| rm hbase-${HBASE_VERSION}-bin.tar.gz |
| fi |
| fi |
| if [[ ! -e hbase-${HBASE_VERSION}-bin.tar.gz ]]; then |
| echo "Downloading HBase..." |
| curl -O http://archive.apache.org/dist/hbase/hbase-${HBASE_VERSION}/hbase-${HBASE_VERSION}-bin.tar.gz |
| fi |
| tar zxf hbase-${HBASE_VERSION}-bin.tar.gz |
| rm -rf ${hbase_dir} |
| mv hbase-${HBASE_VERSION} ${hbase_dir} |
| |
| echo "Creating default site in: $hbase_dir/conf/hbase-site.xml" |
| cat <<EOT > ${hbase_dir}/conf/hbase-site.xml |
| <configuration> |
| <property> |
| <name>hbase.rootdir</name> |
| <value>file://${hbase_dir}/data</value> |
| </property> |
| <property> |
| <name>hbase.zookeeper.property.dataDir</name> |
| <value>${zookeeper_dir}</value> |
| </property> |
| </configuration> |
| EOT |
| |
| echo "Updating: $hbase_dir/conf/hbase-env.sh to include $JAVA_HOME" |
| ${SED_CMD} "s|# export JAVA_HOME=/usr/java/jdk1.6.0/|export JAVA_HOME=$JAVA_HOME|" ${hbase_dir}/conf/hbase-env.sh |
| |
| echo "Updating: $pio_dir/conf/pio-env.sh" |
| ${SED_CMD} "s|# PIO_STORAGE_SOURCES_HBASE|PIO_STORAGE_SOURCES_HBASE|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|PIO_STORAGE_SOURCES_HBASE_HOME=.*|PIO_STORAGE_SOURCES_HBASE_HOME=$hbase_dir|" ${pio_dir}/conf/pio-env.sh |
| ${SED_CMD} "s|# HBASE_CONF_DIR=.*|HBASE_CONF_DIR=$hbase_dir/conf|" ${pio_dir}/conf/pio-env.sh |
| |
| echo -e "\033[1;32mHBase setup done!\033[0m" |
| |
| ;; |
| esac |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| echo "Updating permissions on: $vendors_dir" |
| |
| if [[ $USER ]]; then |
| chown -R $USER ${vendors_dir} |
| fi |
| |
| echo -e "\033[1;32mInstallation done!\033[0m" |
| |
| |
| |
| |
| |
| echo "--------------------------------------------------------------------------------" |
| echo -e "\033[1;32mInstallation of PredictionIO $PIO_VERSION complete!\033[0m" |
| echo -e "\033[1;32mPlease follow documentation at http://docs.prediction.io/start/download/ to download the engine template based on your needs\033[0m" |
| echo -e |
| echo -e "\033[1;33mCommand Line Usage Notes:\033[0m" |
| if [[ ${source_setup} = $ES_HB ]]; then |
| echo -e "To start PredictionIO and dependencies, run: '\033[1mpio-start-all\033[0m'" |
| else |
| echo -e "To start PredictionIO Event Server in the background, run: '\033[1mpio eventserver &\033[0m'" |
| fi |
| echo -e "To check the PredictionIO status, run: '\033[1mpio status\033[0m'" |
| echo -e "To train/deploy engine, run: '\033[1mpio [train|deploy|...]\033[0m' commands" |
| if [[ ${source_setup} = $ES_HB ]]; then |
| echo -e "To stop PredictionIO and dependencies, run: '\033[1mpio-stop-all\033[0m'" |
| fi |
| echo -e "" |
| echo -e "Please report any problems to: \033[1;34msupport@prediction.io\033[0m" |
| echo "--------------------------------------------------------------------------------" |