HDFSの場所に1年間のデータがあり、過去6ヶ月間のデータを別のHDFSの場所にコピーしたいと思います。 hdfsコマンドから直接6ヶ月のデータをコピーできますか?それとも、過去6ヶ月のデータをコピーするにはシェルスクリプトを作成する必要がありますか?
私は成功せずにこれを行うためにhdfsコマンドを使ってみました。
以下のシェルスクリプトを試してみましたが、TempFileが作成されるまで正しく機能しますが、エラーが発生します。
$ sh scriptnew.sh
scriptnew.sh: line 8: syntax error: unexpected end of file
スクリプトは実行されなくなりました。
以下は私が使用するシェルスクリプトです。
#!/bin/bash
hdfs dfs -ls /hive/warehouse/data.db/all_history/ |awk 'BEGIN{ SIXMON=60*60*24*180; "date +%s" | getline NOW } { cmd="date -d'\''"$6" "$7"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-SIXMON; if(WHEN > DIFF){print $8}}' >> TempFile.txt
cat TempFile.txt |while read line
do
echo $i
hdfs dfs -cp -p $line /user/can_anns/all_history_copy/;
done
エラーは何であり、回避策は何ですか?
答え1
hdfsの場所から別の場所に6ヶ月ファイルをコピーするには、次のスクリプトを使用できます。
スクリプトはローカルLinuxの場所で実行する必要があります。
#!/bin/bash
hdfs dfs -ls /hive/warehouse/data.db/all_history/ |awk 'BEGIN{ SIXMON=60*60*24*180; "date +%s" | getline NOW } { cmd="date -d'\''"$6" "$7"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-SIXMON; if(WHEN > DIFF){print $8}}' >> TempFile.txt
cat TempFile.txt |while read line
do
echo $i
hdfs dfs -cp -p $line /user/can_anns/all_history_copy/;
done
行2:最大180日までのファイルのリストをTempFileにコピーします。その後、この一時ファイルを繰り返し、一致するものがあればファイルをコピーします。
Windowsでスクリプトを作成してLinuxシステムにコピーすると、機能しなくても構文エラーが表示されることがあります。キャリッジリターンエラーを回避するには、スクリプトをLinuxシステムのローカルパスにコピーし、次のコマンドを実行します。 sed -i 's/\r//' その後、スクリプトを実行してください>>>shファイル名.sh