join:
Map端join //大表+小表,只需要map
Reduce端join //大表+大表,需要Map和Reduce
//设计组合key和flag
//分组对比器
Json:
fastJson技术
JSON.parseObject(str) //将string转成jsonObject
jo.get(key) //得到json串指定的key所对应的value,String形式
jo.getJsonArray //得到json串指定的key所对应的value,数组形式
taggen:
解析商家评论标签数据,并将其标签数量进行倒排序
重点:定义TreeSet,在set中自定义可排序的对象
在MR1代和MR2代资源调度区别:
1、一代中节点名称称为jobTracker(主节点)和taskTracker
二代中节点名称称为ResourceManager(主节点)和NodeManager
2、jobTracker充当所有资源分配和调度,和节点分配
ResourceManager只负责分配资源,然后在从节点启动MRAppMaster进程,由AppMaster负责所有作业的执行和监控
如何进行远程调试:
原因:在本地客户端无法直接向集群提交MR作业
远程调试:
1、服务端:Linux(监听)
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=192.168.23.101:8888 -cp myhadoop-1.0-SNAPSHOT.jar Helloworld
2、客户端:IDEA(连接)
在类名下,Edit Configuration ==> + Remote, 修改Port和host,然后可以进行debug
远程调试hadoop程序:
修改${HADOOP_HOME}\etc\hadoop\hadoop-env.sh文件
添加如下行:
export HADOOP_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=192.168.23.101:8888"
从ResourceMgrDelegate提交到YarnClientImpl
Rpc和Ipc的调用:
RPC:远程过程调用,在hadoop的RPC中使用的是串行化技术
IPC:进程间通信,也是使用串行化技术
HA:高可用:
使用两个namenode,避免出现问题
1、高可用的问题:
两个namenode同时运行,会发生脑裂
一个节点处于active状态
另一个节点处于standby状态 //待命状态
2、数据同步问题:
JournalNode:在两个namenode之间负责数据的同步,一般配置在datanode上
高可用配置:
=====================================
hdfs-site.xml
--------------------------------------------------------
<!-- 名字空间的逻辑名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 指向两个namenode -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 配置namenode的rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>s101:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>s105:8020</value>
</property>
<!-- 配置namenode的HTTP端口 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>s101:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>s105:50070</value>
</property>
<!-- 配置journalnode地址,配置在datanode地址-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://s102:8485;s103:8485;s104:8485/mycluster</value>
</property>
<!-- 配置容灾代理,默认即可 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置防护手段,使用shell(/bin/true) -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
core-site.xml
---------------------------------------
<!-- 使用逻辑名称来确定文件系统 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- journalnode工作目录地址 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/centos/hadoop/full/journal</value>
</property>
1、配置完成之后分发文件:
2、配置s105的ssh免密登陆:直接拷贝s101上的私钥也可以
ssh-copy-id centos@s101
ssh-copy-id centos@s102
ssh-copy-id centos@s103
ssh-copy-id centos@s104
ssh-copy-id centos@s105
3、将namenode中的工作目录全部分发到s105
rsync -lr ~/hadoop centos@s105:~
4、启动journalnode:s101
hadoop-daemons.sh start journalnode
5、hdfs namenode -initializeSharedEdits
6、启动进程:start-dfs.sh
7、将namenode变为active状态
hdfs haadmin -transitionToActive nn1
聚类:
将看似无关的集合,变成一个个有相关性的簇
举例:将星星的集合看成星团的过程叫作聚类
聚类算法多用于推荐或将数据分组
聚类的做法:k-means聚类
计算数据间的距离:欧式距离
1、读取中心点
2、将中心点和map中的所有行进行比较,并计算出距离
输出组(簇)号和组(簇)数据
3、在reduce端对数据进行重新聚合并更新中心点
4、每次迭代MR,直到中心数据不再变化,判断MR作业何时到达末尾
距离:
1、欧式距离 //欧几里得距离a(1,0) b(1,2) √(x1-x2)^2 + (y1-y2)^2 √
2、曼哈顿距离 //|x1-x2| + |y1-y2|
3、切比雪夫距离 //min{(x1-x2),(y1-y2)} 应用在概率场景
当物理维度超过三维,欧式距离就失去了意义,只能作为距离的一个衡量标准