Skip to content

Latest commit

 

History

History
715 lines (495 loc) · 25.2 KB

DevelopingHadoop.rst

File metadata and controls

715 lines (495 loc) · 25.2 KB

RedHat系の開発パッケージのインストール。:

sudo yum install git gcc gcc-c++ java-1.7.0-openjdk-devel cmake zlib-devel openssl-devel

protobuf、maven、findbugsは別途手動でインストール。:

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk.x86_64
export PATH=$JAVA_HOME/bin:$PATH

export MVN_HOME=/opt/maven
export PATH=$PATH:$MVN_HOME/bin

export FINDBUGS_HOME=/opt/findbugs
export PATH=$PATH:$FINDBUGS_HOME/bin
$ git clone https://github.com/protocolbuffers/protobuf
$ cd protobuf
$ git checkout v2.5.0
$ git cherry-pick -x f0b6a5cfeb5f6347c34975446bda08e0c20c9902
$ git cherry-pick -x 2ca19bd8066821a56f193e7fca47139b25c617ad
$ autoreconf -i
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
$ sudo ldconfig

hadoop-distから実行できるようにpackage:

mvn package -Pdist -Pnative -DskipTests -DskipITs

dist環境は mvn clean したら消えてしまうので、 とりあえず適当な場所に移動して利用するとよい。:

mv ~/srcs/hadoop-common/hadoop-dist/target/hadoop-3.0.0-SNAPSHOT ~/dist/

hadoopのsiteドキュメントのビルド。各サブプロジェクトのディレクトリ内でも同様。:

mvn site site:stage -DstagingDirectory=/var/www/html/hadoop-site

branch-2のdistビルドにはJDK 7を使う必要があるが、 Maven Centralが?TLS 1.0, 1.1をサポートしなくなったことに起因して、 システムプロパティでTLS 1.2を明示的に指定する。 compileはJDK 8でも通るが、Javadoc warningsに起因してdistビルドは失敗する。:

mvn clean package -Dhttps.protocols=TLSv1.2 -DskipTests -DskipShade -Pdist -Pnative

HBaseビルド時のHadoopのバージョン指定方法。:

mvn package -Phadoop-2.0 -Dhadoop-two.version=2.5.0-SNAPSHOT -DskipTests

HBase Reference Manualのビルド。事前に一度siteをビルドして、Javadocを生成する必要がある。:

mvn site
mvn docbkx:generate-html

Maven CentralがTLS 1.0, 1.1を許容しなくなったため、Java 7でのビルド実行時には、https.protocolsの指定が必要になった。:

mvn -Dhttps.protocols=TLSv1.2 install

サブプロジェクトには hadoop-main -> hadoop-project -> hadoop-common のような親子関係があるため、サブツリーにcdしてビルドを実行するには、 一度ソースツリーのトップでhadoop-mainやhadoop-projectをinstallしておく必要がある。:

mvn install -pl :hadoop-main -pl :hadoop-project -DskipTests

target/test/checkstyle-errors.xml に結果が出力されるが、 -Dcheckstyle.consoleOutput=true を付けるとコンソールにもテキストで出力される。 XMLと比較して見やすいかというとそれほどでもない。:

mvn compile checkstyle:checkstyle -Dcheckstyle.consoleOutput=true

target/findbugsXml.xmlに結果が出力される。 普通の人間に読むことは難しいため、convertXmlToTextコマンドを利用するとよい。:

$ mvn compile findbugs:findbugs
$ /opt/findbugs-3.0.0/bin/convertXmlToText -longBugCodes target/findbugsXml.xml
$ mvn clean compile -Dmaven.compiler.showDeprecation=true

特定のテストクラスを実行したい場合は、testプロパティの値としてクラス名を指定する。 テストクラスが含まれているプロジェクトのディレクトリに移動した方が、時間節約になる。:

$ cd hadoop-common-project/hadoop-common/
$ mvn test -Dtest=TestConfiguration

-Dtest=クラス名#メソッド名 という指定で、特定のテストケースだけを実行することもできる。:

$ mvn test -Dtest=TestConfiguration#testVariableSubstitution

Parameterized tests の場合、 メソッド名ずばりではマッチしないが、後ろにアスタリスクをつけるとマッチする。 コマンドラインからパラメータを指定することができるのかは不明。:

