HBaseのデータ移行ツール

起因

HBaseのスナップショットクラスタ間レプリケーションは、多くの場合、ミッション失敗にFileNotFoundExceptionをリードを/hbase/.tmp/data/xxxによる発生した場合。
現在、いくつかの一般的なソリューションを与え、エラーのシナリオを復元し、エラーの原因を分析します:

Caused by: org.apache.hadoop.ipc.RemoteException(java.io.FileNotFoundException): File /datafs/.tmp/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3 not found.
        at org.apache.hadoop.hdfs.web.JsonUtil.toRemoteException(JsonUtil.java:119)
        at org.apache.hadoop.hdfs.web.WebHdfsFileSystem.validateResponse(WebHdfsFileSystem.java:419)
        at org.apache.hadoop.hdfs.web.WebHdfsFileSystem.access$200(WebHdfsFileSystem.java:107)
        at org.apache.hadoop.hdfs.web.WebHdfsFileSystem$AbstractRunner.connect(WebHdfsFileSystem.java:595)
        at org.apache.hadoop.hdfs.web.WebHdfsFileSystem$ReadRunner.connect(WebHdfsFileSystem.java:1855)
        at org.apache.hadoop.hdfs.web.WebHdfsFileSystem$AbstractRunner.runWithRetry(WebHdfsFileSystem.java:673)
        ... 23 more

18/08/13 20:14:14 INFO mapreduce.Job:  map 100% reduce 0%
18/08/13 20:14:14 INFO mapreduce.Job: Job job_1533546266978_0038 failed with state FAILED due to: Task failed task_1533546266978_0038_m_000000

 

主な理由

スナップショットにだけでなく、適切にアドレッシング(webhdfsにバグを使用して)しないように、クロスクラスタ複製プロセス、部品StoreFileが施さ変化の位置に作成されます。

 

シーンを復元

準備

  • 環境:
    ソースクラスタ:HBaseの1.2.0-cdh5.10.0の
    ターゲット・クラスター:HBaseの1.2.0-cdh5.12.1

1.データの6枚を入れ、コラム家族の情報を分割する地域、03番目mytableテーブル、2を作成します。

put 'mytable','01','info:age','1'`
put 'mytable','02','info:age','2'`
put 'mytable','03','info:age','3'
put 'mytable','04','info:age','1'
put 'mytable','05','info:age','1'
put 'mytable','06','info:age','1'

 

2.次の書類を作成、スナップショットmysnapshotを作成します。

[root@test108 ~]# hdfs dfs -ls /datafs/.hbase-snapshot/mysnapshot/
Found 2 items
-rw-r--r--   2 hbase hbase         32 2018-08-13 18:48 /datafs/.hbase-snapshot/mysnapshot/.snapshotinfo
-rw-r--r--   2 hbase hbase        466 2018-08-13 18:48 /datafs/.hbase-snapshot/mysnapshot/data.manifest
  • .snapshotは、情報のスナップショットが含まれていることHBaseProtos.SnapshotDescriptionオブジェクト
    名:「mysnapshot」
    表:「MyTableという」
    CREATION_TIME:1533774121010
    タイプの:FLUSH
    バージョン:2

  • data.manifestは
    HBaseのテーブルスキーマ、属性、column_families、すなわちHBaseProtos.SnapshotDescription対象が含まれ、フォーカスがstore_files情報であり、

region_info {
    region_id: 1533784567273
    table_name {
      namespace: "default"
      qualifier: "mytable"
    }
    start_key: "03"
    end_key: ""
    offline: false
    split: false
    replica_id: 0
}
family_files {
    family_name: "info"
    store_files {
      name: "3c5e9ec890f04560a396040fa8b592a3"
      file_size: 1115
    }
}

 

3.修正データ

リージョンを入れてデータを変更します。

put 'mytable','04','info:age','4'
put 'mytable','05','info:age','5'
put 'mytable','06','info:age','6'

 

4.フラッシュ、major_compat

クラスタ全体で大/小マージレプリケーションのシミュレーション中に発生します

hbase(main):001:0> flush 'mytable'
0 row(s) in 0.8200 seconds

hbase(main):002:0> major_compact 'mytable'
0 row(s) in 0.1730 seconds

 

この時点で、storefileは次のアーカイブに表示されます3c5e9ec890f04560a396040fa8b592a3

[root@test108 ~]# hdfs dfs -ls -R /datafs/archive/data/default/mytable/c48642fecae3913e0d09ba236b014667
drwxr-xr-x   - hbase hbase          0 2018-08-15 08:30 /datafs/archive/data/default/mytable/c48642fecae3913e0d09ba236b014667/info
-rw-r--r--   2 hbase hbase       1115 2018-08-13 18:48 /datafs/archive/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3

 

エラーを復元

