Hadoop 2.0 各人族(四)

打印 上一主题 下一主题

主题 537|帖子 537|积分 1611


七、Flume

  Flume是一个分布式高性能、高可靠的数据传输工具,它可用简朴的方式将差异数据源的数据导入某个或多个数据中心,典型应用是将众多生产机器日记数据及时导入HDFS。
(一)Flume简介

1、Flume逻辑结构
  Flume核心思想是数据流,即数据从哪来到哪去,中心不需用颠末谁。

  用户可以将Flume当作是两台机器之间通过网络相互传送数据,Flume定制了大量的数据源(Thrift、Shell)与数据汇(Thrift、HDFS、Hbase),通过使用“管道”,Flume能够确保不会丢失一条数据,提供了数据高可靠性。

2、Flume组成
(1)Source
  它负责读取原始数据,目前Flume支持大量类型。用户可以自定义Source,使用时在配置文件里声明即可。
(2)Channel
  它负责将从Source端传来的数据存入Channel。Flume的分用、复用和过滤功能即在于此。
(3)Sink
  它负责从Channel中取出并发送数据。Sink内部都是使用netty来发送数据的。
(二)Flume入门

1、Flume部署
  集群中只有一台机器部署Flume就可以接收数据了,此外下面的例题中还要有一台机器做为数据源,负责向Hadoop集群发送数据,故须在cMaster与iClient上部署Flume。
(1)部署Flume接收端:
  1. [root@cMaster ~]# sudo yum install flume-ng-agent                  #在cMaster上部署Flume
复制代码
(2)部署Flume发送端:
  1. [root@iClient ~]# sudo yum install flume-ng-agent                      #在iClient上部署Flume
复制代码
2、Flume访问接口
  Flume提供了命令行接口和步伐接口,无论是命令行还是步伐接口,都必须使用Flume配置文档,这也是Flume架构思想之一——配置型工具。
【例6】 按要求完成题目:
① 进入Flume命令行,查察常用命令。
② 要求发送端iClient使用telnet向cMaster发送数据,而接收端cMaster开启44444端口接收数据,并将收到的数据表现于命令行。
③ 要求发送端iClient将本地文件“/home/joe/source.txt”发往接收端cMaster,而接收端cMaster将这些数据存入HDFS。
④ 根据题目③,接收端cMaster开启接收数据的Flume服务,既然此服务能接收iClient发来的数据,它肯定也可以接收iHacker机器(黑客)发来的数据,问怎样尽量减少端口攻击,并包管数据安全。
解:
  对于题目①,直接在iClient上执行如下命令即可:
  1. [root@iClient ~]# flume-ng                                        #查看Flume常用命令
复制代码
  对于题目②,首先必要在cMaster上按要求配置并开启Flume,接着在iClient上使用telnet向cMaster发送数据,具体过程参见如下几步。
  在cMaster上以root权限,新建文件“/etc/flume/conf/flume.conf”,并填入如下内容:
  1. # 命令此处agent名为a1,并命名此a1的sources为r1,channels为c1,sinks为k1
  2. a1.sources = r1
  3. a1.channels = c1
  4. a1.sinks = k1
  5. # 定义sources相关属性:即此sources在cMaster上开启44444端口接收以netcat协议发来的数据
  6. a1.sources.r1.type = netcat
  7. a1.sources.r1.bind = cMaster
  8. a1.sources.r1.port = 44444
  9. # 定义channels及其相关属性,此处指定此次服务使用memory暂存数据
  10. a1.channels.c1.type = memory
  11. a1.channels.c1.capacity = 1000
  12. a1.channels.c1.transactionCapacity = 100
  13. # 定义此sink为logger类型sink:即指定sink直接将收到的数据输出到控制台
  14. a1.sinks.k1.type = logger
  15. # 将sources关联到channels,channels关联到sinks上
  16. a1.sources.r1.channels = c1
  17. a1.sinks.k1.channel = c1
复制代码
  接着在cMaster上使用此配置以前台方式开启Flume服务:
  1. [root@cMaster ~]# flume-ng agent -c /etc/flume-ng/ -f /etc/flume-ng/conf/flume.conf -n a1
复制代码
  此时,接收端cMaster已经配置好并开启了,接下来必要开开导送端,在iClient上执行:
  1. [root@iClient ~]# telnet cMaster 44444
