はじめに
これまで構築したHDFS同士のデータコピーを実施してみました。
ここまでHDFSのストリーミングレプリケーション,Hiveメタデータコピーも合わせ、
データ移行についても確認することできました。
以下の内容でシステム構築していること。
構成
SRC:hdfs://cluster1/data/kafka/syslog_curated
クラスタ化したHDFS利用
DST: hdfs://hdptest:9000/data/kafka/syslog_curated
単体HDFS利用
それぞれのHDFSでユーザー/グループが揃っていること。
1. HDFS操作確認
以下のコマンドでope1からお互いのHDFSにアクセスできることを確認する。
ope1:
sudo -u hadoop hdfs dfs -fs hdfs://cluster1 -ls /data/kafka/syslog_curated | head
sudo -u hadoop hdfs dfs -fs hdfs://hdptest:9000 -ls /data/kafka/syslog_curated | head
- ope1以外のhdfsコマンド稼働可能ホストからcluster1へアクセスしたい場合。
cluster1はHDFS論理ホストとなるため、/etc/hadoop/conf/hdfs-site.xml内に、以下の追記をconfiguration内に追記すること。
例として複数クラスタにアクセスする場合を載せたが、必要に応じ変更すること。
hdptest:9000については直接アクセスのため、以下の設定は必要ない。
<!-- 利用する論理nameserviceを列挙 -->
<property>
<name>dfs.nameservices</name>
<value>cluster1,cluster2</value>
</property>
<!-- cluster1 -->
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.nn1</name>
<value>master1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.nn2</name>
<value>master2:8020</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.haConfiguredFailoverProxyProvider<value>
</property>
<!-- cluster2 -->
<property>
<name>dfs.ha.namenodes.cluster2</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster2.nn1</name>
<value>hadoop2-nn1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster2.nn2</name>
<value>hadoop2-nn2:8020</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cluster2</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider<value>
</property>
2. ope1によるHDFSコピー準備
ope1:
sudo mkdir -p /var/lib/hadoop/tmp/mapred/staging
sudo mkdir -p /var/lib/hadoop/tmp/mapred/local
sudo chown -R hadoop:hadoop /var/lib/hadoop/tmp
sudo chmod 1777 /var/lib/hadoop/tmp
sudo chmod 1777 /var/lib/hadoop/tmp/mapred/staging
sudo chmod 1777 /var/lib/hadoop/tmp/mapred/local
3. distcpによるHDFSコピー実施
同期の場合、"-update -delete"で行っているが、
現行のDST中身を消さず差分をコピーしたい場合"-update"にすること。
"-p"についてもユーザー権限が異なる場所に入れる場合は外すこと。
ope1:
sudo -u hadoop hadoop distcp -p -update -delete \
hdfs://cluster1/data/kafka/syslog_curated \
hdfs://hdptest:9000/data/kafka/syslog_curated
sudo -u hadoop hdfs dfs -fs hdfs://hdptest:9000 -ls /data/kafka/syslog_curated | head
4. Mapreduceを使用したコピーの実施
大量のデータ扱いなどある際は本手順を実施する。
ope1が接続しているYARNクラスタのMapReduceを使う
4.1. 事前確認
ope1:
- RMに到達できるか
yarn node -list 2>/dev/null | head || true
yarn application -list 2>/dev/null | head || true
エラーが出ないこと。
ここで見える情報がMapreduceを稼働する場所になります。
- HDFS(src/dst)にも読めるか最終確認
hdfs dfs -fs hdfs://cluster1 -ls /data/kafka/syslog_curated | head
hdfs dfs -fs hdfs://hdptest:9000 -ls /data/kafka/syslog_curated | head
4.2. Mapreduceを使用したコピーの実施
同期の場合、"-update -delete"で行っているが、
現行のDST中身を消さず差分をコピーしたい場合"-update"にすること。
"-p"についてもユーザー権限が異なる場所に入れる場合は外すこと。
"-m"は多重度を示します。
ope1:
distcpを使用したデータコピーの実施(Mapreduce使用)
sudo -u hadoop hadoop distcp \
-Dmapreduce.job.queuename=default \
-Dyarn.app.mapreduce.am.resource.mb=384 \
-Dyarn.app.mapreduce.am.command-opts='-Xmx256m' \
-Dmapreduce.am.resource.mb=384 \
-Dmapreduce.am.command-opts='-Xmx256m' \
-Dmapreduce.map.memory.mb=384 \
-Dmapreduce.map.java.opts='-Xmx256m' \
-Dmapreduce.map.cpu.vcores=1 \
-m 2 \
-p -update -delete \
hdfs://cluster1/data/kafka/syslog_curated \
hdfs://hdptest:9000/data/kafka/syslog_curated
コピー実施確認
sudo -u hadoop hdfs dfs -fs hdfs://hdptest:9000 -ls /data/kafka/syslog_curated | head
sudo -u hadoop hdfs dfs -fs hdfs://cluster1 -ls /data/kafka/syslog_curated | head