$ mvn test '-Dtest=TestWebHdfsTimeouts#testConnectTimeout*'

テストコード中で出力されるログは、 target/surefire-reportsディレクトリ下のファイルに出力される。:

$ less target/surefire-reports/org.apache.hadoop.conf.TestConfiguration-output.txt

テストを複数プロセスで並列実行。これでポートやファイルについてのraceによる問題を再現できる場合がある。:

$ mvn test -Pparallel-tests

失敗するテストがあっても、全部流す。:

$ mvn test -Dmaven.test.failure.ignore=true

flaky testでエラーを再現するためにテストを繰り返し実行する場合の例。:

$ for i in `seq 100` ; do echo $i && mvn test -Dtest=TestBPOfferService -DignoreTestFailure=false || break ; done

cmakeでnativeモジュールのテストを実行したい場合には、 -Dtest の値に allNative を指定する。:

$ mvn test -Pnative -Dtest=allNative

https://hadoop.apache.org/docs/r3.1.0/hadoop-project-dist/hadoop-common/filesystem/testing.html

Filesystem contract testが実行されるかどうかは、 confでfs.contract.test.fs.%sが設定されているかどうかによる。 contract test用の設定は src/test/resources/contract-test-options.xml に書けばロードされるが、 このファイルの存在自体は必須ではない。

逆に、認証が必要なhadoop-awsやhadoop-openstackのtestは、 src/test/resources/auth-keys.xmlというファイルが存在しないと実行されない。 この制御はpom.xmlで定義でされている。:

<profiles>
  <profile>
    <id>tests-off</id>
    <activation>
      <file>
        <missing>src/test/resources/auth-keys.xml</missing>
      </file>
    </activation>
    <properties>
      <maven.test.skip>true</maven.test.skip>
    </properties>
  </profile>

  ...

auth-keys.xmlはsrc/test/recources/core-site.xmlの中でincludeされている。 これをロードするコードがソース中にあるわけではない。

また、hadoop-azureモジュールはauth-keys.xmlではなくazure-auth-keys.xmlというファイル名を想定している。 pom.xmlでの制御もしていない。このあたりの一貫性はいまいち。

signatureをチェック:

$ gpg --verify foo.tar.gz.asc

リリースマネージャのpublic keyを取得する必要がある場合は、以下の要領。:

$ gpg --keyserver pgpkeys.mit.edu --recv-key C36C5F0F

hashcodeをチェック:

$ gpg --print-mds foo.tar.gz | diff - foo.tar.gz.mds && echo "ok."

環境やバージョンの違いに起因して??? gpg --verify の出力の改行位置は一定しない雰囲気。 ワンライナーを利用して適当に合わせる。:

$ cat hadoop-2.7.2-RC2-src.tar.gz.mds | perl -00pe 's/\n[ ]+/ /g' - > 1.mds
$ gpg --print-mds hadoop-2.7.2-RC2-src.tar.gz | perl -00pe 's/\n[ ]+/ /g' - > 2.mds
$ diff 1.mds 2.mds

https://cwiki.apache.org/confluence/display/HADOOP2/HowToRelease の手順の補足

Nexusが使っているkeyserverにpublic keyを送る。:

gpg --keyserver pool.sks-keyservers.net --send-key E206BB0D
gpg --keyserver keyserver.ubuntu.com --send-key E206BB0D

releasenotes, changelog and jdiff reports must be committed to upstream branches.:

export version=3.2.4
cp target/artifacts/RELEASENOTES.md hadoop-common-project/hadoop-common/src/site/markdown/release/${version}/RELEASENOTES.${version}.md
cp target/artifacts/CHANGELOG.md hadoop-common-project/hadoop-common/src/site/markdown/release/${version}/CHANGELOG.${version}.md
cp hadoop-common-project/hadoop-common/target/site/jdiff/xml/Apache_Hadoop_Common_${version}.xml hadoop-common-project/hadoop-common/dev-support/jdiff
cp hadoop-hdfs-project/hadoop-hdfs/target/site/jdiff/xml/Apache_Hadoop_HDFS_${version}.xml hadoop-hdfs-project/hadoop-hdfs/dev-support/jdiff
find hadoop-yarn-project -name "Apache_Hadoop_YARN_*_${version}.xml" | xargs -I{} cp {} hadoop-yarn-project/hadoop-yarn/dev-support/jdiff
find hadoop-mapreduce-project -name "Apache_Hadoop_MapReduce_*_${version}.xml" | xargs -I{} cp {} hadoop-mapreduce-project/dev-support/jdiff
git add hadoop-common-project/hadoop-common/src/site/markdown/release
git add hadoop-common-project/hadoop-common/dev-support/jdiff
git add hadoop-hdfs-project/hadoop-hdfs/dev-support/jdiff
git add hadoop-yarn-project/hadoop-yarn/dev-support/jdiff
git add hadoop-mapreduce-project/dev-support/jdiff
git commit -m 'Make upstream aware of ${version} release.'

