Python开发hdfs到s3难点克服
本篇讲述python的开发难点,例如,用自己代码代替不安全Python库源码,例如队列异常等
1.来说第一点,开发可以用aconda,生产不可以,所以,我建议开发也不要用。服务器需要的类库,交给管理员安装类库,这个可以用pip search pycrypto
注意使用2.6.1,我们开发的版本,尽量保持一致,同时要求你的开发python环境尽量和服务器保持一致。
2.上述的坑容易,第二个就是这个类库,被管理员告知不安全,并不允许服务器集成,需要自己用代码实现,所以
其实来看看就是将签名做了一个base64的操作,
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据(或不可打印的字符串)。包括MIME的email,email via MIME, 在XML中存储复杂数据。
我们需要查看itsdangerous里面的使用的源码
base64_encode
点进去:
使用了want_bytes方法
点进去,发现:
ok,我们来看看这个text_type参数是干嘛的吧。
ok,仅仅是判断的,当前python系统版本的。
关于调试
>>> import sys
>>> print sys.version_info
sys.version_info(major=2, minor=7, micro=8, releaselevel='final', serial=0)
>>> print sys.version_info[0]
2
ok,接下来,我们改写。
然后像itsdangerous源码一样准备判断验证返回
接着就是签名拼装了,直接使用我们定义的base64_encode
ok,我们rz上传至服务器,测试。
先不管下面,发现已经可以了,生产处场站了,关于下面这个报错,我新开一个篇幅来看一下。
3.关于场站下面没有数据。
就是说,虽然是场站,但是他下面没有数据,这个就很尴尬,我们要做好处理。
关于报错
其实就是第二种情况,我们测试hadoop命令。
[[email protected] ~]$ hadoop fs -ls /user/eos/kafka/regular/spark_output_prod/19c824ad6a800000
ls: `/user/eos/kafka/regular/spark_output_prod/19c824ad6a800000': No such file or directory
ok,知道了,第四个场站下面没有数据,或者说,服务器上面没有第四个场站的数据,所以,这里我们做操作。代码层控制
如果返回list为null,则进入了false,不为null则正确。
每个线程里操作
4.关于优化和安全
当前被告知,不能直接放到服务器上面跑,要放到调度机上面以任务的形式来跑。其实,想要备份目前的hdfs数据,还有以下四点思考。
(1)全部备份
第一步备份所有的hdfs数据去s3
(2)增量备份
第一步做完之后,以后做成任务的形式,每天将上一天的hdfs数据备份s3,然后删除hdfs数据
(3)成功性
关注数据成功性,这个最关键,
(4)时间效率
如何优化代码、带宽、集群资源阀,来让任务快些结束,这里需要考虑到,拷贝应在集群资源利用小的时候使用。因为任务将启动大量mr,消耗大量的io
好了,关于改造的部分,我们可能要在下篇来介绍了。