复制代码
  此时向此命令行里随意输入数据并回车,telnet会将这些数据发往cMaster,再次回到cMaster上执行命令的那个终端,会发现刚才在iClient里输入的数据发送到了cMaster的终端里。假如想退出iClient终端里的telnet,按Ctrl+]组合键(即同时按住Ctrl键和]键),回到telnet后输入“quit”命令回车即可,至于退出cMaster上的Flume,直接按Ctrl+C组合键。
  对于题目③,首先,在cMaster上新建文件“/etc/flume-ng/conf/flume.conf.hdfs”,并填入如下内容:
  1. # 命令此处agent名为a1,并命名此a1的sources为r1,channels为c1,sinks为k1
  2. a1.sources = r1
  3. a1.sinks = k1
  4. a1.channels = c1
  5. # 定义sources类型及其相关属性
  6. # 即此sources为avro类型,且其在cMaster上开启4141端口接收avro协议发来的数据
  7. a1.sources.r1.type = avro
  8. a1.sources.r1.bind = cMaster
  9. a1.sources.r1.port = 4141
  10. # 定义channels类型其实相关属性,此处指定此次服务使用memory暂存数据
  11. a1.channels.c1.type = memory
  12. # 定义此sink为HDFS类型的sink,且此sink将接收的数据以文本方式存入HDFS指定目录
  13. a1.sinks.k1.type = hdfs       
  14. a1.sinks.k1.hdfs.path = /user/joe/flume/cstorArchive
  15. a1.sinks.k1.hdfs.fileType = DataStream
  16. # 将sources关联到channels,channels关联到sinks上
  17. a1.sources.r1.channels = c1
  18. a1.sinks.k1.channel = c1
复制代码
  接着,在iClient上新建文件“/root/ businessLog”,并填入如下内容:
  1. ccccccccccccccccccccc
  2. ssssssssssssssssssssssss
  3. tttttttttttttttttttttttttttttttttt
  4. ooooooooooooooooooo
  5. rrrrrrrrrrrrrrrrrrrrrrrrrrrrr
复制代码
  iClient上还要新建文件“/etc/flume-ng/conf/flume.conf.exce”,并填入如下内容:
  1. # 命令此处agent名为a1,并命名此a1的sources为r1,channels为c1,sinks为k1
  2. a1.sources = r1
  3. a1.channels = c1
  4. a1.sinks = k1
  5. # 定义sources类型及其相关属性,此sources为exce类型
  6. # 其使用Linux cat命令读取文件/root/businessLog,接着将读取到的内容写入channel
  7. a1.sources.r1.type = exec
  8. a1.sources.r1.command = cat /root/businessLog
  9. # 定义channels及其相关属性,此处指定此次服务使用memory暂存数据
  10. a1.channels.c1.type = memory
  11. # 定义此sink为avro类型sink,即其用avro协议将channel里的数据发往cMaster的4141端口
  12. a1.sinks.k1.type = avro
  13. a1.sinks.k1.hostname = cMaster
  14. a1.sinks.k1.port = 4141
  15. # 将sources关联到channels,channels关联到sinks上
  16. a1.sources.r1.channels = c1
  17. a1.sinks.k1.channel = c1
复制代码
  至此,发送端iClient和接收端的Flume都已配置完成。现在必要做的是在HDFS里新建目录,并分别开启接收端Flume服务和发送端Flume服务,步骤如下。
  在cMaster上开启Flume,其中“flume-ng … a1”命令表示使用flume.conf.hdfs配置启动Flume,参数a1便是配置文件里第一行定义的那个a1。
  1. [root@cMaster ~]# sudo -u joe hdfs dfs -mkdir flume                #HDFS里新建目录/user/joe/flume
  2. [root@cMaster ~]# sudo -u joe flume-ng agent -c /etc/flume-ng/ -f /etc/flume-ng/conf/flume.conf.hdfs -n a1
复制代码
  末了,在iClient上开开导送历程,与上一条命令类似,这里的a1,即flume.conf.exce定义的a1:
  1. [root@iClient ~]# flume-ng agent -c /etc/flume-ng/ -f /etc/flume-ng/conf/flume.conf.exce -n a1
复制代码
  此时,用户在iClient端口里打开“cMaster:50070”,依次进入目录“/user/joe/flume/cstorArchive”,将会查察到从iClient上传送过来的文件。
  题目④属于开放性题目,请参考官方文档,讨论并办理。
