This is an automated email from the ASF dual-hosted git repository.
liuxun pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino-playground.git
The following commit(s) were added to refs/heads/main by this push:
new ab9dcfa [#85] Enhance playground stability and user experience (#87)
ab9dcfa is described below
commit ab9dcfaa6cb9bd429392bfc0f2a0ad9510b93619
Author: danhuawang <[email protected]>
AuthorDate: Fri Oct 25 00:11:03 2024 +0800
[#85] Enhance playground stability and user experience (#87)
1. add health check: start_period
2. remove resource limit ,add resource requirements in readme
3. improve console output ,persist log file
4. add precheck for ports in use
5. add precheck for docker if works in current user
6. fix Trino unhealthy issue
7. replace folder /user/datastrato to /user/gravitino
8. fix /user/datastrato not exists
9. fix the warning: "MYSQL_ROOT_PASSWORD" is empty string
10. fix the 'version' warning message in console
11. add confirmation for resources requirements
12. change playground usage: ./playground.sh [start | status | stop]
[-y]
<img width="763" alt="image"
src="https://github.com/user-attachments/assets/44a9327d-d33d-4a51-b5d2-bb8581aeafbe">
<img width="1576" alt="image"
src="https://github.com/user-attachments/assets/bcda5375-e381-4da7-b9d1-038c56e98bba">
<img width="1851" alt="image"
src="https://github.com/user-attachments/assets/279f1f79-03cf-4af0-be68-e837cdf17f94">
<img width="1050" alt="image"
src="https://github.com/user-attachments/assets/10dd7485-d1d0-497e-a57b-4d34925ae3f9">
<img width="799" alt="image"
src="https://github.com/user-attachments/assets/64149bd5-79e1-4bc1-8384-7341cfb3d8d6">
<img width="1839" alt="image"
src="https://github.com/user-attachments/assets/c9f3344b-27c8-448d-9a9c-b43ebc2a40fd">
---
README.md | 26 +++--
docker-compose.yaml | 60 +++-------
healthcheck/gravitino-healthcheck.sh | 4 +-
init/common/common.sh | 58 ++++++++++
init/common/init_metalake_catalog.sh | 4 +-
.../gravitino/gravitino-dependency.sh | 37 +++---
init/gravitino/init.sh | 8 +-
init/hive/init.sh | 4 +-
init/jupyter/gravitino-fileset-example.ipynb | 10 +-
init/jupyter/gravitino-spark-trino-example.ipynb | 2 +-
init/spark/init.sh | 9 +-
init/spark/spark-dependency.sh | 46 ++++++++
init/trino/init.sh | 11 +-
playground.sh | 125 +++++++++++++++++++++
14 files changed, 302 insertions(+), 102 deletions(-)
diff --git a/README.md b/README.md
index c365b5b..a81d174 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,11 @@ Depending on your network and computer, startup time may
take 3-5 minutes. Once
## Prerequisites
-Install Git and Docker Compose.
+Install Git, Docker, Docker Compose.
+
+## System Resource Requirements
+
+2 CPU cores, 8 GB RAM, 25 GB disk storage, MacOS or Linux OS (Verified
Ubuntu22.04 Ubuntu24.04 AmazonLinux).
## TCP ports used
@@ -40,25 +44,25 @@ The playground runs a number of services. The TCP ports
used may clash with exis
| playground-trino | 18080 |
| playground-jupyter | 18888 |
-## Start playground
+## Playground usage
+
+### Launch playground
-### Launch all components of playground
```shell
git clone [email protected]:apache/gravitino-playground.git
cd gravitino-playground
-./launch-playground.sh
+./playground.sh start
```
-### Launch special component or components of playground
+### Check status
+```shell
+./playground.sh status
+```
+### Stop playground
```shell
-git clone [email protected]:apache/gravitino-playground.git
-cd gravitino-playground
-./launch-playground.sh hive|gravitino|trino|postgresql|mysql|spark|jupyter
+./playground.sh stop
```
-Note. Components have dependencies, only launching one or several components
cannot experience
-the full functionality of the playground.
-
## Experiencing Apache Gravitino with Trino SQL
### Using Trino CLI in Docker Container
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 0b7e1e2..a4f2964 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -16,7 +16,6 @@
# specific language governing permissions and limitations
# under the License.
#
-version: '3.0'
services:
hive:
image: apache/gravitino-playground:hive-2.7.3
@@ -36,11 +35,7 @@ services:
interval: 10s
timeout: 60s
retries: 5
- deploy:
- resources:
- limits:
- cpus: "3"
- memory: 3G
+ start_period: 20s
gravitino:
image: apache/gravitino:0.6.1-incubating
@@ -57,16 +52,12 @@ services:
volumes:
- ./healthcheck:/tmp/healthcheck
- ./init/gravitino:/tmp/gravitino
- deploy:
- resources:
- limits:
- cpus: "0.5"
- memory: 500M
healthcheck:
test: ["CMD", "/tmp/healthcheck/gravitino-healthcheck.sh"]
interval: 5s
timeout: 60s
retries: 5
+ start_period: 20s
trino:
image: apache/gravitino-playground:trino-435-gravitino-0.6.1-incubating
@@ -83,16 +74,18 @@ services:
volumes:
- ./init/trino:/tmp/trino
- ./init/common:/tmp/common
+ - ./healthcheck:/tmp/healthcheck
depends_on:
hive :
condition: service_healthy
gravitino :
condition: service_healthy
- deploy:
- resources:
- limits:
- cpus: "1"
- memory: 2G
+ healthcheck:
+ test: ["CMD", "/tmp/healthcheck/trino-healthcheck.sh"]
+ interval: 10s
+ timeout: 60s
+ retries: 5
+ start_period: 20s
postgresql:
image: postgres:13
@@ -106,40 +99,31 @@ services:
- "15432:5432"
volumes:
- ./init/postgres:/docker-entrypoint-initdb.d/
- deploy:
- resources:
- limits:
- cpus: "1"
- memory: 500M
mysql:
image: mysql:8.0
container_name: playground-mysql
+ environment:
+ - MYSQL_ROOT_PASSWORD=mysql
+ - MYSQL_USER=mysql
+ - MYSQL_PASSWORD=mysql
+ - MYSQL_DATABASE=db
ports:
- "13306:3306"
volumes:
- ./init/mysql:/docker-entrypoint-initdb.d/
- environment:
- MYSQL_ROOT_PASSWORD: mysql
- MYSQL_USER: mysql
- MYSQL_PASSWORD: mysql
- MYSQL_DATABASE: db
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
- deploy:
- resources:
- limits:
- cpus: "1"
- memory: 500M
healthcheck:
- test: ["CMD-SHELL", "mysqladmin ping -h localhost -p
${MYSQL_ROOT_PASSWORD}"]
+ test: ["CMD-SHELL", "mysqladmin ping -h localhost -pmysql"]
interval: 5s
timeout: 60s
retries: 5
+ start_period: 20s
spark:
image: spark:3.4.1-scala2.12-java11-ubuntu
@@ -153,11 +137,6 @@ services:
- ./init/spark:/tmp/spark
- ./init/common:/tmp/common
- spark_jars:/opt/spark/jars
- deploy:
- resources:
- limits:
- cpus: "1"
- memory: 1G
jupyter:
image: jupyter/pyspark-notebook:spark-3.4.1
@@ -173,11 +152,6 @@ services:
condition: service_healthy
gravitino :
condition: service_healthy
- deploy:
- resources:
- limits:
- cpus: "0.5"
- memory: 500M
volumes:
- spark_jars:
+ spark_jars:
\ No newline at end of file
diff --git a/healthcheck/gravitino-healthcheck.sh
b/healthcheck/gravitino-healthcheck.sh
index 4f9e35f..eb324b7 100755
--- a/healthcheck/gravitino-healthcheck.sh
+++ b/healthcheck/gravitino-healthcheck.sh
@@ -25,7 +25,7 @@ success=false
while [ $attempt -lt $max_attempts ]; do
response=$(curl -X GET -H "Content-Type: application/json"
http://127.0.0.1:8090/api/version)
-
+
if echo "$response" | grep -q "\"code\":0"; then
success=true
break
@@ -33,7 +33,7 @@ while [ $attempt -lt $max_attempts ]; do
echo "Attempt $((attempt + 1)) failed..."
sleep 1
fi
-
+
((attempt++))
done
diff --git a/init/common/common.sh b/init/common/common.sh
new file mode 100644
index 0000000..49ed6f3
--- /dev/null
+++ b/init/common/common.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+download_and_verify() {
+ local jar_url=$1
+ local md5_url=$2
+ local download_dir=$3
+ local jar_file=$(basename "${jar_url}")
+ local md5_file="${jar_file}.md5"
+ echo "Downloading ${jar_file} to ${download_dir}/packages"
+ # If md5 file doesn't exist, then download it
+ if [ ! -f "${download_dir}/packages/${md5_file}" ]; then
+ curl -L -o "${download_dir}/packages/${md5_file}" "${md5_url}"
+ fi
+
+ # If jar file doesn't exist, then download it
+ if [ ! -f "${download_dir}/packages/${jar_file}" ]; then
+ curl -L -o "${download_dir}/packages/${jar_file}" "${jar_url}"
+ fi
+
+ local md5_command
+ if [[ "$(uname)" == "Darwin" ]]; then
+ # macOS
+ md5_command="md5 -q"
+ elif [[ "$(uname)" == "Linux" ]]; then
+ md5_command="md5sum"
+ else
+ break
+ fi
+
+ # Computer jar file md5
+ local_md5=$($md5_command "${download_dir}/packages/${jar_file}" | awk '{
print $1 }')
+ # Get md5 from md5 file
+ file_md5=$(cat "${download_dir}/packages/${md5_file}")
+
+ # Checksum verification
+ if [ "${local_md5}" != "${file_md5}" ]; then
+ echo "Use ${md5_file} to MD5 checksum ${jar_file} verification failed,
Please delete it."
+ exit 1
+ fi
+}
diff --git a/init/common/init_metalake_catalog.sh
b/init/common/init_metalake_catalog.sh
index 8a4a7be..9b2bed4 100644
--- a/init/common/init_metalake_catalog.sh
+++ b/init/common/init_metalake_catalog.sh
@@ -30,7 +30,6 @@ else
fi
fi
-
response=$(curl
http://gravitino:8090/api/metalakes/metalake_demo/catalogs/catalog_hive)
if echo "$response" | grep -q "\"code\":0"; then
true
@@ -65,7 +64,7 @@ if echo "$response" | grep -q "\"code\":0"; then
else
# Create Mysql catalog for experience Gravitino service
response=$(curl -X POST -H "Accept: application/vnd.gravitino.v1+json" -H
"Content-Type: application/json" -d '{ "name":"catalog_mysql",
"type":"RELATIONAL", "provider":"jdbc-mysql", "comment":"comment",
"properties":{ "jdbc-url":"jdbc:mysql://mysql:3306", "jdbc-user":"mysql",
"jdbc-password":"mysql", "jdbc-driver": "com.mysql.cj.jdbc.Driver" } }'
http://gravitino:8090/api/metalakes/metalake_demo/catalogs)
-
+
if echo "$response" | grep -q "catalog_mysql"; then
true # Placeholder, do nothing
else
@@ -87,4 +86,3 @@ else
exit 1
fi
fi
-
diff --git a/launch-playground.sh b/init/gravitino/gravitino-dependency.sh
similarity index 51%
rename from launch-playground.sh
rename to init/gravitino/gravitino-dependency.sh
index 1c220cb..c3a2a29 100755
--- a/launch-playground.sh
+++ b/init/gravitino/gravitino-dependency.sh
@@ -17,26 +17,21 @@
# specific language governing permissions and limitations
# under the License.
#
-# set -ex
-playground_dir="$(dirname "${BASH_SOURCE-$0}")"
-playground_dir="$(cd "${playground_dir}">/dev/null; pwd)"
-isExist=`which docker-compose`
-if [ $isExist ]
-then
- true # Placeholder, do nothing
-else
- echo "ERROR: No docker service environment found, please install
docker-compose first."
- exit
-fi
-
-components=""
-case "${1}" in
- *)
- components=$@
-esac
+gravitino_dir="$(dirname "${BASH_SOURCE-$0}")"
+gravitino_dir="$(
+ cd "${gravitino_dir}" >/dev/null
+ pwd
+)"
+. "${gravitino_dir}/../common/common.sh"
-cd ${playground_dir}
-docker-compose up ${components}
+if [[ ! -d "${gravitino_dir}/packages" ]]; then
+ mkdir -p "${gravitino_dir}/packages"
+fi
+# Prepare download packages
+MYSQL_CONNECTOR_JAVA_JAR="https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.27/mysql-connector-java-8.0.27.jar"
+MYSQL_CONNECTOR_JAVA_MD5="${MYSQL_CONNECTOR_JAVA_JAR}.md5"
+download_and_verify "${MYSQL_CONNECTOR_JAVA_JAR}"
"${MYSQL_CONNECTOR_JAVA_MD5}" "${gravitino_dir}"
-# Clean Docker containers when you quit this script
-docker-compose down
+POSTGRESQL_JAR="https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.7/postgresql-42.2.7.jar"
+POSTGRESQL_MD5="${POSTGRESQL_JAR}.md5"
+download_and_verify "${POSTGRESQL_JAR}" "${POSTGRESQL_MD5}" "${gravitino_dir}"
diff --git a/init/gravitino/init.sh b/init/gravitino/init.sh
index 1c01423..d29d0e1 100644
--- a/init/gravitino/init.sh
+++ b/init/gravitino/init.sh
@@ -17,12 +17,12 @@
# under the License.
#
echo "Start to download the jar package of JDBC"
-wget
https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.27/mysql-connector-java-8.0.27.jar
-O /root/gravitino/catalogs/jdbc-mysql/libs/mysql-connector-java-8.0.27.jar
-wget https://jdbc.postgresql.org/download/postgresql-42.7.0.jar -O
/root/gravitino/catalogs/jdbc-postgresql/libs/postgresql-42.7.0.jar
-cp /root/gravitino/catalogs/jdbc-postgresql/libs/postgresql-42.7.0.jar
/root/gravitino/catalogs/lakehouse-iceberg/libs
+cp /tmp/gravitino/packages/mysql-connector-java-8.0.27.jar
/root/gravitino/catalogs/jdbc-mysql/libs/mysql-connector-java-8.0.27.jar
+cp /tmp/gravitino/packages/postgresql-42.2.7.jar
/root/gravitino/catalogs/jdbc-postgresql/libs/postgresql-42.2.7.jar
+cp /root/gravitino/catalogs/jdbc-postgresql/libs/postgresql-42.2.7.jar
/root/gravitino/catalogs/lakehouse-iceberg/libs
cp /root/gravitino/catalogs/jdbc-mysql/libs/mysql-connector-java-8.0.27.jar
/root/gravitino/catalogs/lakehouse-iceberg/libs
-cp /root/gravitino/catalogs/jdbc-postgresql/libs/postgresql-42.7.0.jar
/root/gravitino/iceberg-rest-server/libs
+cp /root/gravitino/catalogs/jdbc-postgresql/libs/postgresql-42.2.7.jar
/root/gravitino/iceberg-rest-server/libs
cp /root/gravitino/catalogs/jdbc-mysql/libs/mysql-connector-java-8.0.27.jar
/root/gravitino/iceberg-rest-server/libs
cp /tmp/gravitino/gravitino.conf /root/gravitino/conf
echo "Finish downloading"
diff --git a/init/hive/init.sh b/init/hive/init.sh
index aea00c5..9d5c3bd 100644
--- a/init/hive/init.sh
+++ b/init/hive/init.sh
@@ -21,7 +21,7 @@ sed -i '$d' /usr/local/sbin/start.sh
sed -i '$d' /usr/local/sbin/start.sh
sed -i 's|hdfs://localhost:9000|hdfs://hive:9000|g'
/usr/local/hive/conf/hive-site.xml
/bin/bash /usr/local/sbin/start.sh
-hdfs dfs -mkdir /user/iceberg/
-hdfs dfs -mkdir /user/iceberg/warehouse
+hdfs dfs -mkdir -p /user/gravitino
+hdfs dfs -mkdir -p /user/iceberg/warehouse
hdfs dfs -chmod 777 /user/iceberg/warehouse/
tail -f /dev/null
diff --git a/init/jupyter/gravitino-fileset-example.ipynb
b/init/jupyter/gravitino-fileset-example.ipynb
index 6bb78aa..17b7efc 100644
--- a/init/jupyter/gravitino-fileset-example.ipynb
+++ b/init/jupyter/gravitino-fileset-example.ipynb
@@ -23,9 +23,9 @@
"hdfs_client = InsecureClient('http://hive:50070', user='root')\n",
"\n",
"# List HDFS file and directories\n",
- "print(hdfs_client.list('/user/datastrato'))\n",
+ "print(hdfs_client.list('/user/gravitino'))\n",
"\n",
- "# hdfs_client.delete(\"/user/datastrato\")"
+ "hdfs_client.delete(\"/user/gravitino\")"
]
},
{
@@ -124,7 +124,7 @@
"source": [
"# Create schema entity via Gravition client\n",
"schema_name=\"schema\"\n",
- "schema_path=\"/user/datastrato/\"+schema_name\n",
+ "schema_path=\"/user/gravitino/\"+schema_name\n",
"schema_hdfs_path=\"hdfs://hive:9000\"+schema_path\n",
"\n",
"catalog.as_schemas().create_schema(schema_name=schema_name, \n",
@@ -149,7 +149,7 @@
"source": [
"# Create a managed type of Fileset\n",
"managed_fileset_name=\"managed_fileset\"\n",
-
"managed_fileset_path=\"/user/datastrato/\"+schema_name+\"/\"+managed_fileset_name\n",
+
"managed_fileset_path=\"/user/gravitino/\"+schema_name+\"/\"+managed_fileset_name\n",
"managed_fileset_hdfs_path=\"hdfs://hive:9000\"+managed_fileset_path\n",
"\n",
"managed_fileset_ident: NameIdentifier = NameIdentifier.of(schema_name,
managed_fileset_name)\n",
@@ -176,7 +176,7 @@
"outputs": [],
"source": [
"external_fileset_name=\"external_fileset\"\n",
-
"external_fileset_path=\"/user/datastrato/\"+schema_name+\"/\"+external_fileset_name\n",
+
"external_fileset_path=\"/user/gravitino/\"+schema_name+\"/\"+external_fileset_name\n",
"external_fileset_hdfs_path=\"hdfs://hive:9000\"+external_fileset_path\n",
"\n",
"# Create a fileset path in HDFS in advance\n",
diff --git a/init/jupyter/gravitino-spark-trino-example.ipynb
b/init/jupyter/gravitino-spark-trino-example.ipynb
index 0664266..eaf14fe 100644
--- a/init/jupyter/gravitino-spark-trino-example.ipynb
+++ b/init/jupyter/gravitino-spark-trino-example.ipynb
@@ -21,7 +21,7 @@
"spark = SparkSession.builder \\\n",
" .appName(\"PySpark SQL Example\") \\\n",
" .config(\"spark.plugins\",
\"org.apache.gravitino.spark.connector.plugin.GravitinoSparkPlugin\") \\\n",
- " .config(\"spark.jars\",
\"/opt/spark/jars/iceberg-spark-runtime-3.4_2.12-1.5.2.jar,/opt/spark/jars/gravitino-spark-connector-runtime-3.4_2.12-0.6.0-incubating.jar\")
\\\n",
+ " .config(\"spark.jars\",
\"/opt/spark/jars/iceberg-spark-runtime-3.4_2.12-1.5.2.jar,/opt/spark/jars/gravitino-spark-connector-runtime-3.4_2.12-0.6.1-incubating.jar\")
\\\n",
" .config(\"spark.sql.gravitino.uri\", \"http://gravitino:8090\") \\\n",
" .config(\"spark.sql.gravitino.metalake\", \"metalake_demo\") \\\n",
" .config(\"spark.sql.gravitino.enableIcebergSupport\", \"true\") \\\n",
diff --git a/init/spark/init.sh b/init/spark/init.sh
index e0f9c38..798d73f 100644
--- a/init/spark/init.sh
+++ b/init/spark/init.sh
@@ -18,8 +18,9 @@
#
mkdir -p /opt/spark/conf
cp /tmp/spark/spark-defaults.conf /opt/spark/conf
-wget
https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-spark-runtime-3.4_2.12/1.5.2/iceberg-spark-runtime-3.4_2.12-1.5.2.jar
-O /opt/spark/jars/iceberg-spark-runtime-3.4_2.12-1.5.2.jar
-wget
https://repo1.maven.org/maven2/org/apache/gravitino/gravitino-spark-connector-runtime-3.4_2.12/0.6.1-incubating/gravitino-spark-connector-runtime-3.4_2.12-0.6.1-incubating.jar
-O
/opt/spark/jars/gravitino-spark-connector-runtime-3.4_2.12-0.6.1-incubating.jar
-wget
https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.27/mysql-connector-java-8.0.27.jar
-O /opt/spark/jars/mysql-connector-java-8.0.27.jar
-sh /tmp/common/init_metalake_catalog.sh
+cp /tmp/spark/packages/iceberg-spark-runtime-3.4_2.12-1.5.2.jar
/opt/spark/jars/iceberg-spark-runtime-3.4_2.12-1.5.2.jar
+cp
/tmp/spark/packages/gravitino-spark-connector-runtime-3.4_2.12-0.6.1-incubating.jar
/opt/spark/jars/gravitino-spark-connector-runtime-3.4_2.12-0.6.1-incubating.jar
+cp /tmp/spark/packages/mysql-connector-java-8.0.27.jar
/opt/spark/jars/mysql-connector-java-8.0.27.jar
+cp /tmp/spark/packages/kyuubi-spark-authz-shaded_2.12-1.9.2.jar
/opt/spark/jars/kyuubi-spark-authz-shaded_2.12-1.9.2.jar
+sh /tmp/common/init_metalake_catalog.sh
tail -f /dev/null
diff --git a/init/spark/spark-dependency.sh b/init/spark/spark-dependency.sh
new file mode 100755
index 0000000..29c1a85
--- /dev/null
+++ b/init/spark/spark-dependency.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+spark_dir="$(dirname "${BASH_SOURCE-$0}")"
+spark_dir="$(
+ cd "${spark_dir}" >/dev/null
+ pwd
+)"
+. "${spark_dir}/../common/common.sh"
+
+# Prepare download packages
+if [[ ! -d "${spark_dir}/packages" ]]; then
+ mkdir -p "${spark_dir}/packages"
+fi
+
+ICEBERG_SPARK_RUNTIME_JAR="https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-spark-runtime-3.4_2.12/1.5.2/iceberg-spark-runtime-3.4_2.12-1.5.2.jar"
+ICEBERG_SPARK_RUNTIME_MD5="${ICEBERG_SPARK_RUNTIME_JAR}.md5"
+download_and_verify "${ICEBERG_SPARK_RUNTIME_JAR}"
"${ICEBERG_SPARK_RUNTIME_MD5}" "${spark_dir}"
+
+GRAVITINO_SPARK_CONNECTOR_RUNTIME_JAR="https://repo1.maven.org/maven2/org/apache/gravitino/gravitino-spark-connector-runtime-3.4_2.12/0.6.1-incubating/gravitino-spark-connector-runtime-3.4_2.12-0.6.1-incubating.jar"
+GRAVITINO_SPARK_CONNECTOR_RUNTIME_MD5="${GRAVITINO_SPARK_CONNECTOR_RUNTIME_JAR}.md5"
+download_and_verify "${GRAVITINO_SPARK_CONNECTOR_RUNTIME_JAR}"
"${GRAVITINO_SPARK_CONNECTOR_RUNTIME_MD5}" "${spark_dir}"
+
+MYSQL_CONNECTOR_JAVA_JAR="https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.27/mysql-connector-java-8.0.27.jar"
+MYSQL_CONNECTOR_JAVA_MD5="${MYSQL_CONNECTOR_JAVA_JAR}.md5"
+download_and_verify "${MYSQL_CONNECTOR_JAVA_JAR}"
"${MYSQL_CONNECTOR_JAVA_MD5}" "${spark_dir}"
+
+KYUUBI_SPARK_AUTHZ_SHADED_JAR="https://repo1.maven.org/maven2/org/apache/kyuubi/kyuubi-spark-authz-shaded_2.12/1.9.2/kyuubi-spark-authz-shaded_2.12-1.9.2.jar"
+KYUUBI_SPARK_AUTHZ_SHADED_MD5="${KYUUBI_SPARK_AUTHZ_SHADED_JAR}.md5"
+download_and_verify "${KYUUBI_SPARK_AUTHZ_SHADED_JAR}"
"${KYUUBI_SPARK_AUTHZ_SHADED_MD5}" "${spark_dir}"
diff --git a/init/trino/init.sh b/init/trino/init.sh
index 21ba967..922b0d1 100644
--- a/init/trino/init.sh
+++ b/init/trino/init.sh
@@ -17,7 +17,7 @@
# under the License.
#
-sh /tmp/common/init_metalake_catalog.sh
+sh /tmp/common/init_metalake_catalog.sh
/etc/trino/update-trino-conf.sh
nohup /usr/lib/trino/bin/run-trino &
@@ -25,14 +25,13 @@ nohup /usr/lib/trino/bin/run-trino &
counter=0
while [ $counter -le 240 ]; do
counter=$((counter + 1))
- trino_ready=$(trino --execute "SHOW CATALOGS LIKE 'catalog_hive'"| grep
"catalog_hive" | wc -l)
- if [ "$trino_ready" -eq 0 ];
- then
+ trino_ready=$(trino --execute "SHOW CATALOGS LIKE 'catalog_hive'" | grep
"catalog_hive" | wc -l)
+ if [ "$trino_ready" -eq 0 ]; then
echo "Wait for the initialization of services"
- sleep 5;
+ sleep 5
else
echo "Import the data of the Hive warehouse"
- trino < /tmp/trino/init.sql
+ trino </tmp/trino/init.sql
echo "Import ends"
# persist the container
diff --git a/playground.sh b/playground.sh
new file mode 100755
index 0000000..990d5bc
--- /dev/null
+++ b/playground.sh
@@ -0,0 +1,125 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+playground_dir="$(dirname "${BASH_SOURCE-$0}")"
+playground_dir="$(
+ cd "${playground_dir}" >/dev/null
+ pwd
+)"
+
+testDocker() {
+ echo "Testing Docker environment by running hello-world..."
+ docker run --pull always hello-world >/dev/null 2>&1
+ if [ $? -eq 0 ]; then
+ echo "Docker is working correctly!"
+ else
+ echo "There was an issue running the hello-world container. Please check
your Docker installation."
+ exit 1
+ fi
+}
+
+checkCompose() {
+ isExist=$(which docker-compose)
+ if [ $isExist ]; then
+ true # Placeholder, do nothing
+ else
+ echo "ERROR: No docker service environment found. Please install
docker-compose."
+ exit
+ fi
+}
+
+checkPortInUse() {
+ local port=$1
+ if [[ "$(uname)" == "Darwin" ]]; then
+ openPort=$(lsof -i :$port)
+ elif [[ "$(uname)" == "Linux" ]]; then
+ openPort=$(sudo lsof -i :$port)
+ fi
+ if [ -z "${openPort}" ]; then
+ echo "Port $port is ok."
+ else
+ echo "Port $port is in use. Please check it."
+ exit 1
+ fi
+}
+
+start() {
+ echo "Starting the playground..."
+ testDocker
+ checkCompose
+
+ ports=(8090 9001 3307 19000 19083 60070 13306 15342 18080 18888)
+ for port in "${ports[@]}"; do
+ checkPortInUse ${port}
+ done
+
+ cd ${playground_dir}
+ echo "Preparing packages..."
+ ./init/spark/spark-dependency.sh
+ ./init/gravitino/gravitino-dependency.sh
+
+ logSuffix=$(date +%Y%m%d%H%m%s)
+ docker-compose up --detach
+ docker compose logs -f >${playground_dir}/playground-${logSuffix}.log 2>&1 &
+ echo "Check log details: ${playground_dir}/playground-${logSuffix}.log"
+}
+
+status() {
+ docker-compose ps
+}
+
+stop() {
+ echo "Stopping the playground..."
+ docker-compose down
+ if [ $? -eq 0 ]; then
+ echo "Playground stopped!"
+ fi
+}
+
+case "$1" in
+start)
+ if [[ "$2" == "-y" ]]; then
+ input="y"
+ else
+ echo "The playground requires 2 CPU cores, 8 GB of RAM, and 25 GB of disk
storage to operate efficiently."
+ read -r -p "Confirm the requirement is available in your OS [Y/n]:" input
+ fi
+ case $input in
+ [yY][eE][sS] | [yY]) ;;
+ [nN][oO] | [nN])
+ exit 0
+ ;;
+ *)
+ echo "Invalid input!"
+ exit 1
+ ;;
+ esac
+ start
+ ;;
+status)
+ status
+ ;;
+stop)
+ stop
+ ;;
+*)
+ echo "Usage: $0 [start | status | stop]"
+ exit 1
+ ;;
+esac