[root@a2502f06 ~]# hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot    \
>  -Dipc.client.fallback-to-simple-auth-allowed=true  \
>  -Dmapreduce.job.queuename=root.default  \
>  -snapshot mysnapshot    \
>  -copy-from webhdfs://archive.cloudera.com/datafs     \
>  -copy-to webhdfs://nameservice1/hbase/     \
>  -chuser hbase -chgroup hbase -chmod 755 -overwrite

 

コンソール、プロンプトにFileNotFound、ミッションに失敗しました。

18/08/13 20:59:34 INFO mapreduce.Job: Task Id : attempt_1533546266978_0037_m_000000_0, Status : FAILED
Error: java.io.FileNotFoundException: File /datafs/.tmp/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3 not found.
        at sun.reflect.GeneratedConstructorAccessor14.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:106)
        at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:95)
        at org.apache.hadoop.hdfs.web.WebHdfsFileSystem.toIOException(WebHdfsFileSystem.java:450)

 

ソース解析

最初のレプリケーション.snapshot前に行わ1.ExportSnapshot、data.manifestが目標終了.hbaseスナップショット/の.tmp / mysnapshot下にコピー:

[root@a2502f06 ~]# hdfs dfs -ls /hbase/.hbase-snapshot/.tmp/mysnapshot
Found 2 items
-rwxr-xr-x   2 hbase hbase         32 2018-08-13 20:28 /hbase/.hbase-snapshot/.tmp/mysnapshot/.snapshotinfo
-rwxr-xr-x   2 hbase hbase        466 2018-08-13 20:28 /hbase/.hbase-snapshot/.tmp/mysnapshot/data.manifest

 

2.解析data.manifestは、論理スライスstorefileによれば、メッセージはSnapshotFileInfoに読み込まれるたびに、マッピング、それだけHFileLink情報を含み、特定のパスを含んでいません。

String region = regionInfo.getEncodedName();
String hfile = storeFile.getName();
Path path = HFileLink.createPath(table, region, family, hfile); 
SnapshotFileInfo fileInfo = SnapshotFileInfo.newBuilder()
    .setType(SnapshotFileInfo.Type.HFILE)
    .setHfile(path.toString())
    .build();

 

3.map段階

4つの可能なパス上のすべてのSnapshotFileInfo、スプライシングを読み出すことは、この順に読んで見つけるStoreFile。

/datafs/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3
/datafs/.tmp/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3
/datafs/mobdir/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3
/datafs/archive/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3

 

マップのプロセスは、データを読み出す場合、コールExportSnapshot.ExportMapper#openSourceFile初期のInputStreamの
FileLink.tryOpen()(4トラバーサルパスを呼び出すことにより、真のパスパスStoreFileを決定する方法、スロー記述は、存在しませんを探し続け次回)。

private FSDataInputStream tryOpen() throws IOException {
      for (Path path: fileLink.getLocations()) {
        if (path.equals(currentPath)) continue;
        try {
          in = fs.open(path, bufferSize);
          if (pos != 0) in.seek(pos);
          assert(in.getPos() == pos) : "Link unable to seek to the right position=" + pos;
          currentPath = path;
          return(in);
        } catch (FileNotFoundException e) {
          // Try another file location
        }
      }
      throw new FileNotFoundException("Unable to open link: " + fileLink);
    }

 

デバッグでfsはorg.apache.hadoop.hdfs.web.WebHdfsFileSystemがオブジェクトで、見つかった
(実際のファイルが存在している残念ながら、WebHdfsFileSystemコールGetPosも()は、例外がスローされないとき、次のように、そのため、最初のパスを取得するにはアーカイブ内)。

/datafs/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3

及び(重複決意を回避するために、次に使用される)パス電流経路を設定します。

InputStream.read(バッファ)は、FileLink.readを呼び出すと()。

@Override
public int read() throws IOException {
      int res;
      try {
        res = in.read();
      } catch (FileNotFoundException e) {
        res = tryOpen().read();
      } catch (NullPointerException e) { // HDFS 1.x - DFSInputStream.getBlockAt()
        res = tryOpen().read();
      } catch (AssertionError e) { // assert in HDFS 1.x - DFSInputStream.getBlockAt()
        res = tryOpen().read();
      }
      if (res > 0) pos += 1;
      return res;
}

 

初期化のため、正しいパスを使用していない、とin.read()は、にFileNotFoundException(第一)スロー場合従って
tryOpen(コールを続ける)。read()メソッドトラバーサル経路4を、データパスのためのこの時間は、電流経路をスキップ、次のパスを使用します(ファイルは、この中にまだあります)

/datafs/.tmp/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3

