※当サイトの記事には、広告・プロモーションが含まれます。

Apache Icebergの使い方もよく分かっていないがApache Dorisの環境も構築してみる

gigazine.net

イギリスの計算機科学者でありワールドワイドウェブ(WWW)の発明者として知られるティム・バーナーズ=リー氏が、「私がWWWを無料で提供した理由」について語り、現代のウェブにおける問題点を指摘しました。

「私がワールドワイドウェブを無料で提供した理由」をティム・バーナーズ=リーが記す - GIGAZINE

WWWが機能する上で大切だったのは、「誰もが利用することができ、そして使いたいと思うこと」だったとのこと。ただでさえ難しいこの理想を実現するためには、検索やアップロードごとに料金を請求するわけにはいかず、WWWを成功させるには無料である必要がありました。1993年、バーナーズ=リー氏はCERNの上司らを説得し、WWWの知的財産をパブリックドメインに寄付してもらい、WWWをすべての人々に開放しました。

「私がワールドワイドウェブを無料で提供した理由」をティム・バーナーズ=リーが記す - GIGAZINE

バーナーズ=リー氏は、今日のウェブにおいてもはや自由は存在せず、少数の大規模プラットフォームがユーザーの個人データを収集して商業ブローカーや抑圧的な政府と共有し、10代の若者のメンタルヘルスに悪影響を及ぼすアルゴリズムが偏在していると指摘。バーナーズ=リー氏は、「サービスの利用と引き換えに個人データを売買することは、私が描く自由なウェブのビジョンとは全く相容れません」と主張しています。

「私がワールドワイドウェブを無料で提供した理由」をティム・バーナーズ=リーが記す - GIGAZINE

バーナーズ=リー氏は、「私はWWWを無料で提供しました。なぜなら、ウェブはすべての人にとって機能して、初めて機能するものだと信じていたからです。今日、私はその考えがかつてないほど真実であると信じています。規制とグローバルガバナンスは技術的には実現可能ですが、政治的な意志に大きく依存しています。もし私たちがその意志を結集できれば、ウェブを文化の境界を越えた協働、創造性、そして思いやりのためのツールとして復活させるチャンスがあります。私たちは個人に再び力を与え、ウェブを取り戻すことができるのです。まだ遅くはありません」と述べました。

「私がワールドワイドウェブを無料で提供した理由」をティム・バーナーズ=リーが記す - GIGAZINE

⇧ 人類は歴史から学ばないので、

『「善意」で構築された仕組みが「悪意」によって破壊される』

を繰り返している気がするのよね...

ちなみに、「WWW(World Wide Web)」について、Wikipediaによると、

World Wide Webワールド・ワイド・ウェブ、略名:WWW)はインターネット上で提供されているハイパーテキストシステムである。WebウェブW3(ダブリュー スリー)とも呼ばれる。

World Wide Web - Wikipedia

情報提供を担う者はウェブサーバを公開し、一般利用者はウェブブラウザを介してウェブサーバにある情報を閲覧するようなシステムが基本である。

World Wide Web - Wikipedia

1990年代マルチメディアブームで登場したシステムの内で最も普及したシステムの1つで、技術の進歩に合わせて現在も仕様が更新され続けている。今ではハイパーテキストの枠組みを超えた仕様も追加され、アプリケーションの基盤としても活用されている。

World Wide Web - Wikipedia

また、1980年代に各国で独自に商業展開されていたビデオテックスを置き換えるに至った。

World Wide Web - Wikipedia

インターネットとWorld Wide Webは非常に混同されやすく、誤解に基づく俗称として「インターネット」という表現がWWWを指す場合もある。その逆で「ウェブ」という表現がインターネットを示す場合もあるWeb会議はこれに相当する。

World Wide Web - Wikipedia

歴史

World Wide Webは1950年前後にその起源をもち、1989年に欧州原子核研究機構 (CERN) のティム・バーナーズ=リーによって発明された。1990年後半にその発明は実装され、1990年12月20日に世界初のウェブページが公開された。その後各国でウェブページが続々と公開され、ビューアー(webブラウザ)の普及やプロトコルの仕様策定を経ながら爆発的に広がり、現在に至る。

World Wide Web - Wikipedia

前史

ハイパーテキストの思想自体は1945年に発表されたMemexと、1959年に開発が開始されたoN-Line System1960年に開始されたザナドゥ計画に起源を持つが、World Wide Webの直接の起源については1980年ティム・バーナーズ=リーロバート・カイリューと構築したENQUIRE (エンクワイア)に遡ることができる。

World Wide Web - Wikipedia

その名称は「エンクワイア・ウィズィン・アポン・エブリシング」というビクトリア朝時代の日常生活のハウツー本に由来していて、バーナーズ=リーが幼少のころを思い出して付けたものである。それは現在のウェブとは大分違うが、根本的なアイデアの多くを含んでおり、更にはバーナーズ=リーの WWW 後のプロジェクトである セマンティック・ウェブ の考え方をも含んでいた。しかし、ENQUIRE は一般に公表されるまでには至らなかった。

World Wide Web - Wikipedia

⇧ とあるのですが、1945年に着想があったというのが驚愕ですな。ちょうど「第二次世界大戦」が終戦を迎えた時期に重なる感じということになるっぽいのか...

今が、2025年なので、80年経っていることになるんですな。

Apache Dorisって?

少し前に、

ts0818.hatenablog.com

⇧ 上記の記事で「Apache Iceberg」なるものに触れたのですが、

doris.apache.org

Using Doris and Iceberg

As a new open data management architecture, the Data Lakehouse integrates the high performance and real-time capabilities of a data warehouse with the low cost and flexibility of a data lake, helping users more conveniently meet various data processing and analysis needs. It has been increasingly applied in enterprise big data systems.

https://doris.apache.org/docs/3.0/lakehouse/best-practices/doris-iceberg

In recent versions, Apache Doris has deepened its integration with data lakes and now offers a mature Data Lakehouse solution.

https://doris.apache.org/docs/3.0/lakehouse/best-practices/doris-iceberg

⇧ 何やら、「Apache Doris」なるものものが存在するそうな。

