2017-11-17 6 views
0

どのソースシステムからでも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

答えて

0

は最後に、私が直面していた問題を解決しました。

実際にスクリプトを個別に実行していたとき、hadoopシェルコマンド[スクリプトで使用]を選択できました。このスクリプトをcronジョブとして実行しようとしたとき、Hadoopホームを選択できませんでした[ビン]。したがって、そのスクリプトで使われているhadoopコマンドは実行されていませんでした。

私はまず、自分のhadoopがどこの$ hadoopを使用しているのかを探しました。 hadoop/hdfsコマンドの絶対パスを指定する必要がありました。 例:

file_date=`/opt/hadoop-2.6.4/bin/hadoop fs -ls /tmp/emp.csv | awk '{print $6" "$7}'` 

これは完全に正常に機能しました。

関連する問題