Day7.Hadoop学习笔记5

零、了解推荐算法

  1. 推荐算法
    算法是什么?我们可以把它简化为一个函数。函数接受若干个参数,输出一个返回值。
    推荐算法是计算机专业中的一种算法,通过一些数学算法,推测出用户可能喜欢的东西,多用于电商项目中。
    所谓推荐算法就是利用用户的一些行为,通过一些数学算法,推测出用户可能喜欢的东西。
  2. 协同过滤
    协同过滤算法(Collaborative Filtering, CF)是很常用的一种算法,在很多电商网站上都有用到。CF算法包括基于用户的CF(User-based CF)和基于物品的CF(Item-based CF)
  • 基于用户的CF原理如下:
    ①分析各个用户对item的评价(通过浏览记录、购买记录等);
    ②依据用户对item的评价计算得出所有用户之间的相似度;
    ③选出与当前用户最相似的N个用户;
    ④将这N个用户评价最高并且当前用户又没有浏览过的item推荐给当前用户。

  • 基于物品的CF原理大同小异,只是主体在于物品:
    ①分析各个用户对item的浏览记录。
    ②依据浏览记录分析得出所有item之间的相似度;
    ③对于当前用户评价高的item,找出与之相似度最高的N个item;
    ④将这N个item推荐给用户。

  1. 拟合
    形象的说,拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。因为这条曲线有无数种可能,从而有各种拟合方法。拟合的曲线一般可以用函数表示,根据这个函数的不同有不同的拟合名字。
    常用的拟合方法有如最小二乘法线性拟合、最小二乘法曲线拟合等。
  2. 推荐系统
  • 目的1. 帮助用户找到想要的商品(新闻/音乐/……),发掘长尾
    帮用户找到想要的东西,谈何容易。商品茫茫多,甚至是我们自己,也经常点开淘宝,面对眼花缭乱的打折活动不知道要买啥。在经济学中,有一个著名理论叫长尾理论(The Long Tail)。
    套用在互联网领域中,指的就是最热的那一小部分资源将得到绝大部分的关注,而剩下的很大一部分资源却鲜少有人问津。这不仅造成了资源利用上的浪费,也让很多口味偏小众的用户无法找到自己感兴趣的内容。

  • 目的2. 降低信息过载
    互联网时代信息量已然处于爆炸状态,若是将所有内容都放在网站首页上用户是无从阅读的,信息的利用率将会十分低下。因此我们需要推荐系统来帮助用户过滤掉低价值的信息。

  • 目的3. 提高站点的点击率/转化率
    好的推荐系统能让用户更频繁地访问一个站点,并且总是能为用户找到他想要购买的商品或者阅读的内容。

  • 目的4. 加深对用户的了解,为用户提供定制化服务
    可以想见,每当系统成功推荐了一个用户感兴趣的内容后,我们对该用户的兴趣爱好等维度上的形象是越来越清晰的。当我们能够精确描绘出每个用户的形象之后,就可以为他们定制一系列服务,让拥有各种需求的用户都能在我们的平台上得到满足。

一、推荐实战(基于Mahoot算法库实现)

  • 什么是Mahoot?
    于一些分布式计算框架,实现一些常用的算法库例如:聚类、分类、协同过滤(推荐)。因为mahout封装一些常见的算法,这些算法的实现分为单机实现分布式实现,通常单机实现应用在小规模数据集的计算。分布式实现该类算法通用使用MapReduce或者Spark实现对海量数据算法分析。

  • 基于物品的协同过滤算法使用

  1. 到官网,下载Mahoot。我的版本是apache-mahout-distribution-0.13.0.tar.gz
  2. 上传到服务器/CentOS中,并解压
 tar -zxf apache-mahout-distribution-0.13.0.tar.gz  -C /usr/
  1. 准备算法,输入所需的数据格式 示例:rec_demo.log
用户ID,商品ID,评价得分
1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.5
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
  1. 文件上传
start-dfs.sh	#启动服务
start-yarn.sh	#启动服务
hadoop dfs -mkdir /demo/recomand	#创建路径
hadoop fs -put rec_demo.log /demo/recomand	#将该数据上传到 HDFS指定的目录下`/demo/recomand
  1. 调用Mahout协同过滤算法对系统用户做推荐
[root@CentOS ~]# hadoop jar /usr/apache-mahout-distribution-0.13.0/mahout-mr-0.13.0-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input /demo/recomand --output /demo/mahout-out  -s SIMILARITY_LOGLIKELIHOOD
  1. 参数说明:
--input 指定输入
--output 指定输出
 -s 指定计算相似度的算法
 --startPhase 0(从哪个过程开始,默认从0阶段开始)
