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}etchadoophadoop-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)} 应用在概率场景 当物理维度超过三维,欧式距离就失去了意义,只能作为距离的一个衡量标准