spark JOB在hive入庫的時候發生了很詭異的現象,根據report_time時間轉換為小時分區的時候,時間對不上,而且只是部分時間對不上,相差12個小時。
由於其他集群未出現此問題,想通過代碼發現是否邏輯存在問題。看了代碼之后發現邏輯也十分簡單:
獲取了report_time之后直接通過一個時間轉換函數,獲取了時間。繼續查看事件轉化函數:
這里用到了java 中SimpleDateFormat 對給定的時間進行了轉換,這種轉換java中比較常見,應該也是沒問題的。
懷疑跟集群的時間配置有關,查看集群的兩台機器的時間配置:
主機節點時間配置:(NTP時間同步未打開)
另一個節點的時間配置信息就很不一致了,發現配置的是紐約時區:
懷疑是正常的代碼,在不正常的時間配置中執行出現了問題,寫了一個測試代碼:
時區正常的機器上運行,結果正常:
另一時區設置不正常的節點運行,問題重現了:
到此,應該是確定了SimpleDateFormat跟系統時區有關了。
查詢了相關資料,可以通過對SimpleDateFormat對象調用setTimeZone(TimeZone.getTimeZone("CST")方法指定時區,解決相關問題。但是更重要的是保證集群節點時間的一致性。