--endPhase=2147483647 (截止到哪个过程,默认IntegerMax)
--numRecommendations=10 (一个用户推荐多少条记录 默认10条)
  1. 漫长的等待…
#注意,如果想要重新再跑一次,需要删掉中间生成文件的文件夹和结果文件夹
hdfs dfs-rm -r -f /user	#删临时中间文件
hdfs dfs -rm -r -f /demo/mahout-out	#删结果文件

  1. 输出推荐结果
1	[104:2.8088317,106:2.5915816,105:2.5748677]
2	[105:3.5743618,106:3.3991857]
3	[103:4.336442,106:4.0915813,102:4.0915813]
4	[102:3.6903737,105:3.6903737]
5	[107:3.663558]

二、HDFS 和 YARN的HA构建

环境准备

  • CentOS-6.5 64 bit
  • jdk-7u79-linux-x64.rpm
  • hadoop-2.6.0.tar.gz
  • zookeeper-3.6.4.tar.gz

集群架构图 图三

机器分配

CentOSA(192.168.153.139)CentOSB(192.168.153.140)CentOSC(192.168.153.141)
Name NodeName Node
Data NodeData NodeData Node
Node ManagerNode ManagerNode Manager
Journal NodeJournal NodeJournal Node
DFSZKFailoverControllerDFSZKFailoverController
Resource ManagerResource Manager
ZookeeperZookeeperZookeeper
  1. 准备三台CentOS-6.5 64位主机,安装好Linux64位后,执行操作激活ip
ifconfig -a		#查看ip情况
vi /etc/sysconfig/network-scripts/ifcfg-eth0	#进入vi编辑,多使用tab补全避免出错
#将onboot改成yes
保存编辑后
ifup eth0	#启动eth0
ifconfig -a		#查看ip生效否
#(我的 CentOSA inet addr是192.168.153.139)
#(我的 CentOSB inet addr是192.168.153.140)
#(我的 CentOSC inet addr是192.168.153.141)

图四

  1. 关闭防火墙 (ps:后续使用CentOSX代指三台机器同步执行)
[root@CentOSX ~]# service iptables stop
[root@CentOSX ~]# chkconfig iptables off
[root@CentOSX ~]# chkconfig --list | grep iptables
iptables       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
  1. 同步时钟
[root@CentOSX ~]# date -s '2018-12-08 8:43:21'
Sat Dec  8 08:43:21 CST 2018
[root@CentOSX ~]# clock -w
[root@CentOSX ~]# date
Sat Dec  8 08:43:33 CST 2018
  1. IP和主机名的映射关系
[root@CentOSA ~]# vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.153.139 CentOSA
192.168.153.140 CentOSB
192.168.153.141 CentOSC
#保存,退出
[root@CentOSX ~]# cat /etc/hosts	#查看是否书写配置正确
#ping CentOSX	#看一下,是否都能互相ping通
  1. 三台机器间做SSH免密码认证
    图五
[root@CentOSX ~]# ssh-keygen -t rsa
[root@CentOSX ~]# ssh-copy-id CentOSA
[root@CentOSX ~]# ssh-copy-id CentOSB
[root@CentOSX ~]# ssh-copy-id CentOSC
  1. 安装JDK并配置JAVA_HOME
yum install -y lrzsz	#安装插件,支持弹出窗口上传
rz	#打开窗口上传,上传文件jdk-8u171-linux-x64.rpm

[root@CentOSX ~]# rpm -ivh jdk-8u171-linux-x64.rpm 
[root@CentOSX ~]# vi /root/.bashrc 

HADOOP_HOME=/usr/hadoop-2.6.0
JAVA_HOME=/usr/java/latest
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
CLASSPATH=.
export JAVA_HOME
export PATH
export CLASSPATH
export HADOOP_HOME