The binary tarball can not be uploaded to release tree due to its size. Uploading to dev tree first then mv should work.:

export version=3.2.4
cd ~/srcs/
svn co https://dist.apache.org/repos/dist/dev/hadoop dist-dev-hadoop
cd dist-dev-hadoop/
mkdir hadoop-${version}
cp ~/srcs/hadoop/target/artifacts/* ./hadoop-${version}/
svn add hadoop-${version}
svn ci -m 'Publishing the bits for release ${version}'
svn mv -m 'Publishing the bits for release ${version}' https://dist.apache.org/repos/dist/dev/hadoop/hadoop-${version} https://dist.apache.org/repos/dist/release/hadoop/common/
  • dist環境のjarを手動で置き換え。:

    mvn package -DskipTests
    cp ~/srcs/hadoop-common/hadoop-common-project/hadoop-common/target/hadoop-common-3.0.0-SNAPSHOT.jar \
       ~/srcs/hadoop-common/hadoop-dist/target/hadoop-3.0.0-SNAPSHOT/share/hadoop/common/
    cp ~/srcs/hadoop-common/hadoop-hdfs-project/hadoop-hdfs/target/hadoop-hdfs-3.0.0-SNAPSHOT.jar \
       ~/srcs/hadoop-common/hadoop-dist/target/hadoop-3.0.0-SNAPSHOT/share/hadoop/hdfs/
    find ~/srcs/hadoop-common/hadoop-yarn-project -name '*SNAPSHOT.jar' \
      | xargs -I XARGS cp XARGS ~/srcs/hadoop-common/hadoop-dist/target/hadoop-3.0.0-SNAPSHOT/share/hadoop/yarn
    
  • ローカルリポジトリからモノを削除。:

    rm ~/.m2/repository/org/apache/hadoop/hadoop-{project,common,hdfs}/3.0.0-SNAPSHOT/*
    rm ~/.m2/repository/org/apache/hadoop/hadoop-*/3.0.0-SNAPSHOT/*
    
  • sleepジョブの起動。:

    $ bin/mapred org.apache.hadoop.test.MapredTestDriver sleep ...
    

多くのHadoop系プロダクトでは、 Mavenによるビルド時にapache-rat-pluginによるライセンスのチェックが入る。 .gitやprotobufで生成されるファイル、画像ファイルなど、 チェックから除外したファイルについては、 pom.xmlのpluginの設定で指定する必要がある。:

<plugin>
  <groupId>org.apache.rat</groupId>
  <artifactId>apache-rat-plugin</artifactId>
  <configuration>
    <excludes>
      <exclude>.git/**</exclude>
      <exclude>.svn/**</exclude>
      <exclude>.idea/**</exclude>
      <exclude>**/.settings/**</exclude>
      <exclude>**/generated/**</exclude>
      <exclude>src/site/resources/images/*</exclude>
      <exclude>src/main/webapps/static/bootstrap-3.0.2/**</exclude>
    </excludes>
  </configuration>
</plugin>

GNU GLOBAL 6.3.2以降とpygmetnsの組み合わせが便利。 EPELのYumリポジトリからpipをインストールし、pipでpygmentsをインストールする。:

$ sudo yum ctags
$ sudo yum --enablerepo=epel install python-pip
$ sudo pip install pygments

タグファイルを作る場合は、 --gtagslabel オプションの値にpygmentsを指定。:

$ gtags --gtagslabel=pygments

.goのタグを作りたい場合は、 ~/.ctags に以下の内容を追加する。:

--langdef=Go
--langmap=Go:.go
--regex-Go=/func([ \t]+\([^)]+\))?[ \t]+([a-zA-Z0-9_]+)/\2/d,func/
--regex-Go=/var[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/d,var/
--regex-Go=/type[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/d,type/

.scalaのタグ作りには、 ~/.ctags に以下の内容を追加する。:

--langdef=scala
--langmap=scala:.scala
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private|protected)?[ \t]*class[ \t]+([a-zA-Z0-9_]+)/\4/c,classes/
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private|protected)?[ \t]*object[ \t]+([a-zA-Z0-9_]+)/\4/c,objects/
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private|protected)?[ \t]*case class[ \t]+([a-zA-Z0-9_]+)/\4/c,case classes/
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private|protected)?[ \t]*case object[ \t]+([a-zA-Z0-9_]+)/\4/c,case objects/
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private|protected)?[ \t]*trait[ \t]+([a-zA-Z0-9_]+)/\4/t,traits/
--regex-scala=/^[ \t]*type[ \t]+([a-zA-Z0-9_]+)/\1/T,types/
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*def[ \t]+([a-zA-Z0-9_]+)/\3/m,methods/
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*val[ \t]+([a-zA-Z0-9_]+)/\3/l,constants/
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*var[ \t]+([a-zA-Z0-9_]+)/\3/l,variables/
--regex-scala=/^[ \t]*package[ \t]+([a-zA-Z0-9_.]+)/\1/p,packages/

side by sideで差分を表示。--no-promptだとファイルの境目が分かりにくいので、yesで。:

$ yes | git difftool -x "diff -y -W 240" | less

EPELからcolordiffをインストールして使うと、より見やすい。:

$ yes | git difftool -x "colordiff -y -W 240" | less -R

上記をより簡単に使うには、PATHの通った場所に、git-sidediffという名前のスクリプトを作っておく。 これを git sidediff というコマンドで呼び出すことができる。:

$ cat > ~/bin/git-sidediff <<EOF
yes | git difftool -x 'colordiff -y -W250' "\$@"| less -R
EOF

$ chmod +x ~/bin/git-sidediff
$ git sidediff arg1 arg2 ...

git show のように特定のcommitのdiffをside by sideで見るためのスクリプトは、以下のような感じ。:

$ cat ~/bin/git-showtool
yes | git difftool -x 'colordiff -y -W250' $1~1 $1 | less -R

どうみてもEclipseやIntelliJを使った方が便利だが、CUIだけの環境で調べるために。 Emacsと組み合わせると意外といける。

  • デバッギのJVMオプション。:

    -agentlib:jdwp=transport=dt_socket,address=localhost:8765,server=y,suspend=y
    
  • jdbのコマンドラインを入力。 -sourcepath オプションと値の間に空白を入れてはいけない。:

    jdb -attach localhost:8765 -sourcepath~/srcs/hadoop-common/hadoop-common-project/hadoop-common/src/main/java:~/srcs/hadoop-common/hadoop-hdfs-project/hadoop-hdfs/src/main/java
    
  • Emacsを使う場合、 M-x jdb を押した後、上記のコマンドラインを入力。

  • yarnも含めた場合。:

    jdb -attach localhost:8765 -sourcepath~/srcs/hadoop-common/hadoop-common-project/hadoop-common/src/main/java:~/srcs/hadoop-common/hadoop-hdfs-project/hadoop-hdfs/src/main/java:~/srcs/hadoop-common/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java
    
  • findコマンドでまとめて指定する試み:

    jdb -attach localhost:8765 -sourcepath .`find . -wholename '*/src/main/java' -type d -print0 | sed -e 's/\./\:\./g'`
    