八、Mahout

  Mahout是基于Hadoop平台的机器学习工具,它提供了大量机器学习算法的MR实现,此外,它还提供了大量针对数据预处置惩罚的工具类,通过数据预处置惩罚工具类与机器学习算法的结合,能够很方便地实现从模子构建到性能测试等一系列步骤。
(一)Mahout简介

  目前Mahout重要包罗分类、聚类和协同过滤三种类型算法,必要注意的是Mahout算法处置惩罚的数据类型必须是矩阵类型的二进制数据,若数据为文本类型,用户须通过Mahout提供的数据转换工具完成转换,接着提交给相关算法,用户可以把Mahout当作一个Hadoop客户端,只是这个客户端包罗了大量的机器学习Jar包。

(二)Mahout入门

1、Mahout部署

  作为Hadoop的一个客户端,Mahout只要在集群中或集群外某台客户机上部署即可,实行中选择在iClient上部署Mahout。
  1. [root@iClient ~]# sudo yum install mahout
复制代码
2、Mahout访问接口
  Mahout提供了步伐和命令行接口,通过参考Mahout已有的大量机器学习算法,步伐员也可实现将某算法并行化。
【例7】 要求以joe用户运行Mahout示例步伐naivebayes,实现下载数据,创建学习器,练习学习器,末了使用测试数据针对此学习器举行性能测试。
解:
  首先须下载练习数据集和测试数据,接着运行练习MR和测试MR,但是,Mahout里的算法要求输入格式为Value和向量格式的二进制数据,故中心还须加一些步骤,将数据转换成要求格式的数据,下面的脚本naivebayes.sh可以完成这些动作。
  1. #!/bin/sh
  2. #新建本地目录,新建HDFS目录
  3. mkdir -p /tmp/mahout/20news-bydate /tmp/mahout/20news-all && hdfs dfs -mkdir mahout
  4. #下载训练和测试数据集
  5. curl http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz \
  6. -o /tmp/mahout/20news-bydate.tar.gz
  7. #将数据集解压、合并,并上传至HDFS
  8. cd /tmp/mahout/20news-bydate && tar xzf /tmp/mahout/20news-bydate.tar.gz && cd
  9. cp -R /tmp/mahout/20news-bydate/*/* /tmp/mahout/20news-all
  10. hdfs dfs -put /tmp/mahout/20news-all mahout/20news-all
  11. #使用工具类seqdirectory 将文本数据转换成二进制数据
  12. mahout seqdirectory -i mahout/20news-all -o mahout/20news-seq -ow
  13. #使用工具类seq2sparse 将二进制数据转换成算法能处理的矩阵类型二进制数据
  14. mahout seq2sparse -i mahout/20news-seq -o mahout/20news-vectors  -lnorm -nv  -wt tfidf
  15. #将总数据随机分成两部分,第一部分约占总数据80%,用来训练模型
  16. #剩下的约20%作为测试数据,用来测试模型
  17. mahout split -i mahout/20news-vectors/tfidf-vectors --trainingOutput mahout/20news-train-vectors \
  18. --testOutput mahout/20news-test-vectors  \
  19. --randomSelectionPct 40 --overwrite --sequenceFiles -xm sequential
  20. #训练Naive Bayes模型
  21. mahout trainnb -i mahout/20news-train-vectors -el -o mahout/model -li mahout/labelindex -ow
  22. #使用训练数据集对模型进行自我测试(可能会产生过拟合)
  23. mahout testnb -i mahout/20news-train-vectors -m mahout/model -l mahout/labelindex \
  24. -ow -o mahout/20news-testing
  25. #使用测试数据对模型进行测试
  26. mahout testnb -i mahout/20news-test-vectors -m mahout/model -l mahout/labelindex \
  27. -ow -o mahout/20news-testing
复制代码
  脚本写得较为大略,执行时,切记须在iClient上,以joe用户身份执行,且只能执行一次。再次执行时,先将全部数据全部删除,执行方式如下:
  1. [root@iClient ~]# cp naivebayes.sh /home/joe
  2. [root@iClient ~]# chown joe.joe naivebayes.sh
  3. [root@iClient ~]# sudo –u joe chmod +x naivebayes.sh
  4. [root@iClient ~]# sudo –u joe sh naivebayes.sh
复制代码
  脚本执行时,用户可以打开Web界面“cMaster:8088”,查察正在执行的Mahout任务;还可以通过Web界面“cMaster:50070”,定位到“/user/joe/mahout/”查察目录变革。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!

标签云

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