Big Data Cloud Compute Editionからの移行

Oracle Big Data Cloud Compute Edition (BDCEまたはBDC)からBig Data Serviceに移行する方法をご紹介します

移行は、いくつかのステップで行われます。Oracle Cloud Infrastructure ClassicのBDCまたはOracle Cloud InfrastructureのBDCから、アーティファクトをOCIビッグ・データ・サービスに移行できます。概要レベルでは、次のことを行います。

  • 既存のクラウド・リソースをBDCからObject Storageにエクスポートします。

  • エクスポートされたクラウド・リソースをオブジェクト・ストレージからビッグ・データ・サービスにインポートします

前提条件

始める前に、次のことを確認してください。
  • あなたはビッグ・データ・サービスのコンパートメントに対する有効なユーザーです
  • 次の操作を実行できます。
    • 資格証明を使用したOCIコンソールへのアクセス
    • HDFSデータをコピーできるように、Oracle Object Storageにバケットを作成します。Oracleオブジェクト・ストレージの詳細は、オブジェクト・ストレージの概要を参照してください。
    • OCIオブジェクト・ストア構成の確認

    詳細は、ビッグ・データ・サービスのスタート・ガイドを参照してください。

  • 次のOCIパラメータ値があります。
    詳細
    テナントID テナンシのOCID。たとえば、ocid1.tenancy.oc1..aaaaaaaa5syd62crbj5xpfajpmopoqasxy7jwxk6ihopm5vk6bxkncyp56kcです。詳細は、テナンシのOCIDおよびユーザーのOCIDの取得場所を参照してください
    ユーザーID ユーザーのOCID たとえば、ocid1.user.oc1..aaaaaaaa3pnl7qz4c2x2mpq4v4g2mp3wktxoyahwysmjrapgzjoyd3edxltpです。詳細は、テナンシのOCIDおよびユーザーのOCIDの取得場所を参照してください
    API署名キー アプリケーション・ユーザーに必要です。たとえば、03:8c:ef:51:c8:fe:6b:22:0c:5d:3c:43:a8:ff:58:d9です。API署名キーの生成およびアップロードの詳細は、次のトピックを参照してください:
    署名キーのパスフレーズ(オプション) パスフレーズでキー・ペアを生成した場合は必須です。
    署名キーのフィンガープリント API署名キーの生成およびアップロード中に、署名キーの指紋およびパスフレーズが作成されます。詳細は、キーのフィンガープリントの取得方法を参照してください。
    バケットおよびテナンシ名 たとえば、oci://myBucket@myTenancy/

    バケットの詳細は、オブジェクト・ストレージへのデータの格納を参照してください。

    OCIクラウド・ストレージURL ホスト名例、 https://objectstorage.us-phoenix-1.oraclecloud.com.

    詳細は、クラスタの作成を参照してください。

リソースのエクスポート

Big Data Cloud Compute Edition (BDC)からエクスポートできるリソースは次のとおりです。
BDCのアーティファクト エクスポートされたアーティファクト OCIビッグ・データ・サービス(BDS)のアーティファクト
HDFS内のデータ