Apache Doris」とは?

doris.apache.org

What's Apache Doris

Apache Doris is an MPP-based real-time data warehouse known for its high query speed. For queries on large datasets, it returns results in sub-seconds. It supports both high-concurrency point queries and high-throughput complex analysis. It can be used for report analysis, ad-hoc queries, unified data warehouse, and data lake query acceleration. Based on Apache Doris, users can build applications for user behavior analysis, A/B testing platform, log analysis, user profile analysis, and e-commerce order analysis.

https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris

Apache Doris, formerly known as Palo, was initially created to support Baidu's ad reporting business. It was officially open-sourced in 2017 and donated by Baidu to the Apache Software Foundation in July 2018, where it was operated by members of the incubator project management committee under the guidance of Apache mentors. In June 2022, Apache Doris graduated from the Apache incubator as a Top-Level Project. By 2024, the Apache Doris community has gathered more than 600 contributors from hundreds of companies in different industries, with over 120 monthly active contributors.

https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris

Apache Doris has a wide user base. It has been used in production environments of over 5000 companies worldwide, including giants such as TikTok, Baidu, Tencent, and NetEase. It is also widely used across industries from finance, retailing, and telecommunications to energy, manufacturing, medical care, etc.

https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris

⇧ 元々は「Baidu」の「広告事業」を支援する目的で開発されたらしい。「データウェアハウス(DWH:Data Ware House)」の1種のようだ。

「Baidu」は、Wikipediaの情報によると、

百度バイドゥ拼音Bǎidù)は、中華人民共和国で最大の検索エンジンを提供する会社である。中国三大ビッグ・テック企業、BAT(百度,アリババ,テンセント)の一つ。創業は2000年1月。本社は北京市にあり、百度百科百度入力方法なども提供している。

百度 - Wikipedia

全世界の検索エンジン市場において、Googleに次いで第2位(米comScore社、2009年8月調べ)、中国大陸ではGoogleなどは利用できず、百度が最大のシェアを占める。中国発の会社であり、また中国を主要市場としているため、「中国のGoogle」と呼ばれることもある

百度 - Wikipedia

2020年12月13日現在のアレクサランキングでの順位は、世界4位、中国国内2位である

百度 - Wikipedia

⇧ とあり、「中国」における「検索エンジン」の市場を席捲している企業らしい。

なのだが、「国」が「Google」の利用を禁止しているらしいので、「中国」で生活しているユーザーに選択肢は無いらしい...

実質、「中国」においては「中国」の国内企業から提供される「検索エンジン」のみの市場となっている気がするので、全世界の市場で統計しても意味が無い気はする...

とは言え、「中国」の人口は多いので膨大な需要が見込めるわけで、且つ、「競合他社」については「中国」内だけを考慮するだけでも良さそうなのは「羨まけしからん」ということなのかしらね...

話が脱線しましたが、「MPP」は「Massively Parallel Processing」という「アーキテクチャ」の略らしい。

Google検索」における「AI」の回答では、

Example: Cloud data warehouses like Snowflake, BigQuery, and Amazon Redshift are built on MPP architecture. 

⇧ とあり、メジャーどころの「クラウドサービスプロバイダー」が提供している「データウェアハウス(DWH:Data Ware House)」の「マネージドサービス」のメジャーどころの「サービス」で利用されている「アーキテクチャ」らしい。

 

Apache Doris」は「分散システム」と言えそうなのだが、

Usage Scenarios

As shown in the figure below, after various data integrations and processing, data sources are typically ingested into the real-time data warehouse Doris and offline lakehouses (such as Hive, Iceberg, and Hudi). These are widely used in OLAP analysis scenarios.

https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris

⇧ 他の「ソフトウェア」との関係は上図のようになるらしい。

で、公式のドキュメントを見た感じでは、

Overall Architecture

Apache Doris uses the MySQL protocol, is highly compatible with MySQL syntax, and supports standard SQL. Users can access Apache Doris through various client tools, and it seamlessly integrates with BI tools. When deploying Apache Doris, you can choose between a storage-compute integrated architecture or a storage-compute separated architecture based on hardware environments and business needs.

https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris

⇧「MySQL」の利用が必要ということらしい。

Apache Icebergの使い方もよく分かっていないがApache Dorisの環境も構築してみる

で、ネットの情報を漁ってみたものの、日本で利用されていないのか、「Docker Compose」で「Apache Doris」を試している情報を発信している人間はいなかった(哀)...

公式のドキュメントによると、

doris.apache.org

⇧「クラスター構成」で構築する場合、

  1. Cluster Deployment
    1. Manual Deployment
    2. Deploy with Docker
    3. Deploy on Kubernetes
    4. Deploy on AWS

の4パターンが用意されているらしい。

ただ、今回は、

doris.apache.org

github.com

⇧ 上記の公式のサンプルで、

  1. Apache Iceberg
  2. Apache Doris

を連携してくれているようなので、利用してみる。

「Docker Compose」を利用して構築するようなので、公式のドキュメントで言うところの「3. Deploy with Docker」に該当する感じなのかね?

とりあえず、

stackoverflow.com

⇧ 上記サイト様の情報が正しいとすると、サンプルは改修が必要そう...

そして、「docker-compose.yml」を確認した感じ、「Java」のバージョンが「jdk1.8.0_202」とあるように古いのが気になるが...

2025年9月27日(土)時点で、「Java」のバージョンは「25」まで出ているので、「Java」のバージョン「8」は相当に古いと言えそうなのよね...

また、「docker-compose.yml」の書き方も古いままだし、作ったら作りっぱなしというのがサンプルでは多い気がするのだが、残念ながら「Apache Doris」のサンプルにおいてもメンテナンスはされていなさそうね...

現状、サンプルは手を加えないと普通に動かない状態になってしまっているのだが、そのまま何も改修しなくても動くものを公開して欲しい...

「Docker イメージ」のバージョンを動作確認ができていた時のバージョンに固定していないのが問題だと思うのだが...

バージョンを固定するのなら、全てのバージョンを固定すれば良い気はするんだが...

中途半端にバージョンを固定するのは意味が無いんよな...

