起因
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ファイルは、アーカイブファイルに移動されマージされたときには、以下の方法を使用してコピーを避けることができ、大/小のマージ
-
そして、テーブルmajor_compactのスナップショットを構築
-
テーブルにはいくつかの時間のために許容できない場合は、数分から数十分までの範囲には、操作の後、テーブルを無効にすることができます
-
または適切な転送大hbase.hstore.compaction.Threadhold(まれにテーブル書き込み)
-
限り、データが大きなオフセット複製間隔(大/小のための待ち時間が自動的に結合された)と書かれているように、サービス、
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ファイルにパッケージ化。