OCIオブジェクト・ストア(oci://<bucket>@<tenancy>/<exportedHdfsDir>)にコピー済

たとえば: oci://myStorageBucket@myTenancy/exportedHdfsDir

エクスポートしたデータをOCIオブジェクト・ストアからターゲットBDS HDFSディレクトリにコピーします。

OCI-Classicオブジェクト・ストアのデータ

ノート: このアーティファクトは、Oracle Cloud Infrastructure上のOracle Big Data Cloudには適用されません。

OCIオブジェクト・ストア(oci://<bucket>@<tenancy>/<exportedObjDir>)にコピー済

たとえば: oci://myStorageBucket@myTenancy/exportedObjDir

Hiveメタデータ BDCクラスタでHive DDL文を生成します。 Hive DDL文をBDCクラスタからBDSクラスタにコピーし、実行します。
Zeppelinノートブック Zeppelinノートブック定義をHDFSの /user/zeppelin/notebookから.tar.gzファイルとしてエクスポートします。これは、Oracleが提供するスクリプトを使用して行われます。 現在、BDSではZeppelinノートブックのインポートはサポートされていません。
HDFS、YARN、Spark構成ファイル Oracleが提供するユーティリティ・スクリプトを使用して、構成ファイルを.tar.gzファイルとしてエクスポートします。 BDSではHDFS、YARNおよびSparkの構成設定が最適化されているため、BDCから構成ファイルおよびバージョンをインポートする必要はありません。
様々なオープン・ソース・コンポーネントのバージョン Ambari REST APIを使用してサービス・バージョンの詳細をエクスポートします。お客様は、Ambari (Admin -> Stack and Versions)からバージョンの詳細を取得することもできます。

WANdisco LiveData Migratorを使用したリソースの移行

宛先でポート8020が開いていることを確認します。

WANdisco LiveData Migratorの詳細は、ここを選択してください。

WANdisco LiveData Migratorを使用してリソースを移行するには、次のステップに従います。

  1. 次のコマンドを実行して、ソース・クラスタの任意のエッジにLiveDataマイグレータをインストールします。
    wget https://wandisco.com/downloads/livedata-migrator.sh
     
    chmod +x livedata-migrator.sh && ./livedata-migrator.sh
     
    service livedata-migrator status
    service hivemigrator status
    service livedata-ui status
  2. LiveDataマイグレータのインストールおよび設定が完了したら、UIにアクセスし、ユーザー・アカウントを作成します。UIのURLは次のとおりです。
    http://<LDM-Installation-Host.com>:8081
  3. データを移行するには、次を実行します。
    1. ソースファイルシステムを構成します。
      ソース・ファイルシステムを追加するには、LiveDataマイグレータ・ダッシュボードで次を実行します:
      1. 「製品」パネルから、関連するインスタンスを選択します。
      2. 「ファイルシステム構成」ページで、「ソース・ファイルシステムの追加」を選択します。
    2. ターゲットファイルシステムを構成します。
      ターゲット・ファイルシステムを追加するには、LiveDataマイグレータ・ダッシュボードで次を実行します:
      1. 「製品」パネルから、関連するインスタンスを選択します。
      2. 「ファイルシステム構成」ページで、「ターゲット・ファイルシステムの追加」を選択します。
      3. 「Apache Hadoop for Target as BDS cluster」を選択し、デフォルトのファイルシステム・パスを指定します。ソースとターゲットが8020ポートの宛先に接続していることを確認します。
    3. パス・マッピングを作成します。
      パス・マッピングを使用すると、移行されたデータをターゲット上の同等のデフォルトの場所に格納できます。UIを使用してパス・マッピングを作成するには、次のステップに従います。
      1. ダッシュボードの「製品」リストから、パス・マッピングを作成するLiveDataマイグレータ・インスタンスを選択します。
      2. 「移行」メニューから、「パス・マッピング」を選択します。
      3. インタフェースの右上にある「新規パスの追加」ボタンを選択します。
    4. 移行の作成
      移行では、既存のデータが定義済のソースからターゲットに転送されます。UIから新しい移行を作成するには、次のステップに従います。
      1. 移行の名前を入力します。
      2. ファイルシステムから、ソースとターゲットを選択します。
      3. 移行するソースファイルシステム上のパスを選択します。フォルダ・ブラウザを使用して、移行するパス名を選択します。パス名の横にある灰色のフォルダを選択して、そのサブディレクトリを表示します。
  4. メタデータを移行します。
    メタデータを移行するには、これらのステップに従います。
    1. ソースBDCクラスタからHiveメタデータをエクスポートします。詳細は、Hiveメタデータのエクスポートを参照してください。
    2. メタデータを宛先BDS ODH 1.0クラスタにインポートします。詳細は、「メタデータのインポート」を参照してください。

Distcpツールを使用したリソースの移行

Big Data Cloud Compute Editionからデータおよびメタデータを移行し、Distcpツールを使用してビッグ・データ・サービスにインポートすることもできます。Distcpは、クラスタ内およびクラスタ間の分散ファイル・システム間で大規模なデータ・セットをコピーするために使用できるオープン・ソース・ツールです。

BDCクラスタの準備

エクスポート用にBDCクラスタを準備する方法を確認します。

  1. HDFSサービスをメンテナンス・モードに設定して、アラートおよび一括操作をブロックします。詳細は、「サービスのメンテナンス・モードの設定」を参照してください。
  2. opcユーザーとしてSSHを使用してBDCクラスタに接続します。詳細は、Secure Shell (SSH)を介したクラスタ・ノードへの接続を参照してください。
  3. 次のコマンドを実行して、HDFSサービスをセーフ・モードに設定します。
    $ sudo su hdfs -c 'hdfs dfsadmin -safemode get'
    Safe mode is OFF
     
    $ sudo su hdfs -c 'hdfs dfsadmin -safemode enter'
    Safe mode is ON
  4. 次を実行します:
    1. rootユーザーとして、OCI秘密キー(~/.oci/ oci_api_key.pemなど)をBDCクラスタの/home/opc/.ociディレクトリにコピーします。
      sudo su -
      cp <private-key> /home/opc/.oci/oci_api_key.pem
    2. 秘密キー・ファイル権限を読取り専用に変更します。
      chmod 444 /home/opc/.oci/oci_api_key.pem
    3. プライベートPEMキー・ファイルの所有権をhdfsユーザーに変更します。
      chown -R hdfs:hdfs /home/opc/.oci/oci_api_key.pem
    4. HDFSユーザーがアクセスできるdataという名前のディレクトリを作成します。
    5. OCI秘密キーを/home/opc/.ociディレクトリから/dataディレクトリにコピーします。
      cp /home/opc/.oci/oci_api_key.pem /data
    6. rootユーザーとして、/dataディレクトリの秘密キー・ファイルを読取り専用に変更します。
      chmod 444 /data/oci_api_key.pem
    BDCクラスタに複数のノードがある場合は、同じパスを持つすべてのノードでOCI秘密キーが使用可能であることを確認してください。otoolsユーザーを使用して、ファイルをすべてのノードにコピーできます。ただし、ファイルがotoolsで読取り可能であることを確認してください。ファイルをすべてのノードにコピーしたら、元のアクセス権を設定します。

    すべてのホストにOCI秘密キーをインストールするには、 otoolsユーザーとして、各ホストに対して指定された順序で次のコマンドを実行します:

    sudo su - otools
    ssh <hostname> sudo mkdir /data
    scp oci_api_key.pem <hostname>:/data
    ssh <hostname> sudo chown hdfs:hdfs /data/oci_api_key.pem
    ssh <hostname> sudo chmod 444 /data/oci_api_key.pem
HDFSからのデータのエクスポート

HDFSからデータをエクスポートするには、次のステップを実行します。

  1. distcpツールを設定します。distcpツールには、更新されたoci-hdfsドライバが必要です。したがって、distcpツールを実行する必要があるホストにドライバをダウンロードする必要があります。ドライバをダウンロードするには、次のコマンドを使用します:
    1. 次のコマンドを実行して、/dataの下にhdfsjarという名前のディレクトリを作成し、ディレクトリに移動します。
      mkdir -p /data/hdfsjars
      cd /data/hdfsjars
    2. oci-hdfs.zipをダウンロードします。
      wget https://github.com/oracle/oci-hdfs-connector/releases/download/v2.7.7.0/oci-hdfs.zip
    3. oci-hdfs.zipファイルを抽出します。
      1. /data/hdfsjars/libディレクトリの下のファイルを解凍します。
        unzip oci-hdfs.zip lib/oci-hdfs-full-2.7.7.0.jar
      2. lib/oci-hdfs-full-2.7.7.0.jarを現在の作業ディレクトリ(/data/hdfsjar)に移動します。
        mv lib/oci-hdfs-full-2.7.7.0.jar .
      3. libディレクトリおよびoci-hdfs.zipファイルを削除します。
        rm -rf lib/ oci-hdfs.zip
  2. oci-hdfs-full-2.7.7.0.jarを指すように環境変数を設定します。
    export LIBJARS=/data/hdfsjars/oci-hdfs-full-2.7.7.0.jar
  3. (オプション)sun.net.inetaddr.ttlを使用して次の変数を設定して、プロキシを構成します。
    export DISTCP_PROXY_OPTS="-Dhttps.proxyHost=<proxy-host> -Dhttps.proxyPort=<proxy-port> -Dsun.net.inetaddr.ttl=60"
    
  4. OCIストレージ・コンテナの内容をリストして構成をテストします。
    hadoop fs -Dfs.oci.client.auth.fingerprint=<fingerprint> \
    -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
    -Dfs.oci.client.auth.passphrase=<passphrase> \
    -Dfs.oci.client.auth.tenantId=<OCID forTenancy> \
    -Dfs.oci.client.auth.userId=<OCID forUser> \
    -Dfs.oci.client.hostname=<HostName. Example: https://objectstorage.us-phoenix-1.oraclecloud.com/> \
    -Dfs.oci.client.proxy.uri=http://<proxyhost>:<proxyport> \
    -ls oci://<bucket>@<namespace>/
  5. OCIオブジェクト・ストア・バケットの特定のディレクトリにあるすべてのHDFSデータをコピーするには、バケットの下にディレクトリを作成します。
    hadoop fs -Dfs.oci.client.auth.fingerprint=<fingerprint> \
          -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
          -Dfs.oci.client.auth.passphrase=<passphrase> \
          -Dfs.oci.client.auth.tenantId=<OCID for Tenancy> \
          -Dfs.oci.client.auth.userId=<OCID for User> \
          -Dfs.oci.client.hostname=<HostName. Example: https://objectstorage.us-phoenix-1.oraclecloud.com/> \
          -Dfs.oci.client.proxy.uri=http://<proxyhost>:<proxyport>  \
          -mkdir oci://<bucket>@<namespace>/<Dir>
                                    
  6. 次のコマンドを実行して、ディレクトリがオブジェクト・ストアに作成されていることを確認します。
    hadoop fs -Dfs.oci.client.auth.fingerprint=<fingerprint> \
          -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
          -Dfs.oci.client.auth.passphrase=<passphrase> \
          -Dfs.oci.client.auth.tenantId=<OCID forTenancy> \
          -Dfs.oci.client.auth.userId=<OCID forUser> \
          -Dfs.oci.client.hostname=<HostName>\
          -ls oci://<bucket>@<namespace>/
  7. HDFSデータをエクスポートするには、次のいずれかを実行します。
    • hadoop fs -cpを使用して、HDFSデータを単一ノード・クラスタからHDFSユーザーとしてオブジェクト・ストアにエクスポートします。
      sudo su - hdfs
      hadoop fs -Dfs.oci.client.auth.fingerprint=<fingerprint> \
            -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
            -Dfs.oci.client.auth.passphrase=<passphrase> \
            -Dfs.oci.client.auth.tenantId=<OCID for Tenancy> \
            -Dfs.oci.client.auth.userId=<OCID for User> \
            -Dfs.oci.client.hostname=<HostName> \
            -Dfs.oci.client.proxy.uri=http://<proxyhost>:<proxyport>  \
            -cp <hdfs-dir-to-copy> oci://<bucket>@<namespace>/<dir>/
                                                  
    • hadoop distcpを使用して、マルチノード・クラスタからオブジェクト・ストアにHDFSデータをエクスポートします。特定のディレクトリに対して検証します。たとえば、次のコマンドで<hdfs-dir-to-copy>/user/oozie/を使用し、HDFS全体(/)に対して実行します。
      hadoop distcp -libjars ${LIBJARS} \
      -Dfs.client.socket-timeout=3000000
      -Dfs.oci.client.auth.fingerprint=<fingerprint> \
      -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
      -Dfs.oci.client.auth.passphrase=<passphrase> \
      -Dfs.oci.client.auth.tenantId=<OCID for Tenancy> \
      -Dfs.oci.client.auth.userId=<OCID for User> \
      -Dfs.oci.client.hostname=<HostName. Example: https://objectstorage.us-phoenix-1.oraclecloud.com/> \
      -Dfs.oci.client.multipart.allowed=true \
      -Dfs.oci.client.proxy.uri=<http://proxy-host>:port \
      -Dmapreduce.map.java.opts="$DISTCP_PROXY_OPTS" \
      -Dmapreduce.reduce.java.opts="$DISTCP_PROXY_OPTS" \
      -Dmapreduce.task.timeout=6000000 \
      -skipcrccheck -m 40 -bandwidth 500 \
      -update -strategy dynamic -i <hdfs-dir-to-copy> oci://<bucket>@<namespace>/<exportedHdfsDir>/
  8. オブジェクト・ストアの内容を確認します。
    hadoop fs -Dfs.oci.client.auth.fingerprint=<fingerprint> \
         -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
         -Dfs.oci.client.auth.passphrase=<passphrase> \
         -Dfs.oci.client.auth.tenantId=<OCID forTenancy> \
         -Dfs.oci.client.auth.userId=<OCID forUser> \
         -Dfs.oci.client.hostname=<HostName>\
         -ls oci://<bucket>@<namespace>/<dir>
  9. メタデータ・ファイルを作成し、オブジェクト・ストアにエクスポートします。
    1. 次のzipファイルをダウンロードします。

      ファイル/create_metadata.zip

    2. ファイルを解凍し、create_metadata.shおよびcreate_permissions.pyを1つのディレクトリに配置します。
    3. 次のシェル・スクリプトを実行します。このスクリプトは、複数のメタデータ・ファイルを作成し、それらをHDFSの/metadataディレクトリに配置します。
      bash create_metadata.sh <hdfs_directory>
    4. メタデータ・ファイルをオブジェクト・ストアにエクスポートします。
      hadoop distcp -Dfs.client.socket-timeout=3000000 \
          -Dfs.oci.client.auth.fingerprint=67:3a:86:d2:8b:61:b0:fd:c4:21:58:92:5a:d2:e8:83 \
          -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
          -Dfs.oci.client.auth.tenantId=ocid1.tenancy.oc1..aaaaaaaajh6gxgbuudok7odjpwe5wyv2iq74ihhac5lyulxdgrhsssxc4hna \
          -Dfs.oci.client.auth.userId=ocid1.user.oc1..aaaaaaaaeslrldhdvniuue3dsi7p3xblpfpsluxtx2g6txg5iiukfhzg77ua \
          -Dfs.oci.client.hostname=https://objectstorage.us-ashburn-1.oraclecloud.com/ \
          -Dfs.oci.client.multipart.allowed=true -Dmapreduce.task.timeout=6000000  \
          -skipcrccheck -m 20 -bandwidth 100 -update -strategy dynamic -i /metadata/Metadata* oci://<bucket>@<namespace>/metadata
      
Hiveメタデータのエクスポート

Hiveメタデータをエクスポートするには、次のステップを実行します。

  1. hive_migrate.propertiesを更新するターゲット・ビッグ・データ・サービスHDFSパスを取得します。
    1. TARGET_HDFS_PATHを取得するには、要塞ホストを使用してターゲットBDSクラスタにログオンします。
      cat /etc/hadoop/conf/core-site.xml | grep -A1 "fs.defaultFS"
    2. TARGET_HDFS_PATHを書き留めます。

  2. hive_migrate.propertiesスクリプトのTARGET_HDFS_PATHおよびTARGET_OBJECTSTORE_PATHを、移行後にHive表データを使用できる場所に更新します。パス内のスラッシュをエスケープする必要はありません。
    #!/bin/bash
    #
    # Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
    # Properties file to overide
    #
    # This file will be sourced by the generate_target_ddl_from_source.sh
    # to customize/overide properties
    # SRC_HDFS_PATH and SRC_OBJECTSTORE_PATH will be derived automatically from the cluster.
    # You will be customizing
    #     RUNDIR , TARGET_HDFS_PATH, TARGET_OBJECTSTORE_PATH
    #
    # ------------------------------------------------------------
    # Location to hold intermediate and final scripts to be generated.
    # You must have write privileges on this directory
    export RUNDIR=/tmp/hivemigrate
     
    # ------------------------------------------------------------
    # Specify current hive.metastore.warehouse.dir from Hive Config.
    #
    export SRC_WAREHOUSE_DIR=/apps/hive/warehouse
     
     
    # ------------------------------------------------------------
    # Modify expected target BDS hdfs path in your hive DDL script
    #
    export TARGET_HDFS_PATH=hdfs://testbdmn0.bmbdcsad1.bmbdcs.oraclevcn.com:8020/warehouse/tablespace/external/hive
     
     
    # ------------------------------------------------------------
    # Modify expected target BDS Object Store path in your hive DDL script
    #
    export TARGET_OBJECTSTORE_PATH=oci://bdc2odh@bdsdevcluster/warehouse
  3. opcユーザーとしてsshを使用してBDCクラスタに接続します。詳細は、Secure Shell (SSH)を介したクラスタ・ノードへの接続を参照してください。
  4. 次のコードを使用して、~opcホーム・ディレクトリにgenerate_target_ddl_from_source.shという名前のスクリプトを作成します。このスクリプトは、ターゲット・クラスタで実行してハイブ・メタデータを作成できるDDL文を生成します。
    #!/bin/bash
    #
    # Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
    #
    # Script to generate queries that can be run on a target cluster for hive metadata migration.
    #
    # Usage :
    #   sudo generate_target_ddl_from_source.sh
    # The generated scripts are available under /tmp/hivemigrate/generatedSQL_target_Hive
    #  - 1_CREATE_DB.hql
    #  - 2_CREATE_TABLE.hql
    #  - 3_ADD_PARTITION.hql
    #
    # These scripts can be run on a target cluster AS IS to create hive metadata that matches the source..
    #
     
     
    #------------------------------------------------------------
    # Set Environment
    detect_basedir()
    {
      DIRNAME=`dirname $0`
      BASENAME=`basename $0`
      BASEDIR=$(cd "$DIRNAME" ; pwd)
    }
    detect_basedir
     
     
    #------------------------------------------------------------
    # Initilize any default config properties that has been overriden in
    #     ${BASEDIR}/hive_migrate.properties
    # DO NOT MODIFY. PLEASE OVERRIDE ANY PARAMETER IN ${BASEDIR}/hive_migrate.properties
    export RUNDIR=/tmp/hivemigrate
    export TARGET_HDFS_PATH=hdfs://Some_cluster_name/tmp
    export TARGET_OBJECTSTORE_PATH=oci://mybucket@mytenancy/tmp/
    #
    #------------------------------------------------------------
    if [ -f ${BASEDIR}/hive_migrate.properties ]; then
        echo -e "*** Sourcing Overide proprties file ${BASEDIR}/hive_migrate.properties"
        source ${BASEDIR}/hive_migrate.properties
    else
        echo -e "*** Warning : Missing Overide proprties file ${BASEDIR}/hive_migrate.properties"
        echo -e "*** Continue with default settings\n"
    fi
    #
    usage()
    {
      echo -e "Usage : ${BASENAME} \n"
      echo -e "**  This script is to be run on your source cluster and can be run as many times as you wish."
      echo -e "**  It cleans up any older generated scripts located in ${RUNDIR} before starting \n"
      echo -e "**  The generated output hive query scripts will be available in RUNDIR: ${RUNDIR} ...\n"
      echo -e "*** Modify RUNDIR if you would like to override\n"
      echo -e "**  Currently TARGET_HDFS_PATH is set to hdfs://Some_cluster_name/"
      echo -e "*** Modify TARGET_HDFS_PATH to match your hdfs path in Hive DDL \n"
    }
     
     
    # Make sure only root can run our script
    if [ "$(id -u)" != "0" ]; then
       echo -e "ERROR: *** This script ${BASENAME} must be run as root" 1>&2
       usage
       exit 1
    fi
     
    if [ "$1" != "" ]; then
       usage
       exit 1
    fi
     
     
    #------------------------------------------------------------
    #
    # Figure out the HDFS Path in source cluster.
    # Depending on HA or non-HA cluster the hdfs path syntax is different
    if ! grep -q "dfs.ha.namenodes.mycluster" /etc/bdcsce/conf/blueprint/*.json
    then
        echo -e "INFO:**  Source: Non-HA cluster..."
        nn_fqdn=$(hostname -f)
        SRC_HDFS_PATH=hdfs://${nn_fqdn}:8020${SRC_WAREHOUSE_DIR}
    else
        echo -e 'INFO:**  Source: HA cluster...'
        SRC_HDFS_PATH=hdfs://mycluster${SRC_WAREHOUSE_DIR}
    fi
    echo -e "INFO:**  Assumed source hdfspath : $SRC_HDFS_PATH"
     
     
    #------------------------------------------------------------
    #
    # Figureout Source Object source Patch
    source /etc/bdcsce/conf/datasources.properties
    export SRC_OBJECTSTORE_PATH=${bdcsce_default_objectstore_url}
     
     
     
     
    #------------------------------------------------------------
    # Step-1 : Setup/Clean source and target directories to hold intermediate and final scripts
     
     
    #Path to store intermediate hive queries
    outputSourcePath=${RUNDIR}/generatedSQL_source_Hive
    rm -rf $outputSourcePath
    mkdir -m 777 -p $outputSourcePath
     
     
    #Path to store final target hive queries to be used at target system
    outputTargetPath=${RUNDIR}/generatedSQL_target_Hive
    rm -rf $outputTargetPath
    mkdir -m 777 -p $outputTargetPath
     
     
    #------------------------------------------------------------
    # Step-2 : Extract Create DB statements from MetaStore to Run in Target Hive Installation.
    #
    mysql -Dhive --skip-column-names -e"
     
     
    -- Query for creating databases
    SELECT
        CONCAT('CREATE DATABASE IF NOT EXISTS ',
                D.NAME,
                '\;') AS CREATE_DB_STATEMENTS
    FROM
        DBS D;" > $outputTargetPath/1_CREATE_DB.hql
     
     
    ret=$?
    if [ $ret -ne 0 ];
    then
        echo -e "Error:** - MySQL Error code is $ret while trying to extract DB creation scripts"
        exit $ret
    else
        echo -e "**  DB Creation extraction script $outputTargetPath/1_CREATE_DB.hql completed successfully"
    fi
     
     
    #------------------------------------------------------------
    # Extract Show Create Table statements from MetaStore to Run in Source Hive Installation.
     
     
    mysql -Dhive --skip-column-names -e"
     
     
    -- Query for Creating Show CT Statements to be run in the Source Hive Installation
    SELECT
        CONCAT('USE ', D.name, '\; ','SHOW CREATE TABLE ',
                T.tbl_name,
                '\;') AS SHOW_CT_STATEMENTS
    FROM
        TBLS T
            INNER JOIN
        DBS D ON D.DB_ID = T.DB_ID
    WHERE
        T.TBL_TYPE != 'INDEX_TABLE';" > $outputSourcePath/1_SHOW_CREATE_TABLE.hql
     
     
     
     
    ret=$?
    if [ $ret -ne 0 ];
    then
        echo -e "Error:** - MySQL Error code is $ret while trying to extract SHOW CT scripts"
        exit $ret
    else
        echo -e "\n\n"
        echo -e "**  SHOW CREATE TABLE extraction script $outputSourcePath/1_SHOW_CREATE_TABLE.hql completed successfully"
    fi
     
     
     
     
    #------------------------------------------------------------
    # Run Show Create Table Command on Source Hive Installation to create target Hive CT scripts
    echo -e "**  Running show create table in source cluster"
    echo -e "**  This may take a while...Depends on hive metadata size\n\n"
     
     
     
     
    sudo -u hive hive -f $outputSourcePath/1_SHOW_CREATE_TABLE.hql > $outputTargetPath/2_CREATE_TABLE_temp.hql
    ret=$?
    if [ $ret -ne 0 ];
    then
        echo -e "Error - Hive Error code is $ret while trying to execute SHOW CT scripts"
        exit $ret
    else
        echo -e "\n\n"
        echo -e "**  SHOW CT execution script $outputTargetPath/2_CREATE_TABLE_temp.hql completed successfully"
    fi
     
     
    # Add semicolon suffix ; after CT statements
    echo -e "USE default;" > $outputTargetPath/2_CREATE_TABLE.hql
    cat $outputTargetPath/2_CREATE_TABLE_temp.hql | tr '\n' '\f' | sed -e 's/)\fCREATE/);\fCREATE/g'  | tr '\f' '\n' >> $outputTargetPath/2_CREATE_TABLE.hql
    echo -e ";">>$outputTargetPath/2_CREATE_TABLE.hql
    rm -rf $outputTargetPath/2_CREATE_TABLE_temp.hql
    echo -e "**  Create Table execution script $outputTargetPath/2_CREATE_TABLE.hql created successfully"
     
    #------------------------------------------------------------
    # Convert Managed Table to External table for HIVE 3
    #
    echo -e "INFO:** Convering Managed Table to External table for HIVE 3 in CT $outputTargetPath/2_CREATE_TABLE.hql scripts"
    sed -i "s/^CREATE TABLE/CREATE EXTERNAL TABLE/g" $outputTargetPath/2_CREATE_TABLE.hql
     
    #------------------------------------------------------------
    # Replace HDFS Path
    #
    echo -e "INFO:** Replacing $SRC_HDFS_PATH with $TARGET_HDFS_PATH in CT $outputTargetPath/2_CREATE_TABLE.hql scripts"
    sed -i "s,$SRC_HDFS_PATH,$TARGET_HDFS_PATH,g" $outputTargetPath/2_CREATE_TABLE.hql
     
    #------------------------------------------------------------
    # Replace Target Object Store Path
    #
    echo -e "INFO:** Replacing $SRC_OBJECTSTORE_PATH with $TARGET_OBJECTSTORE_PATH in CT $outputTargetPath/2_CREATE_TABLE.hql scripts"
    sed -i "s,$SRC_OBJECTSTORE_PATH,$TARGET_OBJECTSTORE_PATH,g" $outputTargetPath/2_CREATE_TABLE.hql
     
     
    echo -e "INFO:** Replaced $SRC_OBJECTSTORE_PATH with $TARGET_OBJECTSTORE_PATH in CT $outputTargetPath/2_CREATE_TABLE.hql scripts"
     
     
     
    #------------------------------------------------------------
    # Extract Add Partition statements if any from MetaStore to Run in Target Hive Installation.
     
     
    mysql -Dhive --skip-column-names -e"
    -- Query to create add partition scripts to run in target Hive Installation
     
     
     
     
    SET @oldNameNode = '$SRC_HDFS_PATH'; -- Old NameNode address
    SET @newNameNode = '$TARGET_HDFS_PATH'; -- New NameNode address
     
     
     
     
    SELECT
        REPLACE(add_partition_query,
            @oldNameNode,
            @newNameNode) AS add_partition_query
     
     
     
     
    FROM
            (SELECT
                    CONCAT('USE ', D.name, '\; ', ' ALTER TABLE ', T.TBL_NAME, ' ADD PARTITION (', GROUP_CONCAT(PK.PKEY_NAME, '=', '\'', PKV.PART_KEY_VAL, '\''
                        ORDER BY PK.INTEGER_IDX), ') LOCATION \'', S.location, '\'\; ') AS add_partition_query
        FROM
            TBLS T
        INNER JOIN DBS D ON T.DB_ID = D.DB_ID
        INNER JOIN PARTITION_KEYS PK ON T.TBL_ID = PK.TBL_ID
        INNER JOIN PARTITIONS P ON P.TBL_ID = T.TBL_ID
        INNER JOIN PARTITION_KEY_VALS PKV ON P.PART_ID = PKV.PART_ID
            AND PK.INTEGER_IDX = PKV.INTEGER_IDX
        INNER JOIN SDS S ON P.SD_ID = S.SD_ID
        GROUP BY P.PART_ID
        ORDER BY D.name) alias1;" > $outputTargetPath/3_ADD_PARTITION.hql
    ret=$?
    if [ $ret -ne 0 ];
    then
        echo -e "Error - MySQL Error code is $ret while trying to extract ADD PARTITION scripts"
        exit $ret
    else
        echo -e "\n\n"
        echo -e "**  ADD PARTITION extraction script $outputTargetPath/3_ADD_PARTITION.hql completed successfully"
    fi
     
     
     
     
    echo -e "\n\n"
    echo -e "INFO: ** Here are your Target installation scripts"
    ls -al $outputTargetPath/*
    echo -e "\n\n"
    echo -e "INFO: ** Run these hql scripts on your Target hive shell..."
     
     
    exit 0
  5. rootユーザーとしてgenerate_target_ddl_from_source.shスクリプトを実行します。
    sudo ./generate_target_ddl_from_source.sh
    /tmp/hivemigrate/generatedSQL_target_Hiveの下に次のスクリプトが生成されます。
    • 1_CREATE_DB.hql
    • 2_CREATE_TABLE.hql
    • 3_ADD_PARTITION.hql

    インポート中に、これらのスクリプトを/tmp/hivemigrate/generatedSQL_target_Hiveから、ルートおよびデータベース・アクセスを持つターゲットBDSクラスタのマスター・ノードにコピーします。

Zeppelinノートブック、サービス構成およびバージョンのエクスポート

ソース・クラスタからサービス構成をエクスポートし、ソース・クラスタで使用されるカスタム構成変更の宛先クラスタの参照として使用できます。

zepplinノートブック、サービス構成およびバージョンをエクスポートするには、次のステップに従います。

  1. Hive、ZeppelinおよびSparkサービスを停止します。
    1. 次のAmbari IPを使用してAmbariコンソールにアクセスします。
      https://<hostname>:8080

      詳細は、Ambariを使用したBig Data Cloudへのアクセスを参照してください。

    2. 「サービス」から、「Hive」に移動して「サービス・アクション」を選択し、「停止」を選択します。
    3. 「サービス」から、「Zeppelin」に移動して「サービス・アクション」を選択し、「停止」を選択します。
    4. 「サービス」から、「Spark」に移動し、「サービス・アクション」「停止」の順に選択します。
  2. エクスポート・スクリプトを実行する準備をします。
    1. opcユーザーとしてsshを使用してBDCクラスタに接続します。詳細は、Secure Shell (SSH)を介したクラスタ・ノードへの接続を参照してください。
    2. githubで指定したコードを使用して、exportBDC.pyという名前のファイルを作成します。
    3. rootユーザーとして、chmod 755 exportBDC.pyを実行します。このファイルには、execute特権が必要です。
    4. 同じディレクトリにconfig.jsonという名前のファイルを作成し、エクスポートするサービス・インスタンスに適切なパラメータ値を指定します。
      {
        "export_dir" : "/data/exportbdc",
        "ambari_username" : "bdcsce_admin",
        "ambari_password" : "<example-password>"
      }
  3. エクスポート・スクリプトを実行します。
    1. rootユーザーとして、exportBDC.pyスクリプトを実行します。デバッグ・ログを取得するには、-vパラメータ(exportBDC.py config.json -vなど)を指定してスクリプトを実行します。
      
      sudo su
      ./exportBDC.py config.json
    2. 次の場所にエクスポートされる.tar.gzファイルの内容にアクセスします。
      • 構成
        config/NGINX_MASTER/nginx-ambari-config.xml
        config/HCAT/hcat-env.sh
        config/FABRIC_SERVER/fsm-config.xml
        config/PIG/log4j.properties
        config/PIG/pig.properties
        config/PIG/pig-env.sh
        config/SPARK2_CLIENT/spark-env.sh
        config/SPARK2_CLIENT/spark-log4j.properties
        config/SPARK2_CLIENT/spark-metrics.properties
        config/SPARK2_CLIENT/spark-defaults.conf
        config/HDFS_CLIENT/hdfs-site.xml
        config/HDFS_CLIENT/log4j.properties
        config/HDFS_CLIENT/core-site.xml
        config/HDFS_CLIENT/hadoop-env.sh
        config/YARN_CLIENT/log4j.properties
        config/YARN_CLIENT/capacity-scheduler.xml
        config/YARN_CLIENT/core-site.xml
        config/YARN_CLIENT/yarn-env.sh
        config/YARN_CLIENT/yarn-site.xml
        config/SPOCUI_MASTER/spocui-ambari-config.xml
        config/ZOOKEEPER_CLIENT/log4j.properties
        config/ZOOKEEPER_CLIENT/zookeeper-env.sh
        config/MAPREDUCE2_CLIENT/mapred-site.xml
        config/MAPREDUCE2_CLIENT/mapred-env.sh
        config/MAPREDUCE2_CLIENT/core-site.xml
        config/ALLUXIO_WORKER/alluxio-log4j.xml
        config/ALLUXIO_WORKER/alluxio-env.xml
        config/ALLUXIO_WORKER/alluxio-site.xml
        config/OOZIE_CLIENT/oozie-site.xml
        config/OOZIE_CLIENT/oozie-env.sh
        config/OOZIE_CLIENT/oozie-log4j.properties
        config/TEZ_CLIENT/tez-site.xml
        config/TEZ_CLIENT/tez-env.sh
        config/HIVE_CLIENT/hive-env.sh
        config/HIVE_CLIENT/hive-log4j.properties
        config/HIVE_CLIENT/hive-site.xml
        config/HIVE_CLIENT/hive-exec-log4j.properties
        config/ALLUXIO_MASTER/alluxio-log4j.xml
        config/ALLUXIO_MASTER/alluxio-env.xml
        config/ALLUXIO_MASTER/alluxio-site.xml
        config/LOGSTASH/bdcsce-logstash-agent-ambari-config.xml
      • Zepplinノートブック
        zeppelin/notebook/2ANTDG878/note.json
        zeppelin/notebook/2CGT3D6QX/note.json
      • Hiveメタデータ
        hive_metadata/hive_metadata_dump.sql
      • バージョン・データ
        stack/StackVersions.txt
  4. Hive、ZeppelinおよびSparkサービスを起動します。
    1. 次のAmbari IPを使用してAmbariコンソールにアクセスします。
      https://<hostname>:8080

      詳細は、Ambariを使用したBig Data Cloudへのアクセスを参照してください。

    2. 「サービス」から、「Hive」に移動して「サービス・アクション」を選択し、「開始」を選択します。
    3. 「サービス」から、「Zeppelin」に移動して「サービス・アクション」を選択し、「起動」を選択します。
    4. 「サービス」から、「Spark」に移動し、「サービス・アクション」「開始」の順に選択します。
スケジューラ構成のコピー
次を実行します:
  1. BDCで、「アンバリ」に移動し、「YARN」「拡張構成」Scheduler.xmlの順に選択します。
  2. Scheduler.xmlをBDCからScheduler.xmlにコピーします(Ambariに移動し、YARNを選択し、「拡張構成」を選択し、Scheduler.xmlを選択します)。
    ノート

    この方法では、キュー容量がパーセンテージで保持されるため、YARNコアおよびメモリーはソース・クラスタに比例します。
    ノート

    詳細な構成を確認するには、exportBDC.pyスクリプトを使用して、宛先クラスタ上の糸構成ダンプを比較します。
Sparkジョブの確認

Sparkで最新のAPIを使用するには、コードを確認および更新する必要があります。SparkおよびHiveでは、BDSで異なるカタログが使用されます。Hiveから表にアクセスするには、カタログを更新する必要があります。

<property>
  <name>metastore.catalog.default</name>
  <value>hive</value>
</property>

ビッグ・データ・サービスでは、デフォルトでHiveによってACID表が作成されます。SparkはACID表では動作しません。HiveおよびSparkにアクセスするには、外部表を作成する必要があります。

BDCでexportBDC.pyで作成された構成ファイルを、ビッグ・データ・サービスのカスタム構成変更のスパーク構成ファイルと比較します。

ビッグ・データ・サービスへのリソースのインポート

次に、エクスポートされたデータとメタデータをビッグ・データ・サービスにインポートします。

前提条件
リソースをインポートする前に、次を実行します。
  1. ソース・クラスタと同じBDC Hadoopバージョン(Hadoop 2.7.x)のビッグ・データ・サービスで新しいターゲット環境を設定します。
    ノート

    :
      • ソースBDCクラスタと同じサイズのOCIでビッグ・データ・サービス・クラスタを定義します。ただし、ターゲット・クラスタのサイズを決定する前に、コンピューティングおよびストレージのニーズを確認する必要があります。
      • Oracle Cloud Infrastructure VMシェイプについては、コンピュート・シェイプを参照してください。BDCはすべてのシェイプをサポートしていません。
      • BDCスタック以外のソフトウェアがブートストラップ・スクリプトまたはその他の方法を使用してソース・システムにインストールされている場合は、そのソフトウェアもターゲット・システムにインストールおよび保守する必要があります。
  2. PEM秘密キー(oci_api_key.pem)ファイルをビッグ・データ・サービス・クラスタのすべてのノードにコピーし、適切な権限を設定します。
  3. ソースBDCクラスタからアーティファクトをエクスポートします。詳細は、Oracle Big Data Cloudからのデータおよびメタデータのエクスポートを参照してください。
HDFSへのデータのインポート

HDFSにデータをインポートするには、これらのステップに従います:

  1. opcユーザーとしてSSHを介してビッグ・データ・サービス(BDS)クラスタに接続します。
    ssh -i id_rsa <private_node_ip>
  2. データを格納する必要があるHDFSの場所を決定します。
    
    grep -A1 -i fs.defaultFS /etc/hadoop/conf/core-site.xml
  3. HDFSユーザーとして、データをオブジェクト・ストアからターゲットHDFSに移動します。
    1. hadoop fs -cpを使用して、HDFSユーザーとしてオブジェクト・ストアから宛先BDSクラスタにHDFSデータをインポートします。
      sudo su - hdfs
       
      hadoop fs -Dfs.oci.client.auth.fingerprint=<fingerprint> \
      -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
      -Dfs.oci.client.auth.passphrase=<passphrase> \
      -Dfs.oci.client.auth.tenantId=<OCID for Tenancy> \
      -Dfs.oci.client.auth.userId=<OCID for User> \
      -Dfs.oci.client.hostname=<HostName. Example: https://objectstorage.us-phoenix-1.oraclecloud.com/> \
      -Dfs.oci.client.proxy.uri=http://<proxyhost>:<proxyport> \
      -cp oci://<bucket>@<tenancy>/<dir>/ <hdfs-dir-to-copy>
                                                  
    2. hadoop distcpを使用して、オブジェクト・ストアからマルチノードのBDSクラスタにHDFSデータをインポートします。特定のディレクトリに対して検証します。たとえば、次のコマンドで<hdfs-dir-to-copy>/user/oozieを使用し、次にHDFS全体(/)に対して実行します。
      hadoop distcp -libjars ${LIBJARS} \
      -Dfs.client.socket-timeout=3000000
      -Dfs.oci.client.auth.fingerprint=<fingerprint> \
      -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
      -Dfs.oci.client.auth.passphrase=<passphrase> \
      -Dfs.oci.client.auth.tenantId=<OCID for Tenancy> \
      -Dfs.oci.client.auth.userId=<OCID for User> \
      -Dfs.oci.client.hostname=<HostName. Example: https://objectstorage.us-phoenix-1.oraclecloud.com/> \
      -Dfs.oci.client.multipart.allowed=true \
      -Dfs.oci.client.proxy.uri=<http://proxy-host>:port \
      -Dmapreduce.map.java.opts="$DISTCP_PROXY_OPTS" \
      -Dmapreduce.reduce.java.opts="$DISTCP_PROXY_OPTS" \
      -Dmapreduce.task.timeout=6000000 \
      -skipcrccheck -m 40 -bandwidth 500 \
      -update -strategy dynamic -i oci://<bucket>@<tenancy>/<exportedHdfsDir>/ <hdfs-dir-to-copy>
                                                  
  4. tmpディレクトリの内容をリストします。
    hadoop fs -ls /<hdfs-dir-to-copy>
メタデータ・ファイルをインポートし、権限を実行します。
次の手順を実行します。
  1. メタデータ・ファイルをオブジェクト・ストアからHDFSの/metadataにインポートします。
    
    hadoop distcp -libjars ${LIBJARS} \
    -Dfs.client.socket-timeout=3000000
    -Dfs.oci.client.auth.fingerprint=<fingerprint> \
    -Dfs.oci.client.auth.pemfilepath=<oci_pem_key> \
    -Dfs.oci.client.auth.passphrase=<passphrase> \
    -Dfs.oci.client.auth.tenantId=<OCID for Tenancy> \
    -Dfs.oci.client.auth.userId=<OCID for User> \
    -Dfs.oci.client.hostname=<HostName. Example: https://objectstorage.us-phoenix-1.oraclecloud.com/> \
    -Dfs.oci.client.multipart.allowed=true \
    -Dfs.oci.client.proxy.uri=<http://proxy-host>:port \
    -Dmapreduce.map.java.opts="$DISTCP_PROXY_OPTS" \
    -Dmapreduce.reduce.java.opts="$DISTCP_PROXY_OPTS" \
    -Dmapreduce.task.timeout=6000000 \
    -skipcrccheck -m 40 -bandwidth 500 \
    -update -strategy dynamic -i oci://<bucket>@<tenancy>/metadata/ /metadata
  2. ファイルをローカル・ディレクトリに移動します。
    hdfs dfs -get /metadata/Metadata*
  3. バックグラウンドまたは複数の端末でファイルをパラレルに実行します。
    bash Metadataaa &
     
    bash Metadataab &
     
    bash Metadataac &...
メタデータのインポート中

メタデータをインポートするには、次のステップを実行します。

  1. opcの使用として要塞ホストを介してBDSクラスタに接続します
  2. ソースBDCクラスタで作成されたHIVE DDL問合せスクリプトをターゲットBDSクラスタにコピーします。
    1. 1_CREATE_DB.hql.
    2. 2_CREATE_TABLE.hql
    3. 3_ADD_PARTITION.hql
  3. 1_CREATE_DB.hqlスクリプトを実行します。
    hive -f 1_CREATE_DB.hql
  4. 2_CREATE_TABLE.hqlスクリプトを実行します。
    hive -f 2_CREATE_TABLE.hql
  5. 3_ADD_PARTITION.hqlスクリプトを実行します。
    hive -f 3_ADD_PARTITION.hql
Hiveメタストア・ウェアハウス・ディレクトリの更新

次を実行します:

  1. hive.metastore.warehouse.dirの値を検索します。これは、hive-site.xmlのBDCクラスタで/apps/hive/warehouseに構成されたハイブ・プロパティです。
    <name>hive.metastore.warehouse.dir</name>
    <value>/apps/hive/warehouse</value>
  2. BDSクラスタのhive-site.xmlhive.metastore.warehouse.dir<exportedHdfsDir>/apps/hive/warehouseに再構成します。
  3. HDFSデータをhdfs://tmpにコピーした場合は、hive.metastore.warehouse.dirプロパティを/tmp/apps/hive/warehouseとして構成します。

移行の検証

リソースの移行後、ソース・クラスタと同じハイブ表のセットがターゲット・クラスタに存在することを確認します。
  1. hiveシェルに接続します。
    hive
  2. 次のコマンドを実行して、表をリストします:
    show tables;
  3. 次のコマンドを実行して、表を問い合せます。
    SELECT * FROM airports LIMIT 10;
  4. 次のコマンドを実行して、HDFSおよびオブジェクト・ストア・データを検証します。
    hadoop fs -du -s /tmp/hivemigrate
  5. 関連するすべてのジョブを送信し、予想される結果を取得して、クラスタのヘルスを確認します。BDCで実行したジョブを選択し、BDSクラスタで実行します。
    ノート

    ジョブの正常な実行は、データの場所のみでなく、 HADOOP_CLASS_PATHなどの構成設定、クライアントjarの場所などにも依存します。