まぁ、「mc」側で「破壊的変更」を実施しているのが一番の問題だとは思うのだが...

「Phind」に上記の「iceberg_and_paimon」のサンプルの「Docker Compose」で生成される各々の「Dockerコンテナ」間の関係について図にして欲しいと質問したところ、以下のような回答が返ってきた。

Apache Iceberg」との通信を加味すると以下のようになるようだ。

更に、「データ」が渡って来る部分まで考慮すると以下のようになるようだ。

図の補足説明:

  • Apache Sparkの外部接続:
    • ポート4040:Web UI用のポートで、ジョブの監視やログ確認が可能
    • ポート8080:Spark Driverとの通信用ポートで、クエリの実行やジョブの送信に使用
    • Sparkクライアントから直接接続可能で、データ処理や分析の実行が可能です
  • Apache Flinkの外部接続:
    • ポート8081:JobManagerへの接続用ポートで、ジョブの送信や管理に使用
    • Flinkクライアントから接続可能で、リアルタイムデータ処理の制御が可能です
    • TaskManagerは内部通信のみで、外部からの直接接続はありません
  • セキュリティに関する注意点:
    • これらのポートは通常、内部ネットワークでのみ公開されます
    • 外部からのアクセスは、適切な認証やファイアウォール設定が必要です
    • 実運用環境では、必要なポートのみを制御された方法で公開することをお勧めします

まぁ、「Apache Iceberg」とか「Apache Doris」とかに関する「アーキテクチャ」の理解ができていないので、「AI」の回答が「幻覚(ハルシネーション)」していたとしても判断しようがないのだが...

そして、今まで「Vagrantfile」で「ディスクサイズ」の変更をしたら、良しなに「ゲストOS」側に割り当てしてくれると思っていたのだが、明示的に「ゲストOS」側で「パーティション」を拡張する必要があったようだ...

jpaztech.github.io

⇧ 上記サイト様が詳しいです。

自分の環境(「ゲストOS」が「AlmaLinux 9系」)では、「/dev/sda4」のサイズを拡張する必要があった。

長々と前置きして恐縮だが、

■D:\work-soft\vagrant\doris

D:\work-soft\vagrant\doris
│  Vagrantfile
│
└─vms
    └─server
        │ docker-compose.yml  
        └─scripts
                setup.sh    

⇧ といったファイル群を用意しておく。

各々のファイルの中身は以下のような感じ。

■D:\work-soft\vagrant\doris\vms\server\docker-compose.yml

#
# 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.
#

#version: "3"