試行錯誤用の便利な対話環境として、bin-without-hadoopなSparkのtarballをダウンロードし、spark-shellを利用する。:

$ SPARK_DIST_CLASSPATH=$(../hadoop-3.3.0-SNAPSHOT/bin/hadoop classpath) bin/spark-shell

デバッグ用のオプションや、libhadoop.soをロードするためのオプションを追加する例。:

$ SPARK_SUBMIT_OPTS='-agentlib:jdwp=transport=dt_socket,address=0.0.0.0:8765,server=y,suspend=y -Djava.library.path=/home/iwasakims/dist/hadoop-2.10.1-SNAPSHOT/lib/native' \
    SPARK_DIST_CLASSPATH=$(../hadoop-2.10.1-SNAPSHOT/bin/hadoop classpath) \
    bin/spark-shell \
    --conf spark.executor.heartbeatInterval=600
  • 再帰的にset -xが有効になるようにして、hoge.shをデバッグする。:

    $ sudo /bin/sh -x -c 'export SHELLOPTS && hoge.sh'
    
  • 開発中にコマンドを実行するときは --config path/to/confdir オプションで、 confディレクトリを指定すると便利。:

    bin/hdfs --config ~/etc/hadoop.rmha dfs -ls /
    
  • ただしstart-dfs.shやstart-yarn.shは --config オプションを受け付けないので、 環境変数で指定。:

    HADOOP_CONF_DIR=~/etc/hadoop.rmha sbin/start-dfs.sh
    
