设为首页 收藏本站
查看: 764|回复: 0

[经验分享] hadoop + ffmpeg 分布式转码系统实践

[复制链接]

尚未签到

发表于 2016-12-6 11:13:36 | 显示全部楼层 |阅读模式
hadoop + ffmpeg 分布式转码系统实践hadoop 安装
ffmpeg 安装
mkvtoolnix 安装
 
一、分割视频:
mkvmerge --split size:32m ./heihu01.mp4 -o ./heihu01.%05d.mp4
 
二、hdfs中创建存放分割后视频的目录
hadoop fs -mkdir movies
 
三、上传分割后的视频
for i in `ls heihu01.*.mp4`; do hadoop fs -put $i movies/; done


四、创建mapper输入数据文件路径
hadoop fs -mkdir movies_input


五、生成mapper数据文件,并上传
cat > mapper_input.sh<<EOF
#!/bin/bash
pwd=\`pwd\`
tmp_file='movies_tmp.txt'
num=2   #TaskTracker数量
true > \${tmp_file}
hadoop fs -rm movies_input/movies_*
for i in \`ls *.[0-9][0-9][0-9][0-9][0-9].*\`;do  echo movies/\$i >> \${tmp_file};done
count="\$(wc -l \${tmp_file}|cut -d' ' -f1)"
if [ \$((\$count%\$num)) -eq 0 ];then
     rows="\$((\$count/\$num))"
else
     rows="\$((\$count/\$num+1))"
fi
split -l \$rows \${tmp_file} movies_
hadoop fs -put movies_[a-z0-9][a-z0-9] movies_input
EOF
 
 
chmod +x mapper_input.sh
./mapper_input.sh
 
六、创建转换后视频的上传路径
hadoop fs -mkdir movies_put
 
七、检查Hadoop Streaming的执行身份与工作目录
1、编写脚本
cat > test_mapper.sh << EOF
#!/bin/bash
set -x
id="`whoami`"
mkdir -p /tmp/\$id
host=\`hostname\`
pwd=\`pwd\`
uid=\`whoami\`
put_dir='movies_put'

while read line; do
  input=\$line
  filename=\`basename \$input\`
  echo "\$uid@\$host:\$pwd> hadoop fs -get \$input /tmp/\$id/\$filename"
  echo "\$uid@\$host:\$pwd> ffmpeg -y -i /tmp/\$id/\$filename -s qcif -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -acodec libfaac output-\$filename.3gp"
  echo "\$uid@\$host:\$pwd> hadoop fs -put output-\$filename \${put_dir}"
done
rm -rf /tmp/\$id
EOF

chmod a+x test_mapper.sh


2、本地执行测试
cat movies_aa |./test_mapper.sh


3、hadoop streaming执行测试
hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-1.0.2.jar -input movies_input -output movies_output -mapper test_mapper.sh -file test_mapper.sh


4、查看hadoop streaming执行结果
hadoop fs -cat /user/$(whoami)/movies_output/part-00000 | head


5、删除测试输出
hadoop fs -rmr movies_output    #删除测试hadoop streaming的输出

八、使用hadoop streaming执行转码
1、编写脚本
cat > mapper.sh << EOF
#!/bin/bash
id="hduser"
mkdir -p /tmp/\$id
host=\`hostname\`
pwd=\`pwd\`
uid=\`whoami\`
put_dir='movies_put'
cd "/tmp/\$id"
true > a

while read line; do
  input=\$line
  filename=\`basename \$input\`
  echo "\$uid@\$host> hadoop fs -get \$input /tmp/\$id/\$filename"
  /usr/local/hadoop/bin/hadoop fs -get \$input /tmp/\$id/\$filename 2>&1
  echo "\$uid@\$host> ffmpeg -y -i /tmp/\$id/\$filename -s qcif -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -acodec libfaac output-\$filename.3gp"
  ffmpeg -y -i /tmp/\$id/\$filename -s 320*240 -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -qscale 5 -acodec libfaac  output-\$filename.3gp < a 2>&1
  /usr/local/hadoop/bin/hadoop fs -put output-\$filename.3gp \${put_dir} 2>&1
  echo "\$uid@\$host> hadoop fs -chown \$id \${put_dir}/output-\$filename.3gp"
  /usr/local/hadoop/bin/hadoop fs -chown \$id \${put_dir}/output-\$filename.3gp 2>&1
 
done
rm -f a
rm -rf /tmp/\$id
EOF

chmod a+x mapper.sh

2、本地执行测试
cat movies_aa | ./mapper.sh
hadoop fs -rm movies_put/*      #删除本地执行的遗留文件

 
3、使用hadoop执行脚本

hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-1.0.2.jar -input movies_input -output movies_output -mapper mapper.sh  -file mapper.sh 

 
4、验证结果
hadoop fs -cat movies_output/part-00000 |head
hadoop fs -ls movies_put
Found 6 items
-rw-r--r--   3 hduser supergroup   19584280 2012-05-28 13:53 /user/hduser/movies_put/output-heihu01.00001.mp4.3gp
-rw-r--r--   3 hduser supergroup   14872878 2012-05-28 13:54 /user/hduser/movies_put/output-heihu01.00002.mp4.3gp
-rw-r--r--   3 hduser supergroup   12052800 2012-05-28 13:55 /user/hduser/movies_put/output-heihu01.00003.mp4.3gp
-rw-r--r--   3 hduser supergroup   11174014 2012-05-28 13:53 /user/hduser/movies_put/output-heihu01.00004.mp4.3gp
-rw-r--r--   3 hduser supergroup   15713836 2012-05-28 13:55 /user/hduser/movies_put/output-heihu01.00005.mp4.3gp
-rw-r--r--   3 hduser supergroup   13084511 2012-05-28 13:56 /user/hduser/movies_put/output-heihu01.00006.mp4.3gp

 
5、reduce合并视频
cat >reduce.sh <<EOF
#!/bin/bash
tmp_file="movies_tmp.txt"
id="hduser"
pwd=\`pwd\`

dir="/tmp/\${id}_merger"
mkdir \$dir
cd $dir
true > \${tmp_file}
hadoop fs -ls movies_put|awk '{print \$8}'|sed '/^$/d' >> \${tmp_file}
 
unset m
for i in \`cat \${tmp_file}\`
do
     hadoop fs -get \$i \$dir
     filename=\`basename \$i\`
     if [ ! -z \$m ];then
          filename="+\$filename"
     fi
     echo \$filename >> \$dir/files.txt
     m=\$((m+1))
done
 
mkvmerge -o \$dir/output.3gp \`cat \$dir/files.txt\`
hadoop fs -put \$dir/output.3gp movies_put/
rm -rf \$dir
EOF
 
chmod +x reduce.sh
6、本地执行测试
./reduce.sh    
 
7、使用hadoop执行脚本
hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-1.0.2.jar -input movies_input -output movies_output -mapper mapper.sh -reducer reduce.sh -file reduce.sh -file mapper.sh
 
8、验证结果
hadoop fs -ls movies_put
Found 7 items
-rw-r--r--   3 hduser supergroup   19584280 2012-05-29 14:15 /user/hduser/movies_put/output-heihu01.00001.mp4.3gp
-rw-r--r--   3 hduser supergroup   14872878 2012-05-29 14:16 /user/hduser/movies_put/output-heihu01.00002.mp4.3gp
-rw-r--r--   3 hduser supergroup   12052800 2012-05-29 14:17 /user/hduser/movies_put/output-heihu01.00003.mp4.3gp
-rw-r--r--   3 hduser supergroup   11174014 2012-05-29 14:15 /user/hduser/movies_put/output-heihu01.00004.mp4.3gp
-rw-r--r--   3 hduser supergroup   15713836 2012-05-29 14:16 /user/hduser/movies_put/output-heihu01.00005.mp4.3gp
-rw-r--r--   3 hduser supergroup   13084511 2012-05-29 14:17 /user/hduser/movies_put/output-heihu01.00006.mp4.3gp
-rw-r--r--   3 hduser supergroup   86175913 2012-05-29 14:17 /user/hduser/movies_put/output.3gp

 
hadoop fs -cat movies_output/part-00000
 
 
附:
hadoop streaming 调试
hadoop 的output 中只记录正确输出,因此调试错误需要将命令的输出重定向到正确输出
即在命令后加"2>&1",如:
mkvmerge -o $dir/output.3gp `cat $dir/files.txt`  2>&1

本文出自 “forward” 博客,请务必保留此出处http://nginx.blog.iyunv.com/491911/881852

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-310491-1-1.html 上篇帖子: 比较全的hadoop分析,备用 下篇帖子: Hadoop k-means 算法实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表