.tmpファイルのパスを読んで、FileNotFoundExceptionを(秒)をスローし、この例外がの.tmpファイルに起因することが多い、上向きに投げタスクの失敗、観測された実際の.tmpと、報告されたエラーの下で見つけることができない問題であまりしませんでした。

2018-08-13 20:13:59,738 WARN [main] org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hbase (auth:SIMPLE) cause:java.io.FileNotFoundException: File does not exist: /datafs/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3
2018-08-13 20:13:59,740 WARN [main] org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hbase (auth:SIMPLE) cause:java.io.FileNotFoundException: File does not exist: /datafs/.tmp/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3
2018-08-13 20:13:59,741 WARN [main] org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hbase (auth:SIMPLE) cause:java.io.FileNotFoundException: File does not exist: /datafs/mobdir/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3
--------------------------------------------------------------------------------------------------------------------------------------------
2018-08-13 20:13:59,830 WARN [main] org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hbase (auth:SIMPLE) cause:java.io.FileNotFoundException: File /datafs/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3 not found.
2018-08-13 20:13:59,833 WARN [main] org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hbase (auth:SIMPLE) cause:java.io.FileNotFoundException: File /datafs/.tmp/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3 not found.
--------------------------------------------------------------------------------------------------------------------------------------------
2018-08-13 20:13:59,833 ERROR [main] org.apache.hadoop.hbase.snapshot.ExportSnapshot$ExportMapper: Error copying webhdfs://archive.cloudera.com/datafs/archive/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3 to webhdfs://nameservice1/hbase/archive/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3
java.io.FileNotFoundException: File /datafs/.tmp/data/default/mytable/c48642fecae3913e0d09ba236b014667/info/3c5e9ec890f04560a396040fa8b592a3 not found.
    at sun.reflect.GeneratedConstructorAccessor14.newInstance(Unknown Source)

 

read()は、ある間に分割するライン、スロー2つの例外ときにFileNotFoundExceptionは、
分割線ファイルを介して通話getSourceFileStatus ExportSnapshotシステムを生成するために存在していないが、データを横断した後に観察することができます/の.tmp / mobdir右に見てアーカイブパス(印刷されません)。

 

ソリューション

要約すると:のみStoreFileを見つけるために、データ、.tmpファイルのディレクトリを見つけ、アーカイブディレクトリを見つけることができません。
そのため、アイデアを解決する、1は、第二が正しくアーカイブに達成可能なパスで、StoreFileがアーカイブに表示されないようにすることです。

 

StoreFileがアーカイブに表示されないでください

数StoreFileがしきい値に達したときの経験によると、書き込み処理中に大量のデータは、継続的にStoreFile発生した地域では、大/小マージをトリガー
StoreFileファイルは、アーカイブファイルに移動されマージされたときには、以下の方法を使用してコピーを避けることができ、大/小のマージ

  1. そして、テーブルmajor_compactのスナップショットを構築

  2. テーブルにはいくつかの時間のために許容できない場合は、数分から数十分までの範囲には、操作の後、テーブルを無効にすることができます

  3. または適切な転送大hbase.hstore.compaction.Threadhold(まれにテーブル書き込み)

  4. 限り、データが大きなオフセット複製間隔(大/小のための待ち時間が自動的に結合された)と書かれているように、サービス、

 

webhdfsを使用しないでください

HDFSを使用するときは、通常(特に使用しない)例外をスローすることができます

 

ソース・バグ修正

だから、アドレッシングプロセスは、正しくアーカイブフォルダを読んでいる
、)(fs.getFileStatusのために行を追加し、)参照getSourceFileStatus(のためにトラバースしたときにスローノーマルにFileNotFoundException。

private FSDataInputStream tryOpen() throws IOException {
            for (Path path : fileLink.getLocations()) {
                if (path.equals(currentPath)) continue;
                try {
                    fs.getFileStatus(path); // 添加此行,使正常抛出异常
                    in = fs.open(path, bufferSize);
                    if (pos != 0) in.seek(pos);
                    assert(in.getPos() == pos) : "Link unable to seek to the right position=" + pos;
                    if (LOG.isTraceEnabled()) {
                        if (currentPath == null) {
                            LOG.debug("link open path=" + path);
                        } else {
                            LOG.trace("link switch from path=" + currentPath + " to path=" + path);
                        }
                    }
                    currentPath = path;
                    return(in);
                } catch (FileNotFoundException e) {
                    // Try another file location
                }
            }
            throw new FileNotFoundException("Unable to open link: " + fileLink);
        }

ExportSnapshot抽出物は、HFileLink、FileLink、WALLink依存性を再編成します。

他の機能に影響を与えることを避けるために、Hadoopのjarファイルにパッケージ化。

 

 

57元記事公開 ウォン称賛33 ビューに14万+を

おすすめ

転載: blog.csdn.net/u014156013/article/details/82656291