最近来到了新的公司,搞起了AWS,会陆续记录一些AWS的东西。今天要讲的就是时区问题,说起来挺简单的,没有服务器跨国的估计注意的人没几个。
我们的EMR机器在US,而实际应用的服务器在CH,同事针对log进行的parser的时候发现实际用户的时间跟我们机器的时间总是有差异,而且排除客户端网络问题差异还挺大。
刚开始没注意,就以为是网络问题,我后来看了看还是。
以下是查找思路:
--服务器时间 大部分为04-26 select collector_tstamp :: date,count(*) from dev.events group by collector_tstamp :: date order by count(*) desc; 2015-04-26 1012769 2015-04-27 16932 —设备时间 大部分为04-26 select dvce_tstamp :: date,count(*) from dev.events group by dvce_tstamp :: date order by count(*) desc; 2015-04-26 938746 2015-04-25 90488 2015-04-27 174 ....(小于100)
从两点上看会误以为没什么问题。
下面来看diff的数据:
select datediff(m,collector_tstamp,dvce_tstamp) as minute,count(*) from dev.events group by datediff(m,collector_tstamp,dvce_tstamp) order by count(*) desc; Minutes cnt -480 949916 -479 24772 -481 17785 -478 8325 -477 4397 -476 3000 -482 2852 -475 2492 -474 2219 -473 1628 -470 1384 -469 1103
确认后日志轮转没问题后,检查了EMR程序,发现在调用python的time库时进行localtime的转化
EMR python script:
row['dvce_tstamp'] = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(row['dvce_tstamp'])/1000))
所以问题就发现了。
RootCause: 本地代码上传AWS做时间处理需要进行timezone的指定
不指定的时候测试结果:
本地机器:
>>> print time.localtime(1430378360)
time.struct_time(tm_year=2015, tm_mon=4, tm_mday=30, tm_hour=15, tm_min=19, tm_sec=20, tm_wday=3, tm_yday=120, tm_isdst=0)
EMR机器:
>>> print time.localtime(1430378360)
time.struct_time(tm_year=2015, tm_mon=4, tm_mday=30, tm_hour=7, tm_min=19, tm_sec=20, tm_wday=3, tm_yday=120, tm_isdst=0)
--
时间: 2024-10-07 02:38:20