Hadoop环境准备
1.解压hadoop压缩包(2.X版本) 2.配置环境变量并重新加载 3.检测是否正常启动
Hadoop目录结构
bin 程序文件 etc 配置文件 share 说明文档 sbin 操作命令 readme 产品说明
Hadoop官网案例
1.grep过滤案例 hadoop jar share/.... grep 目标文件 输出位置 2.wordcount统计案例 hadoop jar share/.... word 目标文件 输出位置
异常情况
服务无法正常启动或者中途自动结束的情况 1.配置文件书写格式不到位 2.计算机硬件设备要求不够
伪分布式
分布式:将一个整体拆分成多个个体分撒在不同的机器上运行 伪分布式:用一台机器模拟多台机器的效果 完全分布式:真正的使用多台机器 说白了 在linux中所有的功能基本都是靠配置文件的形式来实现 hadoop/etc/hadoop2.X 配置文件常见后缀名 .xml .ini .conf 常见软件端口号 50070 # hadoop hdfs 8088 # hadoop yarn/mapreduce 3306 # MySQL 6379 # redis 27017 # mongodb
完全分布式
1.多台机器准备 2.文件拷贝 全量拷贝 scp 增量拷贝 rsync 3.如何高效管理多台机器 自定义内容分发脚本(shell语言) 1.脚本文件代码格式 2.修改文件权限chmod
完全分布式环境搭建
可能会出现你们的机器无法操作的局面 不停的使用jps查看 哪个服务停了就去启动
配置集群
单点启动
一台台机器依次启动(效率低下 不推荐)
ssh配置
公钥私钥交互
群起配置
一台机器可以操作集群所有机器(实际工作推荐)
1)准备 3台客户机 2)安装 JDK 3)配置环境变量 4)安装 Hadoop 5)配置环境变量 6)配置集群 7)单点启动 8)配置 ssh 9)群起并测试集群 详细: 1)准备 3台客户机(关闭防火墙、静态 ip、主机名称) 克隆机器修改主机名和主机IP地址 2)安装 JDK 利用scp命令拷贝数据文件至三个客户机 scp -r /opt/module root@hadoop102:/opt/module scp -r /opt/module root@hadoop103:/opt/module scp -r /opt/module root@hadoop104:/opt/module """ 也可以在A机器将B机器文件拷贝给C机器 scp -r root@hadoop101:/opt/module root@hadoop103:/opt/module """ # 扩展:拷贝文件的命令有scp(全量拷贝)、rsync(增量拷贝) """ scp(全量拷贝) scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname 命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称 rsync(增量拷贝) rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname 命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称 参数详解 r 递归 v 显示复制过程 l 拷贝符号连接 """ 3)配置环境变量 1.利用scp命令拷贝环境变量文件至三个客户机 scp /etc/profile root@hadoop102:/etc/profile scp /etc/profile root@hadoop103:/etc/profile scp /etc/profile root@hadoop104:/etc/profile 2.source文件配置 source /etc/profile 3.验证是否成功 java 4)扩展:集群分发脚本 复制文件到所有节点的相同目录下 1.在/usr/local/bin下创建sync文件并填写以下内容 [jason@hadoop102 ~]$ cd /usr/local/bin [jason@hadoop102 bin]$ touch xsync [jason@hadoop102 bin]$ vi xsync """ 文件内容 #!/bin/bash #1 获取输入参数个数,如果没有参数,直接退出 pcount=$# if((pcount==0)); then echo no args; exit; fi #2 获取文件名称 p1=$1 fname=`basename $p1` echo fname=$fname #3 获取上级目录到绝对路径 pdir=`cd -P $(dirname $p1); pwd` echo pdir=$pdir #4 获取当前用户名称 user=`whoami` #5 循环 for((host=103; host<105; host++)); do echo ------------------- hadoop$host -------------- rsync -rvl $pdir/$fname $user@hadoop$host:$pdir done """ 2.修改权限 chmod 777 xsync 3.测试 在当前机器随便找一个其他机器没有的目录 xsync test/ 5)集群配置 集群部署规划 hadoop102 hadoop103 hadoop104 HDFS NameNode/DataNode DataNode SecondaryNameNode/DataNode YARN NodeManager ResourceManager/NodeManager NodeManager '''在102上修改,然后用xsync脚本直接同步''' 1.配置 core-site.xml(修改主机名即可) [jason@hadoop102 hadoop]$ vi core-site.xml """ <!-- 指定 HDFS 中 NameNode 的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop102:9000</value> </property> <!-- 指定 Hadoop 运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property> """ 2.HDFS 配置文件 1.配置 hadoop-env.sh [jason@hadoop102 hadoop]$ vi hadoop-env.sh """内容(有就不用改了) export JAVA_HOME=/opt/module/jdk1.8.0_144 """ 2.配置 hdfs-site.xml(将伪分布式配置删除添加下列配置) [jason@hadoop102 hadoop]$ vi hdfs-site.xml """内容 <!-- 指定 Hadoop 辅助名称节点主机配置 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop104:50090</value> </property> """ 3.YARN 配置文件 1.配置 yarn-env.sh [jason@hadoop102 hadoop]$ vi yarn-env.sh """内容(有就不用改了) export JAVA_HOME=/opt/module/jdk1.8.0_144 """ 2.配置 yarn-site.xml(修改主机名即可) [jason@hadoop102 hadoop]$ vi yarn-site.xml """内容 <!-- Reducer 获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定 YARN 的 ResourceManager 的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop103</value> </property> """ 4.MapReduce 配置文件 1.配置 mapred-env.sh [jason@hadoop102 hadoop]$ vi mapred-env.sh """内容(伪分布式配了就不用改了) export JAVA_HOME=/opt/module/jdk1.8.0_144 """ 2.配置 mapred-site.xml(伪分布式配了就不用改了) [jason@hadoop102 hadoop]$ cp mapred-site.xml.template mapred-site.xml [jason@hadoop102 hadoop]$ vi mapred-site.xml """内容 <!-- 指定 MR 运行在 Yarn 上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> """ 3.在集群上分发配置好的 Hadoop 配置文件 [jason@hadoop102 etc]$ xsync hadoop/ 4.查看文件分发情况 [jason@hadoop103 hadoop]$ cat /opt/module/hadoop- 2.7.2/etc/hadoop/core-site.xml
1.如果集群是第一次启动,需要格式化 NameNode(我们不是 因为前面弄了伪分布式) [jason@hadoop102 hadoop-2.7.2]$ hadoop namenode -format """ 如果集群不是第一次启动,需要删除data和logs目录 [jason@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/ [jason@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/ [jason@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/ """ 2.在 hadoop102 上启动 NameNode和DataNode [jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode [jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode 3.去103和104启动datanode(namenode就一个) [jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode [jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode 4.浏览器验证 hadoop102:50070
""" 上述单点启动的方式每次都一个一个节点启动 如果节点数量很多该如何解决 """ # 公钥私钥工作原理 # 知识补充:查看know_hosts文件(访问过的主机地址) [jason@hadoop102 ~]$ ll # 无法查看 [jason@hadoop102 ~]$ ls -al # 可以查看 [jason@hadoop102 ~]$ cd .ssh [jason@hadoop102 .ssh]$ ll [jason@hadoop102 .shh]$ cat known_hosts # 生成公钥私钥 [jason@hadoop102 .ssh]$ ssh-keygen -t rsa # 连续回车即可 # 将102公钥拷贝到103和104 [jason@hadoop102 .shh]$ ssh-copy-id hadoop103 [jason@hadoop102 .shh]$ ssh-copy-id hadoop104 """ hadoop103中的.ssh在拷贝前后文件是有变化的 hadoop104中的.ssh在拷贝前后文件是有变化的 """ # 免密直接访问103和104 ssh hadoop103/hadoop104 # 自己用ssh访问自己也需要输入密码,可以采用相同措施解决 [jason@hadoop102 .shh]$ ssh-copy-id hadoop102 # 由于hadoop103上有一个resurcemanage所以也需要配置ssh [jason@hadoop103 .ssh]$ ssh-keygen -t rsa [jason@hadoop103 .shh]$ ssh-copy-id hadoop102 [jason@hadoop103 .shh]$ ssh-copy-id hadoop103 [jason@hadoop103 .shh]$ ssh-copy-id hadoop104
1.配置 文件位置:/opt/module/hadoop-2.7.2/etc/hadoop/slaves [jason@hadoop102 hadoop]$ vi slaves """内容(内容清空再添加) hadoop102 hadoop103 hadoop104 """ # 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。 2.同步所有节点配置文件 [jason@hadoop102 hadoop]$ xsync slaves 3.将之前单节点启动的datanode、namenode全部退出 [jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode [jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop namenode [jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode [jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode 4.启动HDFS [jason@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh 5.验证每个节点对于启动的服务 jps查看照着之前的表格比较不能出错 6.启动yarn(一定要在hadoop103上启动 因为rm在这里) """ 这里需要将hadoop03的公钥分别发送给hadoop102、hadoop103、hadoop104 """ [jason@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh 7.验证每个节点对于启动的服务 jps查看照着之前的表格比较不能出错
1.上传文件到集群 1.小文件 [jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wc.input / 2.大文件 [jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz / 3.浏览器界面测试
1. 各个服务组件逐一启动/停止 (1)分别启动/停止 HDFS 组件 hadoop-daemon.sh start/stop namenode/datanode/ secondarynamenode (2)启动/停止 YARN yarn-daemon.sh start /stop resourcemanager/nodemanager 2. 各个模块分开启动/停止(配置 ssh 是前提)常用 (1)整体启动/停止 HDFS start-dfs.sh/stop-dfs.sh (2)整体启动/停止 YARN start-yarn.sh/stop-yarn.sh
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时 的同步,比如,每隔十分钟,同步一次时间 1. 时间服务器配置(必须 root 用户) (1)检查 ntp 是否安装 [root@hadoop102 hadoop-2.7.2]# rpm -qa | grep ntp (2)修改 ntp 配置文件 [root@hadoop102 hadoop-2.7.2]# vi /etc/ntp.conf a)修改1(授权 192.168.1.0-192.168.1.255 网段上的所有机器可以从这台机器上查 询和同步时间) # 解开注释 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap b)修改2(集群在局域网中,不使用其他互联网上的时间) # 加上注释 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群 中的其他节点提供时间同步) server 127.127.1.0 fudge 127.127.1.0 stratum 10 (3)修改/etc/sysconfig/ntpd 文件 [root@hadoop102 hadoop-2.7.2]$ vim /etc/sysconfig/ntpd 增加内容如下(让硬件时间与系统时间一起同步) SYNC_HWCLOCK=yes (4)重新启动 ntpd 服务 [root@hadoop102 桌面]$ service ntpd start [root@hadoop102 桌面]$ service ntpd status (5)设置 ntpd 服务开机启动 [root@hadoop102 桌面]$ chkconfig ntpd on 2. 其他机器配置(必须 root 用户) 分 时 日 月 周 (1)在其他机器配置 1 分钟与时间服务器同步一次 root@hadoop103 hadoop2-7.2]$ crontab -e 编写定时任务如下: */1 * * * * /usr/sbin/ntpdate hadoop102 (2)修改任意机器时间 [root@hadoop103 ~]$ date -s "2020-11-11 11:11:11" (3)一分钟后查看机器是否与时间服务器同步 [root@hadoop103 ~]$ date # 测试的时候可以将 10 分钟调整为 1 分钟,节省时间。 (4)主动同步时间 [root@hadoop103 root]$ /usr/sbin/ntpdate hadoop102
""" 我们从apche官网下载的hadoop包是32位的,如果我们需要将其编译成64位 可以在centos64位的环境下编译之后就会是64位并且在编译过程中还可以加入一些额外的功能 """ 1.前期准备工作 1.1.CentOS 联网 1.2.jar包准备(hadoop 源码、JDK8、maven、ant 、protobuf) 1)hadoop-2.7.2-src.tar.gz 2)jdk-8u144-linux-x64.tar.gz 3)apache-ant-1.9.9-bin.tar.gz(build 工具,打包用的) 4)apache-maven-3.0.5-bin.tar.gz 5)protobuf-2.5.0.tar.gz(序列化的框架) 2.jar包安装 2.1.JDK解压、配置环境变量 JAVA_HOME 和 PATH,验证 java-version(如下都需要验证是否配置成功) [software] tar -zxf jdk-8u144-linux- x64.tar.gz -C /opt/module/ [software] vi /etc/profile #JAVA_HOME: export JAVA_HOME=/opt/module/jdk1.8.0_144 export PATH=$PATH:$JAVA_HOME/bin [software] source /etc/profile 验证命令:java-version 2.2.Maven 解压、配置 MAVEN_HOME 和 PATH [software] tar -zxvf apache-maven-3.0.5- bin.tar.gz -C /opt/module/ [apache-maven-3.0.5] vi conf/settings.xml <mirrors> <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</ur l> </mirror> </mirrors> [apache-maven-3.0.5] vi /etc/profile #MAVEN_HOME export MAVEN_HOME=/opt/module/apache-maven-3.0.5 export PATH=$PATH:$MAVEN_HOME/bin [software] source /etc/profile 验证命令:mvn -version 2.3.ant 解压、配置 ANT _HOME 和 PATH [software] tar -zxvf apache-ant-1.9.9- bin.tar.gz -C /opt/module/ [apache-ant-1.9.9] vi /etc/profile #ANT_HOME export ANT_HOME=/opt/module/apache-ant-1.9.9 export PATH=$PATH:$ANT_HOME/bin [software] source /etc/profile 验证命令:ant -version 2.4.安装 glibc-headers 和 g++ 命令如下 [apache-ant-1.9.9] yum install glibc-headers [apache-ant-1.9.9] yum install gcc-c++ 2.5.安装 make 和 cmake [apache-ant-1.9.9] yum install make [apache-ant-1.9.9] yum install cmake 2.6.解压 protobuf ,进入到解压后 protobuf 主目录,/opt/module/protobuf-2.5.0,然后相继执行命令 [software] tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/ [opt] cd /opt/module/protobuf-2.5.0/ [protobuf-2.5.0] ./configure [protobuf-2.5.0] make [protobuf-2.5.0] make check [protobuf-2.5.0] make install [protobuf-2.5.0] ldconfig [hadoop-dist] vi /etc/profile #LD_LIBRARY_PATH export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0 export PATH=$PATH:$LD_LIBRARY_PATH [software] source /etc/profile 验证命令:protoc --version 2.7.安装 openssl 库 [software] yum install openssl-devel 2.8.安装 ncurses-devel 库 [software] yum install ncurses-devel 3.编译源码 1.解压源码到/opt/目录 [software] tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/ 2.进入到 hadoop 源码主目录 [hadoop-2.7.2-src] pwd /opt/hadoop-2.7.2-src 3.通过 maven 执行编译命令(大概需要30分钟) [hadoop-2.7.2-src] mvn package -Pdist,native - DskipTests -Dtar 4.成功的64位hadoop包在/opt/hadoop-2.7.2-src/hadoop-dist/target下 [target] pwd /opt/hadoop-2.7.2-src/hadoop-dist/target 5.编译源码过程中常见的问题及解决方案 1.MAVEN install 时候 JVM 内存溢出 处理方式:在环境配置文件和 maven 的执行文件均可调整 MAVEN_OPT 的 heap 大 小。(详情查阅 MAVEN 编译 JVM 调优问题,如:http://outofmemory.cn/code- snippet/12652/maven-outofmemoryerror-method) 2.编译期间 maven 报错。可能网络阻塞问题导致依赖库下载不完整导致,多次执行命 令(一次通过比较难): mvn package -Pdist,nativeN -DskipTests -Dtar 3.报 ant、protobuf 等错误,插件下载未完整或者插件版本问题,最开始链接有较多特 殊情况,同时推荐