python批量提交s3-被搁置
来吧,先来热热身,python跑linux命令玩玩,马上就开始搞hadoop命令了,前路漫漫
前路漫漫,但是也不要急,我们继续编写脚本,使其可以自动组装hadoop的目录结构,然后上传,这个我们具体使用多线程+消息队列的方式,还是单线程,跑测试,具体的,我们等一会儿稍晚些时候商量一下,还是说,我先测试一下。
这个题目往上面一搜一大把,因为我目前没有oa环境,无法登陆堡垒机,没法进入linux集群,哎,好烦躁,测试比较麻烦,别着急。一步一步来吧。
首先来看一下理论。
python 调用shell命令的方法
在python程序中调用shell命令,是件很酷且常用的事情……
1. os.system(command)
此函数会启动子进程,在子进程中执行command,并返回command命令执行完毕后的退出状态,如果command有执行内容,会在标准输出显示。这实际上是使用C标准库函数system()实现的。
缺点:这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果。
实例:os.system('ls -l *')
2. os.popen(command,mode)
打开一个与command进程之间的管道。这个函数的返回值是一个文件对象,可以读或者写(由mode决定,mode默认是’r')。如果mode为’r',可以使用此函数的返回值调用read()来获取command命令的执行结果。
os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。
实例:tmp = os.popen('ls -l *').readlines()
3. commands.getstatusoutput(command)
使用os.popen()函数执行command命令并返回一个元组(status,output),分别表示command命令执行的返回状态和执行结果。对command的执行实际上是按照{command;} 2>&1的方式,所以output中包含控制台输出信息或者错误信息。output中不包含尾部的换行符。
4. subprocess模块
此模块在python2.4中初次亮相,其中集中了关于进程的诸多操作,其中的call()完全替代了system(),而popen()被更为丰富的Popen类替代;
总结:python提供了十分完善的调用shell命令的功能,在实战中,我碰到的问题,有system和popen基本可全部搞定;
哦,楼上茫茫多一大片,先从第一步吧。来写一个shell。import subprocess
移除点击此处添加图片说明文字
好了,这个就是测试的,然后我们上传到服务器上。
移除公司自己整的调度平台,里面居然还可以查hive等等,功能很强大,很多,大公司就是有钱啊!
移除外网可用。
移除点击此处添加图片说明文字也可以跑类似于hue的东西,
移除点击此处添加图片说明文字类似的。
移除点击此处添加图片说明文字好了,现在我们进入调度平台。
移除点击此处添加图片说明文字依次这么点,可以调度,因为目前没有堡垒机,只能用调度,来测试了,看能不能使用python shell
但是发现报错:
移除点击此处添加图片说明文字哦,原来是要把python脚本亚索然后上传啊,额,这个有点恶心了,测试个python脚本这么恶心啊。受不了
ok,稍微了解了一下,原来这个enos是自己开发的平台,这个平台搞大数据蛮吊的,是因为,都集成了,可以的,我发现可以直接跑python脚本,而且上传的zip文件,会自己解压,厉害了。
在平台上,在玩玩hadoop命令
移除点击此处添加图片说明文字目录找到了,现在就要拼接 spark_output_prod 目录下所有用户id,目录就是我们需要的文件结构。
好了,已经离成功越来越近了。当下还需要快速跑起来。
我们先把命令跑通。
来试一试。
hadoop jar lib/emr-s3distcp-1.0.jar --src=hdfs://titan/user/eos/kafka/目录 --dest=s3://目录
因为现在没有堡垒机权限,只能在web端测试。
移除点击此处添加图片说明文字我们网上找一找,hdfs到s3,方案的命令。然后组装
移除点击此处添加图片说明文字这个时候,我就想打开s3客户端看一看了,到底怎么回事,能让我提交一个命令,先把命令跑通。
移除点击此处添加图片说明文字说道这里,来看一下,hadoop distcp的使用,都知道hadoop无论hive也好,sqoop也罢,就连distcp也喜欢玩mr,其实就是mr,
distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。 由于使用了Map/Reduce方法,这个工具在语义和执行上都会有特殊的地方。 这篇文档会为常用distcp操作提供指南并阐述它的工作模型。
distcp最常用在集群之间的拷贝:
hadoop distcp hdfs://master1:8020/foo/bar hdfs://master2:8020/bar/foo
命令行中可以指定多个源目录:
hadoop distcp hdfs://master1:8020/foo/a hdfs://master1:8020/foo/b hdfs://master2:8020/bar/foo
或者使用-f选项,从文件里获得多个源:
hadoop distcp -f hdfs://master1:8020/srclist hdfs://master2:8020/bar/foo
其中srclist 的内容是
hdfs://master1:8020/foo/a
hdfs://master1:8020/foo/b
这个是distcp的集群之间的转换,再来看看hadoop到s3
- hadoop到s3
hadoop distcp hdfs:/user/hive/data/SearchRecord/2014-02-16 s3n://*/hadoop/user/hive/data/SearchRecord/2014-02-16
需要在core-site.xml中配置好fs.s3n.awsAccessKeyId和fs.s3n.awsSecretAccessKey
注意s3的路径需要使用s3n
- s3到hadoop
hadoop distcp s3n://*/hadoop/user/hive/data/SearchRecord/2014-02-16/ hdfs:/user/hadoop/test/SearchRecord/2014-02-16
如果从s3到hadoop,报错。 进行s3到hadoop操作时,总是报org.apache.hadoop.security.AccessControlException: Permission denied: s3n://licsh-test1/testS3
在core-site.xml配置好s3的账号密码没,可以用s3cmd的客户端测试一下,能不能访问
好了,搞懂了。目前已经搞懂了。原来是我傻了,再加上对方也傻了。
原来这个指令是要上传一个jar,hdfs里面的jar。。。。wtf,尼玛
两个人都傻了,第一,使用jar包应该会有-jar 然后才会用jar包,这是我傻了;他傻了,是因为,测试你上传jar干嘛,txt,log你不玩,你玩一个jar包干毛线。。。尼玛。
之前集群报错是因为没有权限,现在呢,是要使用生产,直接跑一个小文件,就ok了,
此外,s3的browser也搞定了,
移除点击此处添加图片说明文字目录下客户端,可操作。
还有最后一个问题就可以了。就是,目前测试beta上面没有s3的环境,需要上生产测试,弄一个测试的环境也比较麻烦的。和领导要了一下他的权限账号。这不,看似可以了。咱们试一试吧。
在生产平台的enos上面玩一玩。
移除点击此处添加图片说明文字哎,还可以,报错原因来看看这个
移除点击此处添加图片说明文字因为没这个文件,我们试试别的。
命令
hadoop distcp /tmp/ss-manager.jar s3a://eoswind/product/eos_org_data/
hadoop distcp /tmp/1.dat s3a://eoswind/beta/test/
但是报错。
17/12/19 14:14:23 ERROR tools.DistCp: Invalid arguments: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: Amazon S3, AWS Request ID: DCE91D9B3ABA70F1, AWS Error Code: null, AWS Error Message: Forbidden, S3 Extended Request ID: oJzr3GJadbYg20NuEiigPVr45xIHeH6zLQZn97TLjS0AcJoTomvE9ibCJb0+F/Yzen7CXHlocmY=
stack overflow上面有人遇到过
这个人说:
移除点击此处添加图片说明文字当你启动一个EC2实例在AWS还需要签署的服务请求,如S3。但是,它通过从内部元数据服务检索凭据来实现这一点。
点进去这个url看一下,
移除点击此处添加图片说明文字没有多大帮助。
但是我们再s3官网上面,找到了:
移除点击此处添加图片说明文字只是一个例子,让我们不要打日志的。。。尼玛。也不是怎么解决这个问题的,我们看一下,有没有同事会吧,等会让问问了。
好像,了解到:
hadoop distcp /tmp/ttt.ttt1 s3a://hadoop2017-backup/
是可以成功
因为用户权限的问题权限
hadoop这边也要权限,s3那边也要权限。
目前找同事搞了一晚上是搞了一下,是搞定了。目前是可以了。可以看一下测试情况
我们
hadoop fs -put /.../emrfs-1.6.0.jar /tmp/ttt.ttt1
然后执行:
hadoop distcp /tmp/ttt.ttt1 s3a://hadoop2017-backup/
成功了
移除点击此处添加图片说明文字可以看一下s3
移除点击此处添加图片说明文字
好的,现在我们测试我们的数据了。
移除点击此处添加图片说明文字这个权限不够,那么算了,我们来看一下,亲测一下,一个目录的数据需要多久。首先我建议来看一下大小吧。
移除点击此处添加图片说明文字
但是我们的用户只有读取权限啊,好烦啊。难受啊,难受。hdfs的权限不够
该权限仅eos可读写执行,其他用户没有任何权限,那么,我们找人开权限吧。但是被告知,帮忙开通堡垒机了,这个就很nice了
下午了,搞定了,你到了堡垒机权限,开通了账户,给了用户,有权限了。看一下数据量。
移除点击此处添加图片说明文字解释:此为一个客户的一个区域的一个场站下面的区域场站的某一天的某一个天以内所有的数据,数据是实时秒级的,所以量很大,下午我们就测试一下。
先测试一天的,看看hadoop去s3,要多久。我们先看一下,数据量吧。
移除点击此处添加图片说明文字跑命令吧。
移除点击此处添加图片说明文字数据量:378.69716858864
下午的两点40开始跑的,
移除点击此处添加图片说明文字
程序报错了,我们来看一下。报错。
hadoop fs -get /user/eos/kafka/regular/spark_output_prod/WF0024/20171219/eos-points-20171219011230-6-84 /home/im/bak
下载下来看一下。
但是
移除点击此处添加图片说明文字sz eos-points-20171219011230-6-84
直接这样就行了,来看一下
移除点击此处添加图片说明文字
来看一下数据为何方神圣
好的,乱码
移除点击此处添加图片说明文字
不看了,没耐心看了。不看了。我靠,就是目录的问题,有时候可以有时候不可以,妈的。
最后留一个能跑通的版本。
hadoop distcp /user/eos/kafka/regular/spark_output_prod/WF0024/20171219/eos-points-20171219011230-6-84 s3a://hadoop2017-backup/
再试一个:
hadoop distcp /user/eos/kafka/regular/spark_output_prod/WF0024/20171219/eos-points-20171219031230-6-53 s3a://hadoop2017-backup/
再测一个
hadoop distcp /user/eos/kafka/regular/spark_output_prod/WF0024/20171219/eos-points-20171219041330-6-58 s3a://hadoop2017-backup
好的,开测,测了很多次,发现了一个怪相,每次提交任务,报的错都不一样
好的,出测试报告,让他们加班。然后今天的工作先结束,这篇文档先结束,未完待续。
出了一个测试报告:
移除点击此处添加图片说明文字
直到刚才被告知,告一段落了,hdfs到s3,因为不稳定。但是我的代码都准备好了。
os执行。
移除点击此处添加图片说明文字
领导让先做别的重要的事情了,我这边先告别这个秒级数据上传了。
关于总是报错,只要能跑通,我们可以引入更细粒度的hadoop命令队列,线程增加报错重跑机制。
刚才给领导说,目录结构可以拿到,结构下,可以先跑所有命令,递归进来,拿到所有需要上传你的文件,用python设置字典,key是文件的天,value就存放命令。
这个我以前在爬虫遇到过。
但是领导让做别的重要的事情,那这个事情,我们只能先告一段落了。