どのソースシステムからでもhdfsのフォルダに入っている最新のファイルでハイブテーブルを更新する必要があるユースケースを実装する必要があります。ここではsqoopを使用していません。シェルスクリプトは個別に実行されていますが、正しい結果がcrontabジョブとして生成されない
ソースシステムから更新されたファイルを定期的に特定のHDFSロケーション(/tmp/emp.csv)に送信することになっています。私はハイブで管理された/内部のテーブルを作成し、最初に手動でデータをロードしました。 したがって、私の最新の従業員テーブル(ハイブで作成され、デフォルトの場所 -/user/hive/warehouseに倉庫を持つ)は、すべてのデータをemp.csvファイルに格納しています。
新しいemp.csvファイルがHDFSの場所/tmp/emp.csvに入るとすぐに、既存の/user/hive/warehouse/employee/emp.csvファイルを削除して置き換えるシェルスクリプトを作成しました最新のファイルがあるので、ハイブクエリを通じて最新の従業員データを見ることができました。
私のスクリプトは、私は、コンソール上のシェルスクリプトとして実行しますが、すぐに私は私のcrontabジョブとして、それを追加すると、それはHDFSをピックアップしていない場合さて、このスクリプトが正常に動作します
#!/bin/bash
file_date=`hadoop fs -ls /tmp/emp.csv | awk '{print $6" "$7}'`
echo "file_date="$file_date
log_file_date="$(cat hist_lof_time.txt)"
echo "log_file_date="$log_file_date
if [ "$file_date" != "$log_file_date" ]; then
echo "file data not match with log date"
if [ -z "$log_file_date" ]; then
echo "inside log date edit loop"
echo $file_date > hist_lof_time.txt
fi
rm /opt/emp.csv
hadoop fs -get /tmp/emp.csv /opt/
hadoop fs -get /user/hive/warehouse/employee/emp.csv /opt/bkp/
hadoop fs -rm /user/hive/warehouse/employee/emp.csv
hadoop fs -put /tmp/emp.csv /user/hive/warehouse/employee/
echo $file_date > hist_lof_time.txt
else
echo "file is same so not processing further"
fi
のようなものですhist_lof_time.txtファイルから時刻と時刻をファイルに保存します。したがって、HDFSの新しいファイル更新では、時間は常に変わらず、ジョブは実行されません。
私は3分ごとに
*/3 * * * * /opt/myscript.sh >>/opt/myscriptout.txt
でこのcronジョブを実行している誰もが任意のポインタで私を助けてもらえて、私はここで間違って何をどこでやっていますか?迅速なヘルプがあれば幸いです。
よろしく、 Bhupesh