services:
  spark:
    image: tabulario/spark-iceberg
    container_name: doris-iceberg-paimon-spark
    hostname: demo-spark-iceberg
    build: spark/
    volumes:
      - ./packages/jars/paimon-spark-3.5-0.8.0.jar:/opt/spark/jars/paimon-spark-3.5-0.8.0.jar
      - ./packages/jars/paimon-s3-0.8.0.jar:/opt/spark/jars/paimon-s3-0.8.0.jar
      - ./data/table:/opt/data
      - ./data/spark-conf:/opt/spark/conf
      - ./sql/prepare_data.sql:/opt/sql/prepare_data.sql
    depends_on:
      - rest
      - minio
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
    networks:
      - demo-iceberg

  rest:
    image: tabulario/iceberg-rest
    container_name: doris-iceberg-paimon-iceberg-rest
    ports:
      - ${REST_CATALOG_PORT}:8181
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
      - CATALOG_WAREHOUSE=s3://warehouse/wh/
      - CATALOG_IO__IMPL=org.apache.iceberg.aws.s3.S3FileIO
      - CATALOG_S3_ENDPOINT=http://minio:9000
    networks:
      - demo-iceberg
    volumes:
      - './packages/jdk1.8.0_202:/opt/jdk1.8.0_202'
      - './packages/doris-bin:/opt/doris-bin'
      - './scripts:/opt/scripts'

  minio:
    image: minio/minio
    container_name: doris-iceberg-paimon-minio
    ports:
      - ${MINIO_API_PORT}:9000
      - ${MINIO_UI_PORT}:9001
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=password
      - MINIO_DOMAIN=minio
    networks:
      demo-iceberg:
        aliases:
          - warehouse.minio
    command: ["server", "/data", "--console-address", ":9001"]

  mc:
    depends_on:
      - minio
    image: minio/mc
    container_name: doris-iceberg-paimon-mc
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
    networks:
      - demo-iceberg
    entrypoint: >
      /bin/sh -c "
      until (/usr/bin/mc alias set minio http://minio:9000 admin password) do echo '...waiting...' && sleep 1; done;
      /usr/bin/mc rm -r --force minio/warehouse;
      /usr/bin/mc mb minio/warehouse;
      /usr/bin/mc anonymous set public minio/warehouse;
      tail -f /dev/null
      "

  jobmanager:
    image: flink:1.18.0
    container_name: doris-iceberg-paimon-jobmanager
    environment:
      - JOB_MANAGER_RPC_ADDRESS=jobmanager
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
    ports:
      - "8082:8081"
    command: jobmanager
    depends_on:
      - rest
      - minio
    volumes:
      - ./packages/jars/flink-connector-jdbc-3.1.2-1.18.jar:/opt/flink/lib/flink-connector-jdbc-3.1.2-1.18.jar
      - ./packages/jars/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar:/opt/flink/lib/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
      - ./packages/jars/flink-s3-fs-hadoop-1.18.0.jar:/opt/flink/plugins/s3-fs-hadoop/flink-s3-fs-hadoop-1.18.0.jar
      - ./packages/jars/iceberg-flink-runtime-1.18-1.5.2.jar:/opt/flink/lib/iceberg-flink-runtime-1.18-1.5.2.jar
      - ./packages/jars/iceberg-aws-bundle-1.5.2.jar:/opt/flink/lib/iceberg-aws-bundle-1.5.2.jar
      - ./packages/jars/paimon-flink-1.18-0.8.0.jar:/opt/flink/lib/paimon-flink-1.18-0.8.0.jar
      - ./packages/jars/paimon-s3-0.8.0.jar:/opt/flink/lib/paimon-s3-0.8.0.jar
      - ./sql/init_tables.sql:/opt/flink/sql/init_tables.sql
      - ./data/flink-conf:/opt/flink/conf
    networks:
      - demo-iceberg
    deploy:
      replicas: 1

  taskmanager:
    image: flink:1.18.0
    environment:
      - JOB_MANAGER_RPC_ADDRESS=jobmanager
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
    depends_on:
      - jobmanager
    command: taskmanager
    volumes:
      - ./packages/jars/flink-connector-jdbc-3.1.2-1.18.jar:/opt/flink/lib/flink-connector-jdbc-3.1.2-1.18.jar
      - ./packages/jars/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar:/opt/flink/lib/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
      - ./packages/jars/flink-s3-fs-hadoop-1.18.0.jar:/opt/flink/plugins/s3-fs-hadoop/flink-s3-fs-hadoop-1.18.0.jar
      - ./packages/jars/iceberg-flink-runtime-1.18-1.5.2.jar:/opt/flink/lib/iceberg-flink-runtime-1.18-1.5.2.jar
      - ./packages/jars/iceberg-aws-bundle-1.5.2.jar:/opt/flink/lib/iceberg-aws-bundle-1.5.2.jar
      - ./packages/jars/paimon-flink-1.18-0.8.0.jar:/opt/flink/lib/paimon-flink-1.18-0.8.0.jar
      - ./packages/jars/paimon-s3-0.8.0.jar:/opt/flink/lib/paimon-s3-0.8.0.jar
    networks:
      - demo-iceberg
    deploy:
      replicas: 2
  
  doris:
    image: mysql:8.0.18
    container_name: doris-iceberg-paimon-doris
    networks:
      - demo-iceberg
    hostname: doris
    ports:
      - ${DORIS_QUERY_PORT}:9030
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
      - LD_LIBRARY_PATH=/opt/doris/be/lib
      - JAVA_HOME=/opt/jdk8
      - DORIS_HOME=/opt/doris
    volumes:
      - ./packages/jdk1.8.0_202:/opt/jdk8
      - ./packages/doris-bin:/opt/doris-bin
      - ./sql/init_doris.sql:/opt/doris-bin/init_doris.sql
      - ./scripts:/opt/scripts
    command: bin/bash /opt/scripts/start_doris.sh

networks:
  demo-iceberg:
    ipam:
      driver: default    

環境変数が足りていないとか結構、致命的なのだが...

「start_doris.sh」で、「echo "wait log..."」が永久に続いていて、いつまで経っても「/opt/doris/fe/log/fe.log」が作成されずに、処理が進んでいなかったのだが、Dockerコンテナ側の「/opt/doris-bin/conf/fe.conf」の設定が、環境変数の不足で動作しなかったらしいのだが、「start_all.sh」を見る限り「jar」に固める前の話だと思うので、利用者側ではどうにもできんのよな...

いや、まぁ、「拡張子」を「zip」にして「展開(解凍)」という手もあるかもしれないが...

2025年9月30日(火)追記:↓ ここから

何やら、

github.com

github.com

⇧ まさかの「環境変数」の「DORIS_HOME」が「ミュータブル(mutable)」な設計になっているという絶望感たるや...

となると、「/opt/doris/fe/log/fe.log」が作成されない原因が分からなくなってくるんだが...

単純に「メモリ」不足が原因だとすると、吾輩の「PC」のスペック(「メモリ」が「8 GB」しかない)では「iceberg_and_paimon」のサンプルを動作させることは厳しいんかな...

2025年9月30日(火)追記:↑ ここまで

 

どちらにしろ、

■/opt/doris/fe/conf/fe.conf

# ls -la opt/doris/fe/conf
total 12
drwxr-xr-x.  3 root root   49 Sep 29 14:14 .
drwxr-xr-x. 12 root root 4096 Sep 29 14:14 ..
-rw-r--r--.  1 root root 4035 Sep 29 14:14 fe.conf
-rw-r--r--.  1 root root 2480 Sep 29 14:14 ldap.conf
drwxr-xr-x.  2 root root    6 Sep 29 14:14 ssl
# cat opt/doris/fe/conf/fe.conf
# 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.

#####################################################################
## The uppercase properties are read and exported by bin/start_fe.sh.
## To see all Frontend configurations,
## see fe/src/org/apache/doris/common/Config.java
#####################################################################

CUR_DATE=`date +%Y%m%d-%H%M%S`

# Log dir
LOG_DIR = ${DORIS_HOME}/log

# CMS JAVA OPTS
# JAVA_OPTS="-Dsun.security.krb5.debug=true -Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$CUR_DATE"

# G1 JAVA OPTS
JAVA_OPTS="-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:$LOG_DIR/fe.gc.log.$CUR_DATE -Dlog4j2.formatMsgNoLookups=true"

# For jdk 9+, this JAVA_OPTS_FOR_JDK_9 will be used as default CMS JVM options
# JAVA_OPTS_FOR_JDK_9="-Dsun.security.krb5.debug=true -Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time"

# For jdk 9+, this JAVA_OPTS_FOR_JDK_9 will be used as default G1 JVM options
JAVA_OPTS_FOR_JDK_9="-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xlog:gc*:$LOG_DIR/fe.gc.log.$CUR_DATE:time -Dlog4j2.formatMsgNoLookups=true"

# For jdk 17+, this JAVA_OPTS will be used as default JVM options
JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -XX:+UseZGC -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR/ -Xlog:gc*:$LOG_DIR/fe.gc.log.$CUR_DATE:time"

##
## the lowercase properties are read by main program.
##

# store metadata, must be created before start FE.
# Default value is ${DORIS_HOME}/doris-meta
# meta_dir = ${DORIS_HOME}/doris-meta

# Default dirs to put jdbc drivers,default value is ${DORIS_HOME}/jdbc_drivers
# jdbc_drivers_dir = ${DORIS_HOME}/jdbc_drivers

http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
arrow_flight_sql_port = -1

# Choose one if there are more than one ip except loopback address.
# Note that there should at most one ip match this list.
# If no ip match this rule, will choose one randomly.
# use CIDR format, e.g. 10.10.10.0/24 or IP format, e.g. 10.10.10.1
# Default value is empty.
# priority_networks = 10.10.10.0/24;192.168.0.0/16

# Advanced configurations
# log_roll_size_mb = 1024
# INFO, WARN, ERROR, FATAL
sys_log_level = INFO
# NORMAL, BRIEF, ASYNC
sys_log_mode = NORMAL
# sys_log_roll_num = 10
# sys_log_verbose_modules = org.apache.doris
# audit_log_dir = $LOG_DIR
# audit_log_modules = slow_query, query
# audit_log_roll_num = 10
# meta_delay_toleration_second = 10
# qe_max_connection = 1024
# qe_query_timeout_second = 300
# qe_slow_log_ms = 5000
#

⇧ 設定ファイルを見ても、「/opt/doris/fe/log/fe.log」が生成されている箇所が分からんのよね...

後述するが、「/opt/doris/fe/log/fe.log」が生成されないから、「echo "wait log..."」の処理が永遠に続くせいなのか、

■/opt/doris/fe/log/fe.out

# ls -la /opt/doris/fe/log
total 16
drwxr-xr-x.  2 root root   53 Sep 29 14:16 .
drwxr-xr-x. 12 root root 4096 Sep 29 14:14 ..
-rw-r--r--.  1 root root 8172 Sep 29 14:16 fe.gc.log.20250929-141558
-rw-r--r--.  1 root root  525 Sep 29 14:16 fe.out
# cat /opt/doris/fe/log/fe.out
StdoutLogger 2025-09-29 14:16:01,367 using java version 8
StdoutLogger 2025-09-29 14:16:01,382 -Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/opt/doris/fe/log/fe.gc.log.20250929-141558 -Dlog4j2.formatMsgNoLookups=true
StdoutLogger 2025-09-29 14:16:01,628 start time: Mon Sep 29 14:16:01 UTC 2025
library initialization failed - unable to allocate file descriptor table - out of memory

⇧ 上記にあるように「out of memory」でプロセスが強制的にエラー終了しているっぽい...

無駄に費やされた貴重な時間を返して欲しいですわな...

■D:\work-soft\vagrant\doris\vms\server\scripts\setup.sh

#!/bin/bash

SETUP_LOG=/tmp/setup.log
###############################################################
###
### Install Docker daemon for AlmaLinux
### https://docs.docker.com/engine/install/rhel/
###
###############################################################

# 既存のDocker関連パッケージ・podmanなどを削除
sudo dnf remove -y docker \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-engine \
  podman \
  runc

# 必要なプラグインインストール
sudo dnf -y install dnf-plugins-core

# Dockerの公式リポジトリを追加
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

# Docker Engineと関連ツールをインストール
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Dockerサービスを有効化・起動
sudo systemctl enable --now docker

# Dockerサービスの状態を確認(オプション)
sudo systemctl status docker --no-pager

# Dockerのバージョン確認
sudo docker -v >> "${SETUP_LOG}"

# Docker Composeのバージョン確認(docker composeコマンド)
sudo docker compose version >> "${SETUP_LOG}"

###############################################################
###
### Samples that Apache Doris with Apache Iceberg And Paimon
### https://github.com/apache/doris/tree/master/samples/datalake/iceberg_and_paimon
###
###############################################################
# git cloneのためのディレクトリを用意
sudo mkdir -p /app
cd /app
APP_BASE_DIR=$(pwd)
echo "${APP_BASE_DIR}"

# 必要なパッケージのインストール
sudo dnf install -y git wget

# git clone
git clone --filter=blob:none --sparse https://github.com/apache/doris.git

# クローンされたディレクトリに移動する
cd doris
GIT_REPO_BASE_DIR=$(pwd)
echo "${GIT_REPO_BASE_DIR}"

# ローカルリポジトリの初期化
#git init
git config --global init.defaultBranch main

# 部分的に取得
git sparse-checkout set samples/datalake/iceberg_and_paimon

sysctl -w vm.max_map_count=2000000

# ディレクトリ移動
cd samples/datalake/iceberg_and_paimon
DOCKER_COMPOSE_FILE_DIR=$(pwd)
echo "${DOCKER_COMPOSE_FILE_DIR}"
FLINK_SQL_DIR="${DOCKER_COMPOSE_FILE_DIR}/sql"

# 環境変数を用意
# https://docs.docker.com/compose/how-tos/environment-variables/set-environment-variables/
# シェバン (shebang) の行を除く
# ※「#!/bin/bash」の部分を除いた行を抽出するということ
tail -n +2 docker-compose.env > .env
sudo cat .env > docker-compose.env

#### 警告が出ないように、versionをコメントアウト
###sed -i 's/^\(version: "3"\)/#\1/' docker-compose.yml
###
#### 改修
#### https://stackoverflow.com/questions/79656404/docker-compose-with-minio-entrypoint-raises-config-is-not-a-recognized-comman
###read -r -d '' DOCKER_COMPOSE_SERVICE_MC_ENTRYPOINT_SCRIPT <<'EOF'
###until (/usr/bin/mc alias set minio http://minio:9000 admin password); do
###  echo '...waiting...' && sleep 1
###done
###/usr/bin/mc rb --force minio/warehouse
###/usr/bin/mc mb minio/warehouse
###/usr/bin/mc anonymous set public minio/warehouse
###tail -f /dev/null
###EOF
###
#### 改行を \n に、ダブルクォートをエスケープ(順序も安全に)
###ESCAPED_SCRIPT=$(printf "%s" "$DOCKER_COMPOSE_SERVICE_MC_ENTRYPOINT_SCRIPT" \
###  | sed ':a;N;$!ba;s/\n/\\n/g' \
###  | sed 's/"/\\"/g')
###
#### yq のダウンロードとパス指定
###sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 \
###  -O /usr/local/bin/yq && sudo chmod +x /usr/local/bin/yq >> "$SETUP_LOG"
###
####YQ_PATH=$(which yq)
###YQ_PATH="/usr/local/bin/yq"
###
#### ログ出力
###echo "Using yq at: $YQ_PATH" >> "$SETUP_LOG"
###echo "Using yq version: $($YQ_PATH -V)" >> "$SETUP_LOG"
###echo "Updating docker-compose.yml..." >> "$SETUP_LOG"
###
#### YAML の entrypoint を文字列として上書き
###COMPOSE_FILE="${DOCKER_COMPOSE_FILE_DIR}/docker-compose.yml"
###
###REPLACE_SCRIPT="/bin/sh -c ${ESCAPED_SCRIPT}"
###REPLACE_BY_YQ=".services.mc.entrypoint = \"${REPLACE_SCRIPT}"\"
###
###sudo "$YQ_PATH" -i "${REPLACE_BY_YQ}" "$COMPOSE_FILE"

echo "■■■Before execute start_all.sh■■■" >> "${SETUP_LOG}"
sudo cat docker-compose.yml >> "${SETUP_LOG}"

sudo mv /tmp/server/docker-compose.yml "${DOCKER_COMPOSE_FILE_DIR}/docker-compose.yml"

echo "✅ docker-compose.yml has been updated."
# Minioでbucketの作成まで待機するようにする
# 改修対象ファイル
# https://github.com/apache/doris/blob/master/samples/datalake/iceberg_and_paimon/start_all.sh
cat << 'EOF' > wait_script.sh
#!/bin/bash

# 最大リトライ回数(リトライ回数の上限)
MAX_RETRIES=3
# 各リトライ間の間隔(秒) → 60秒 × 3回 = 180秒(3分)
RETRY_INTERVAL=60
# リトライの回数をカウントする用
RETRY_COUNT=0
# 対象のバケット名
TARGET_BUCKET_NAME=warehouse

IS_NOT_READY=true

# 繰り返し処理
while [[ "${IS_NOT_READY}" = true ]]; do
  # TTY無効 & 標準エラー非表示で実行
  IS_CREATED=$(sudo docker compose exec -T mc /usr/bin/mc ls minio 2>/dev/null)

  if $(echo "$IS_CREATED" | grep -q "${TARGET_BUCKET_NAME}"); then
    echo "✅ Success: MinIO bucket '${TARGET_BUCKET_NAME}' is available."
    sleep 10
    IS_NOT_READY=false
  fi

  RETRY_COUNT=$((RETRY_COUNT + 1))
  echo "⏳ Waiting for MinIO bucket '${TARGET_BUCKET_NAME}'... (retry: $RETRY_COUNT/$MAX_RETRIES)"

  if [ "$RETRY_COUNT" -ge "$MAX_RETRIES" ]; then
    echo "❌ Error: MinIO bucket '${TARGET_BUCKET_NAME}' was not found after $((MAX_RETRIES * RETRY_INTERVAL)) seconds."
    break
  fi

  sleep "$RETRY_INTERVAL"
done

# テーブル生成
echo "Ready create table"
sudo docker exec doris-iceberg-paimon-jobmanager sql-client.sh -f /opt/flink/sql/init_tables.sql | sudo tee -a init.log >/dev/null
EOF

# シェルスクリプトファイルの実行権限を付与
sudo chmod +x wait_script.sh

# start_all.shの対象箇所を置き換え
sudo sed -i 's@sudo docker exec -it doris-iceberg-paimon-jobmanager sql-client.sh -f /opt/flink/sql/init_tables.sql | tee -a init.log >/dev/null@sudo bash wait_script.sh@' start_all.sh

# Docker Composeでコンテナを作成・起動
START_DATETIME=$(echo '[START_DATETIME]'`date '+%Y-%m-%dT%H:%M:%S.%3N' --utc`Z)
bash start_all.sh
END_DATETIME=$(echo '[END_DATETIME]'`date '+%Y-%m-%dT%H:%M:%S.%3N' --utc`Z)

echo "${START_DATETIME}"
echo "${END_DATETIME}"

echo "■■■After execute start_all.sh■■■" >> "${SETUP_LOG}"
sudo cat docker-compose.yml >> "${SETUP_LOG}"

# Docker Composeで作成・起動したDockerコンテナの起動状態の確認
sudo docker compose ps

# Docker ComposeでpullされたDocker イメージの確認
sudo docker compose images

# メモリとかチェック
top
free -h
vmstat 1 5

# ディスク領域のサイズ容量表示
df -h

# inode の使用状況を確認
df -i

# /var/log 配下で容量の大きいものをチェック
sudo du -h --max-depth=1 /var/log | sort -hr

# パッケージキャッシュ
#sudo du -h --max-depth=1 /var/cache/yum
sudo du -h --max-depth=1 /var/cache/dnf

# Docker daemonによって使用されているディスク容量に関する情報を表示
sudo docker system df

### no space left on device: unknown の対策
### Docker build cacheの削除
###sudo docker builder prune -f
###
### 不要なDocker Image, Container, Volume, Network の一括削除
###docker system prune --volumes -f
###
#### MySQLのバイナリログ
###sudo find /var/lib/mysql -maxdepth 1 -type f -size +100M -exec ls -lh {} \; | awk '{print $5, $9}'
###
#### InnoDB 共通テーブルスペース
###ls -lh /var/lib/mysql/ibdata1

# 公式のサンプルの手順
# paimon table test
#script -q -c "bash ./start_flink_client.sh" /dev/null
#bash ./start_flink_client.sh

TMP_QUERY_FLINK="${FLINK_SQL_DIR}/tmp-query-flink.sql"
TMP_EXE_QUERY_FLINK=tmp-exe-query-flink.sql

# 一時ファイルを作成
cat <<EOF > "${TMP_QUERY_FLINK}"
use CATALOG paimon;
use paimon.db_paimon;
show tables;
show create table customer;
desc customer;
select * from customer order by c_custkey limit 4;
select * from customer order by c_custkey desc limit 4;
exit;
EOF

# 一時ファイルの内容を確認
echo '### '"${TMP_QUERY_FLINK}"' ###'
cat "${TMP_QUERY_FLINK}"

cat "${FLINK_SQL_DIR}"/init_tables.sql "${TMP_QUERY_FLINK}" > "${FLINK_SQL_DIR}/${TMP_EXE_QUERY_FLINK}"

# 対象のDocker Composeのサービス名
DOCKER_COMPOSE_SERVICE_JOBMANAGER=$(sudo docker compose config --services | grep jobmanager)
echo 'DOCKER_COMPOSE_SERVICE_JOBMANAGER='"${DOCKER_COMPOSE_SERVICE_JOBMANAGER}"

# Dockerホスト側からDockerコンテナ側にファイルコピー
sudo docker compose cp "${FLINK_SQL_DIR}/${TMP_EXE_QUERY_FLINK}" "${DOCKER_COMPOSE_SERVICE_JOBMANAGER}":/opt/flink/sql/"${TMP_EXE_QUERY_FLINK}"

# Dockerコンテナにログインして、コピーしたファイルを実行
# https://stackoverflow.com/questions/67934724/cannot-source-file-in-flink-sql-client
#sudo docker compose exec -it jobmanager sql-client.sh -i /opt/flink/sql/query-flink.sql
sudo docker compose exec -it "${DOCKER_COMPOSE_SERVICE_JOBMANAGER}" sql-client.sh -f /opt/flink/sql/"${TMP_EXE_QUERY_FLINK}"

# 一時ファイルを作成
cat <<EOF > query-doris.sql
use CATALOG paimon;
use paimon.db_paimon;
show tables;
select * from customer order by c_custkey limit 4;
select * from customer order by c_custkey desc limit 4;
explain verbose select * from customer where c_nationkey < 3;
update customer set c_address='c_address_update' where c_nationkey = 1;
explain verbose select * from customer where c_nationkey < 3;
select * from customer where c_nationkey=1 limit 2;
exit;
EOF

# 一時ファイルの内容を確認
echo '### '"query-doris.sql"' ###'
cat query-doris.sql

# 対象のDocker Composeのサービス名
DOCKER_COMPOSE_SERVICE_DORIS=$(sudo docker compose config --services | grep doris)
echo 'DOCKER_COMPOSE_SERVICE_DORIS='"${DOCKER_COMPOSE_SERVICE_DORIS}"

# Dockerホスト側からDockerコンテナ側にファイルコピー
#sudo docker compose cp ./query-doris.sql "${DOCKER_COMPOSE_SERVICE_DORIS}":/tmp/query-doris.sql

# Dockerコンテナにログインして、コピーしたファイルを実行
#script -q -c "bash start_doris_client.sh < ./query-doris.sql" /dev/null
sudo docker exec -i doris-iceberg-paimon-doris sh -c "mysql -u root -h doris -P 9030" < ./query-doris.sql

# 一時ファイルを削除
sudo rm -f "${TMP_QUERY_FLINK}"
sudo rm -f query-doris.sql

■D:\work-soft\vagrant\doris\Vagrantfile

# https://portal.cloud.hashicorp.com/vagrant/discover/almalinux/9
IMAGE_NAME = "almalinux/9"
IMAGE_VESION = "9.6.20250522"

Vagrant.configure("2") do |config|

  config.vm.provider "virtualbox" do |v|
    v.memory = 1024
    v.cpus = 1
  end

  # クライアントVM設定
  config.vm.define "iceberg-client" do |client|
    client.vm.box = IMAGE_NAME
    client.vm.box_version = IMAGE_VESION

    client.vm.hostname = "client"

    # 内部ネットワーク
    client.vm.network "private_network", ip: "192.168.10.1", virtualbox__intnet: "internal_net"

    # クライアントVMに関する設定など
    client.vm.provision "shell", inline: <<-SHELL
      # DNSの接続に関するデバッグ用途
      sudo dnf install -y bind-utils
    SHELL
  end

  # Apache Icebergサーバー用VM設定(Apache Icebergインストール)
  config.vm.define "iceberg-server" do |server|
    server.vm.provider "virtualbox" do |v|
      #v.memory = 2048
      #v.memory = 3072
      v.memory = 4096
      #v.memory = 6144
      v.cpus = 2
    end
    
    #server.vm.disk :disk, size: "200GB", name: "iceberg-disk", auto_resize: true
    server.vm.disk :disk, size: "100GB", primary: true
    server.vm.disk :disk, size: "100GB", name: "extra_storage"

    server.vm.box = IMAGE_NAME
    server.vm.box_version = IMAGE_VESION

    # Apache Icebergサーバー用VMのホスト名を設定
    server.vm.hostname = "iceberg.local"
    
    # ホストオンリーアダプター
    # ホスト側のブラウザからApache Icebergに接続するため用
    server.vm.network "private_network", ip: "192.168.56.201"
    # 内部ネットワーク
    server.vm.network "private_network", ip: "192.168.10.2", virtualbox__intnet: "internal_net"
    
    # ホスト側からゲストOS側にファイルコピー
    server.vm.provision "file", source: "vms/server/scripts/setup.sh", destination: "/tmp/server/scripts/setup.sh"

    # Apache Icebergサーバー用VMにDockerをインストール
    server.vm.provision "shell", inline: <<-SHELL
      # ディスク拡張用のパッケージをインストール
      sudo dnf install -y cloud-utils-growpart
      
      # ディスクの使用割合を確認
      df -hT /
      
      # パーティションを拡張
      sudo growpart /dev/sda 4

      # ファイルシステム(ext4)を拡張
      xfs_growfs /dev/sda4
      
      # ディスクの使用割合を確認
      df -hT /

      # シェルスクリプト(セットアップ)の実行権限を付与
      chmod +x /tmp/server/scripts/setup.sh
      
      # シェルスクリプト(セットアップ)の実行
      /tmp/server/scripts/setup.sh
    SHELL
  end

end

⇧ で「保存」。

「yq」で「docker-compose.yml」の内容を修正したかったのだが、スクリプトの正解が分からないので、事前に改修した「docker-compose.yml」を用意しておき、丸ごと差し替える方針に変更した。

なので「yq」は利用していません。

ちなみに、

takamii.hatenablog.com

Googleで yq を検索すると、なんと全く異なる2種類がヒットします。

jqのyaml版コマンド yq は2種類ある - つばくろぐ @takamii228

⇧ 上記サイト様にありますように、「yq」は2種類存在しているらしく、紛らわしいことこの上ない...

 

して、「コマンドプロンプト」などを立ち上げて、「Vagrantfile」の配置されているディレクトリに移動し、「vagrant up」を実行。

処理に時間がかかるので暫し待ち、「コーヒーブレイク」の時間と言うことで。

⇧ 肝心の「Apache Doris」の部分で「ERROR」が出ると...

ちょっと、流石に疲れたので、原因調査は後日かなぁ...

 

ちなみに、「Java」のバージョンが古いのは「Apache Hadoop」のせいなんかな...

cwiki.apache.org

⇧ なるほど、2025年9月27日(土)時点で、「Java」のバージョンは「25」まで出ているようなのだが、「Apache Hadoop」で利用可能な「Java」のバージョンは「11」までという縛りがあるようだ...

衝撃過ぎるんだが...

何やら、

issues.apache.org

issues.apache.org

Temurin JDK25 packages are expected to be available shortly, update JDK 24 to 25 in the docker images.

https://issues.apache.org/jira/browse/HADOOP-19693

⇧ 上記の説明が正しいとするならば、「Docker」版の「Apache Hadoop」は「Java」のバージョン「25」に対応しているということなんだろうか?

う~む...、状況が全く持って分からない...

毎回思うのだが、「Apache Hadoop」に限った話ではないのだが、バージョンの関係についてのマトリックス表を公開して欲しいのよね...

そして、「Apache Flink」の設計思想なのか、「サンプル」の設計思想なのか分からないのだが、「Apache Flink」のクライアントで接続するたびに「Catalog」などの作成が必要というのは罠過ぎる...

普通の「RDBMS(Relational DataBase Management System)」だと、「永続化」されるのが普通だと思っていたので、ログインの度に作成が必要という思想は気付き難い...

Web画面などの「ログイン情報」などは、「セッション」毎に改めて作成し直すのは分かるのだが、「データベース」系で「永続化」しない発想には至り難い...

「認知」の「バイアス」と言われれば、それまでなのだが...

「インメモリデータベース」であっても、「OS(Operation System)」が再起動されない限りは「永続化」されますしな...

動作する組み合わせを探す不毛な時間のせいで「ストレス」が蓄積される慣習は無くしたいのだけどね...

「エンジニア」の仕事は理不尽過ぎることが多過ぎるので、「アンガーマネジメント」を習得していく必要があるんですかね?

「アンガーマネジメント」はというと、

アンガーマネジメント(Anger management)とは、怒りを予防し制御するための心理療法プログラムであり、怒りを上手く分散させることができると評価されている。怒りはしばしばフラストレーションの結果であり、また自分にとって大事なものを遮断されたり妨害された時の感情でもある。怒りはまた、根底にある恐れや脆弱感に対する防衛機制でもある。

アンガーマネジメント - Wikipedia

アンガーマネジメント・プログラムでは、怒りは定義可能な理由によって生じる、論理的に分析可能な強い感情であり、適切な場合には前向きにとらえてよいものだと考えられている

「怒りは誰もが経験する感情だ。怒りが重大な懸念事項となるのは、それがあまりにも頻繁に、強烈に、長い時間、発生し続ける場合だけだ。」- レイモンド・W・ノヴァコ(1984年)

アンガーマネジメント - Wikipedia

概要

「怒ることは誰にでもできる。ただ怒るのは簡単なことである…しかし適切な相手に、適切な程度に、適切な場合に、適切な目的で、適切な形で怒ることは容易ではない。」- アリストテレス

アンガーマネジメント - Wikipedia

治療の種類

6秒ルール

日本で有名なアンガーマネジメントの方法として、「怒りは6秒経てばピークを過ぎるので、6秒我慢すればよい」という「6秒ルール」がある

「6秒ルール」は、教育現場向け学校心理学の書籍でも度々紹介されている日本アンガーマネジメント協会代表理事安藤俊介も著書で取り上げている生理学研究所名誉教授で脳科学者の柿木隆介エビデンスに基づき容認している

一方で、「単に6秒待つだけでは不十分である」とする批判もある。「6秒ルール」は出所不明で、日本以外では有名でないとする指摘もある。

アンガーマネジメント - Wikipedia

⇧ とあり、「6秒ルール」は、根拠が無さそうという衝撃...

まぁ、「怒り」を誘発する対象から物理的な距離を置くしかないのだが、「エンジニア」は職業柄、「怒り」に発展するのが不可避な理不尽な状況に置かれることが多いので、「アンガーマネジメント」を習得するのは至難の業と言えそうですかね...

ちなみに、

宗教における位置づけ

多くの宗教で、怒りは人間の最もネガティブな感情と捉えられている。憤り、怒ることを憤怒といい、キリスト教では、七つの大罪のひとつとされる。仏教では、怒りは人間を地獄界の精神状態に追いやり、死後最悪の条件に転生すると考える。また、ユニコーンドラゴン等が、憤怒を象徴する動物として描かれる事もある。

怒り - Wikipedia

一方、は往々にして人間の中の正しくないものに向かって怒る存在であるが、ネガティブな感情であるとは限らない。ギリシア神話ローマ神話等では、怒りによりときに人間を滅ぼす場面も見られる。

怒り - Wikipedia

仏教では、怒りは煩悩のうち、三毒とされる基本的な3つの・瞋・(とんじんち)のうち、瞋(しん)である。不動明王三宝荒神のように、貪瞋癡を許さんという慈悲が極まり、憤怒の相で表れて不浄を厭離し、仏法僧を守護する仏も見られる。磨滅するために怒りをわざと高めて悪しき心を陳伏すること。

怒り - Wikipedia

⇧ 上記の話は納得いきませんな...

「神様」や「仏様」は、「怒り」を正当化しているらしいのだが、「生殺与奪」が「神様」や「仏様」の気まぐれに左右される不条理...

ご都合主義にも程がありますな...

全くもって救いようのない世の中ということですかね...

 

毎度モヤモヤ感が半端ない…

今回はこのへんで。