[root@CentOSX ~]# source /root/.bashrc 
[root@CentOSX ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
  1. 解压安装Zookeeper并启动zookeeper服务
[root@CentOSX ~]# tar -zxf zookeeper-3.4.6.tar.gz -C /usr/
[root@CentOSX ~]# vi /usr/zookeeper-3.4.6/conf/zoo.cfg

tickTime=2000
dataDir=/root/zkdata
clientPort=2181
initLimit=5
syncLimit=2
server.1=CentOSA:2887:3887
server.2=CentOSB:2887:3887
server.3=CentOSC:2887:3887

[root@CentOSX ~]# mkdir /root/zkdata

#注意,此时切换到 非同步状态
[root@CentOSA ~]# echo 1 > /root/zkdata/myid
[root@CentOSB ~]# echo 2 > /root/zkdata/myid
[root@CentOSC ~]# echo 3 > /root/zkdata/myid

#再切回同步
[root@CentOSX ~]# /usr/zookeeper-3.4.6/bin/zkServer.sh start zoo.cfg
[root@CentOSX ~]# /usr/zookeeper-3.4.6/bin/zkServer.sh status zoo.cfg
JMX enabled by default
Using config: /usr/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: [follower|leader] --你可以看到CentOSA/B/C中有一个节点是Leader,其他两个是follower
  1. 解压安装Hadoop配置HADOOP_HOME
[root@CentOSX ~]# tar -zxf hadoop-2.6.0_x64.tar.gz -C /usr/
[root@CentOSX ~]# vi /root/.bashrc #上方已经配置过,可忽略后边这一段

HADOOP_HOME=/usr/hadoop-2.6.0
JAVA_HOME=/usr/java/latest
CLASSPATH=.
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME
export CLASSPATH
export PATH
export HADOOP_HOME

[root@CentOSX ~]# source /root/.bashrc 
  1. 修改core-site.xml

[root@CentOSX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/core-site.xml

<!--命名服务,对Name Node命名-->
<property>
      <name>fs.defaultFS</name>
      <value>hdfs://mycluster</value>
</property>
<!--指定 hadoop 系统根目录-->
<property>
     <name>hadoop.tmp.dir</name>
     <value>/usr/hadoop-2.6.0/hadoop-${user.name}</value>
</property>
<!--开启系统垃圾回收站功能,30分钟自动清除回收站-->
<property>
     <name>fs.trash.interval</name>
     <value>30</value>
</property>
<!--配置机架映射脚本-->
<property>
     <name>net.topology.script.file.name</name>
     <value>/usr/hadoop-2.6.0/etc/hadoop/rack.sh</value>
</property>
<!--建议去掉中文注释-->
  1. 创建机架脚本文件

[root@CentOSX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/rack.sh

while [ $# -gt 0 ] ; do
          nodeArg=$1
          exec</usr/hadoop-2.6.0/etc/hadoop/topology.data
          result=""
          while read line ; do
                ar=( $line )
                if [ "${ar[0]}" = "$nodeArg" ] ; then
                  result="${ar[1]}"
                fi
          done
          shift
          if [ -z "$result" ] ; then
                echo -n "/default-rack"
          else
                echo -n "$result "
          fi
done

给该脚本添加可执行权限chmod u+x /usr/hadoop-2.6.0/etc/hadoop/rack.sh

  1. 创建Datanode节点和机架映射文件
    [root@CentOSX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/topology.data
192.168.153.139 /rack1
192.168.153.140 /rack1
192.168.153.141 /rack2

该文件事实上是给rack.sh读取的

  1. 测试机架脚本
[root@CentOSX ~]# /usr/hadoop-2.6.0/etc/hadoop/rack.sh 192.168.153.139
#显示结果如下
`/rack1` [root@CentOSX ~]# 
  1. 修改hdfs-site.xml

[root@CentOSX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/hdfs-site.xml

<!--设置块的副本因子 3 -->
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>
<!--开启HDFS自动故障转移-->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
<!--配置zookeeper服务地址-->
<property>
    <name>ha.zookeeper.quorum</name>
    <value>CentOSA:2181,CentOSB:2181,CentOSC:2181</value>
</property>
<!--解释core-site.xml当中配置的hdfs://mycluster-->
<property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
</property>
<property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
</property>
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>CentOSA:9000</value>
</property>
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>CentOSB:9000</value>
</property>
<!--设置日志服务器的地址-->
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://CentOSA:8485;CentOSB:8485;CentOSC:8485/mycluster</value>
</property>
<!--设置故障转移切换实现类-->
<property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>
        org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
    </value>
</property>
<!--设置SSH秘钥信息-->
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
</property>
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property>
  1. 配置slaves信息
    [root@CentOSX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/slaves
CentOSA
CentOSB
CentOSC

注意:是每个当中配三个

  1. 第一次启动HDFS 集群
1.JPS 检查Zookeeper服务是否正常启动(有QuorumPeerMain)
2.启动所有日志服务(等20秒,再开始执行第3步,都要有JournalNode)
[root@CentOSX ~]# hadoop-daemon.sh start journalnode

3.登录CentOSA格式化NameNode
[root@CentOSA ~]# hdfs namenode -format
4.登录CentOSA启动该节点上的NameNode
[root@CentOSA ~]# hadoop-daemon.sh start namenode

5.登录CentOSB引导格式化该节点的NameNode
[root@CentOSB ~]# hdfs namenode -bootstrapStandby
6.登录CentOSB启动NameNode
[root@CentOSB ~]# hadoop-daemon.sh start namenode

7.登录CentOSA或者CentOSB将集群信息在Zookeeper做一个注册
[root@CentOSA ~]# hdfs zkfc -formatZK(如果在A上执行,B就不需要了)

8.在CentOSA和CentOSB启动zkfc进程
[root@CentOSA ~]# hadoop-daemon.sh start zkfc
[root@CentOSB ~]# hadoop-daemon.sh start zkfc(此时A、B应该都有DFSZKFailoverController)

9.CentOSA/B/C上启动DataNode服务
[root@CentOSX ~]# hadoop-daemon.sh start datanode
  • 查看机架状态
[root@CentOSB ~]# hdfs dfsadmin -printTopology
Rack: /rack1
   192.168.153.139:50010 (CentOSA)
   192.168.153.140:50010 (CentOSB)

Rack: /rack2
   192.168.153.141:50010 (CentOSC)
  1. 第二次启动
# 关闭集群
[root@CentOSA ~]# stop-dfs.sh (任意一台即可)
[root@CentOSX ~]# /usr/zookeeper-3.4.6/bin/zkServer.sh stop zoo.cfg
# 启动集群
[root@CentOSX ~]# /usr/zookeeper-3.4.6/bin/zkServer.sh start zoo.cfg
[root@CentOSA ~]# start-dfs.sh (任意一台即可)

注意,如果第二次启动过程中,namenode意外退出,用户需要在对应的机器上执行hadoop-daemon.sh start namenode

  1. 修改yarn-site.xml
    [root@CentOSX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/yarn-site.xml
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<!--开启RM高可用-->
<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>
<!--给RM集群起一个ID叫做cluster-->
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>cluster</value>
</property>
<!--声明由RM1和RM2作为Resource Manager-->
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
</property>
<!--解释RM1、RM2信息-->
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>CentOSB</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>CentOSC</value>
</property>
<!--配置Zookeeper信息-->
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>CentOSA:2181,CentOSB:2181,CentOSC:2181</value>
</property>
  1. 修改mapred-site.xml (文件需自己创建)
    [root@CentOSX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/mapred-site.xml

完整xml内容如下,粘贴即可:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
</property>
</configuration>
  1. 启动YARN
# 启动YARN (注意顺序)
[root@CentOSB ~]# yarn-daemon.sh start resourcemanager
[root@CentOSC ~]# yarn-daemon.sh start resourcemanager
[root@CentOSX ~]# yarn-daemon.sh start nodemanager

图六
图七
图八

  • 查看ResourceManager HA状态
[root@CentOSA ~]# yarn rmadmin -getServiceState rm1
active
[root@CentOSA ~]# yarn rmadmin -getServiceState rm2
standby
# 关闭
[root@CentOSB ~]# yarn-daemon.sh stop resourcemanager
[root@CentOSC ~]# yarn-daemon.sh stop resourcemanager
[root@CentOSX ~]# yarn-daemon.sh stop nodemanager
  1. 至次,搭建完成。之后需要关闭与再次开启呢?

关闭

[root@CentOSB ~]# yarn-daemon.sh stop resourcemanager 	#停B
[root@CentOSC ~]# yarn-daemon.sh stop resourcemanager
[root@CentOSX ~]# yarn-daemon.sh stop nodemanager

[root@CentOSA ~]# stop-dfs.sh (任意一台即可) #关集群
[root@CentOSX ~]# /usr/zookeeper-3.4.6/bin/zkServer.sh stop zoo.cfg	#关闭zookeeper

开启

[root@CentOSX ~]# /usr/zookeeper-3.4.6/bin/zkServer.sh start zoo.cfg #启动zookeeper
[root@CentOSA ~]# start-dfs.sh #任意一台启动

[root@CentOSB ~]# yarn-daemon.sh start resourcemanager	#B和C启动Yarn
[root@CentOSC ~]# yarn-daemon.sh start resourcemanager
[root@CentOSX ~]# yarn-daemon.sh start nodemanager

启动与关闭,大致划分三个部分(zookeeper、HDFS、Yarn)

复习、hadoop 基本命令&文件上传 指令

  1. 查看hadoop文件
hadoop fs -ls /
  1. 新建文件夹
hadoop dfs -mkdir /input 
  1. 上传本地文件
  • 终端输入:
vim test1.txt		#键入内容保存wq!
  • 上传文件:
hadoop fs -put  /test 1.txt   /input
  • 查看文件
hadoop fs -ls /input
hadoop fs -cat /input/test1.txt
  • 运行
hadoop jar /usr/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /input /output
  • 删除 例: 删除生成的output 文件夹
hadoop fs -rm -r /output
  • 修改文件夹权限
hadoop fs -chmod 777 /output

其他、

  • 计算量
    在这里插入图片描述

  • 响应时间在这里插入图片描述

  • 现有Hadoop平台比较
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值