$ curl -i -c cookiejar -X PUT 'http://172.32.1.195:14000/webhdfs/v1/tmp/README.txt?user.name=iwasakims&op=CREATE&replication=1'
$ curl -i -X PUT -b cookiejar \
    --header "Content-Type:application/octet-stream" \
    --data-binary @README.txt \
    'http://172.32.1.195:14000/webhdfs/v1/tmp/README.txt?op=CREATE&replication=1&user.name=iwasakims&data=true'
$ curl -i -L -X GET 'http://172.32.1.195:14000/webhdfs/v1/tmp/README.txt?user.name=iwasakims&op=OPEN'
$ keytool -importkeystore -srckeystore ~/.keystore -destkeystore ~/.keystore.p12 -deststoretype pkcs12
$ pk12util -i ~/.keystore.p12 -d ~/nss
$ certutil -L -d ~/nss

$ SSL_DIR=~/nss curl -k --cert tomcat:hogemoge -i -c cookiejar -X PUT 'https://172.32.1.195:14000/webhdfs/v1/tmp/README.txt?user.name=iwasakims&op=CREATE&replication=1'
$ SSL_DIR=~/nss curl -k --cert tomcat:hogemoge -i -X PUT --header "Content-Type:application/octet-stream" --data-binary @README.txt -b cookiejar 'https://172.32.1.195:14000/webhdfs/v1/tmp/README.txt?op=CREATE&replication=1&user.name=iwasakims&data=true'
$ SSL_DIR=~/nss curl -k --cert tomcat:hogemoge -i -L -X GET 'https://172.32.1.195:14000/webhdfs/v1/tmp/README.txt?user.name=iwasakims&op=OPEN'

create keystore file and password file.:

$ mkdir /home/centos/keystores
$ keytool -keystore /home/centos/keystores/kms.keystore -genkey -alias kms -keyalg RSA
$ echo password >> $HADOOP_HOME/share/hadoop/kms/tomcat/lib/kms.keystore.password
$ chmod 600 $HADOOP_HOME/share/hadoop/kms/tomcat/lib/kms.keystore.password

edit kms-site.xml.:

<property>
  <name>hadoop.kms.key.provider.uri</name>
  <value>jceks://file@/home/centos/keystores/kms.keystore</value>
  <description>
    URI of the backing KeyProvider for the KMS.
  </description>
</property>

<property>
  <name>hadoop.security.keystore.java-keystore-provider.password-file</name>
  <value>kms.keystore.password</value>
  <description>
    If using the JavaKeyStoreProvider, the file name for the keystore password.
  </description>
</property>

install and start krb5-server:

sudo yum install krb5-server krb5-libs krb5-workstation
sudo vi /etc/krb5.conf
sudo vi /var/kerberos/krb5kdc/kdc.conf
sudo kdb5_util create -s
sudo kadmin.local -q "addprinc centos/admin"
sudo systemctl start krb5kdc.service
sudo systemctl start kadmin.service

The default_ccache_name in /etc/krb5.conf should the default value otherwise hadoop client library can not find cached credential.:

# default_ccache_name = KEYRING:persistent:%{uid}

The line setting renew_lifetime in /etc/krb5.conf should be commented out due to https://bugs.openjdk.java.net/browse/JDK-8131051.

# renew_lifetime = 7d

creating keytab file for services:

$ mkdir /home/centos/keytab

adding principal and dump keytab file by kadmin:

addprinc -randkey centos/[email protected]
ktadd -k /home/centos/keytab/centos.keytab centos/[email protected]

edit core-site.xml:

<property>
  <name>hadoop.security.authentication</name>
  <value>kerberos</value>
</property>
<property>
  <name>hadoop.security.auth_to_local</name>
  <value>
    RULE:[2:$1](centos)s/^.*$/centos/
    DEFAULT
  </value>
</property>

edit hdfs-site.xml:

<property>
  <name>dfs.block.access.token.enable</name>
  <value>true</value>
</property>
<property>
  <name>dfs.namenode.keytab.file</name>
  <value>/home/centos/keytab/centos.keytab</value>
</property>
<property>
  <name>dfs.namenode.kerberos.principal</name>
  <value>centos/[email protected]</value>
</property>
<property>
  <name>dfs.namenode.kerberos.internal.spnego.principal</name>
  <value>centos/[email protected]</value>
</property>
<property>
  <name>dfs.data.transfer.protection</name>
  <value>authentication</value>
</property>
<property>
  <name>dfs.datanode.keytab.file</name>
  <value>/home/centos/keytab/centos.keytab</value>
</property>
<property>
  <name>dfs.datanode.kerberos.principal</name>
  <value>centos/[email protected]</value>
</property>
<property>
  <name>dfs.http.policy</name>
  <value>HTTPS_ONLY</value>
</property>
<property>
  <name>dfs.web.authentication.kerberos.keytab</name>
  <value>/home/centos/keytab/centos.keytab</value>
</property>
<property>
  <name>dfs.web.authentication.kerberos.principal</name>
  <value>centos/[email protected]</value>
</property>

edit yarn-site.xml:

<property>
  <name>yarn.resourcemanager.principal</name>
  <value>centos/[email protected]</value>
</property>
<property>
  <name>yarn.resourcemanager.keytab</name>
  <value>/home/centos/keytab/centos.keytab</value>
</property>
<property>
  <name>yarn.nodemanager.principal</name>
  <value>centos/[email protected]</value>
</property>
<property>
  <name>yarn.nodemanager.keytab</name>
  <value>/home/centos/keytab/centos.keytab</value>
</property>
<property>
  <name>yarn.nodemanager.container-executor.class</name>
  <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
<property>
  <name>yarn.nodemanager.linux-container-executor.group</name>
  <value>centos</value>
</property>
<property>
  <name>yarn.nodemanager.linux-container-executor.path</name>
  <value>/usr/local/bin/container-executor</value>
</property>

put container-executor binary and conf.:

$ sudo cp container-executor /usr/local/bin/
$ sudo chown root:centos /usr/local/bin/container-executor
$ sudo chmod 6050 /usr/local/bin/container-executor
$ sudo mkdir /usr/local/etc/hadoop
$ sudo vim /usr/local/etc/hadoop/container-executor.cfg

$ cat /usr/local/etc/hadoop/container-executor.cfg
yarn.nodemanager.linux-container-executor.group=centos
banned.users=hdfs,yarn,mapred
allowed.system.users=foo,bar
min.user.id=500

creating keystore for ssl:

$ mkdir /home/centos/keystores
$ keytool -keystore /home/centos/keystores/http.keystore -genkey -alias http -keyalg RSA

edit ssl-site.xml:

<property>
  <name>ssl.server.keystore.location</name>
  <value>/home/centos/http.keystore</value>
</property>
<property>
  <name>ssl.server.keystore.password</name>
  <value>password</value>
</property>
<property>
  <name>ssl.server.keystore.keypassword</name>
  <value>password</value>
</property>

The package version must be fixed with the upstream ones.:

$ wget http://security.ubuntu.com/ubuntu/pool/main/o/openssl/openssl_1.1.1f-1ubuntu2.23_amd64.deb
$ wget http://security.ubuntu.com/ubuntu/pool/main/o/openssl/libssl-dev_1.1.1f-1ubuntu2.23_amd64.deb
$ wget http://security.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb
$ sudo dpkg -i openssl_1.1.1f-1ubuntu2.23_amd64.deb libssl-dev_1.1.1f-1ubuntu2.23_amd64.deb libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb