用户登录
用户注册

分享至

hadoop搭建大数据平台

  • 作者: 求皮鞭就蜡烛
  • 来源: 51数据库
  • 2020-09-29

1、大数据简介


大数据特点:大(数据量大,PB级别的数据)、繁(多样性、复杂性,非结构化数据)、快(查询、处理、计算速度快)、有价值(Value)。大数据的4V特性:Volume(海量的数据规模),Variety(多样的数据类型),Velocity(快速的数据流转),Value(发现数据价值)。


2008年成立的Cloudera是最早将Hadoop商用的公司,为合作伙伴提供Hadoop的商用解决方案,主要是包括支持、咨询服务和培训。2009年Hadoop的创始人Doug Cutting也加盟Cloudera公司,Cloudera产品主要为CDH,Cloudera Manager,Cloudera Support。CDH是Cloudera的Hadoop发行版,完全开源,比Apache Hadoop在兼容性,安全性,稳定性上有所增强。Cloudera Manager是集群的软件分发及管理监控平台,可以在几个小时内部署好一个Hadoop集群,并对集群的节点及服务进行实时监控。Cloudera Support即是对Hadoop的技术支持。Cloudera的标价为每年每个节点4000美元。Cloudera开发并贡献了可实时处理大数据的Impala项目。


Cloudera公司的Hadoop发行版是CDH版。Google的三篇论文:MapReduce、GFS->HDFS分布式文件系统、bigtable->HBase数据库。Hadoop 1.x = MapReduce+HDFS。


2、Hadoop风雨十年


(1)2006年2月,Apache Hadoop项目正式启动以支持MapReduce和HDFS的独立发展。


(2)2007年10月,第一个Hadoop用户组会议召开,社区贡献开始急剧上升。


(3)2008年1月,Hadoop成为Apache顶级项目。


(4)2008年8月,第一个Hadoop商业化公司Cloudera成立。


(5)2009 年3月,Cloudera推出世界上首个Hadoop发行版——CDH(Cloudera's Distribution including Apache Hadoop)平台,完全由开放源码软件组成。


(6)2010年-2011年,扩大的Hadoop社区忙于建立大量的新组件(Crunch,Sqoop,Flume,Oozie等)来扩展Hadoop 的使用场景和可用性。


(7)2011年5月,Mapr Technologies公司推出分布式文件系统和MapReduce引擎——MapR Distribution for Apache Hadoop。


(8)2011年7月,Yahoo!和硅谷风险投资公司 Benchmark Capital创建了Hortonworks 公司,旨在让Hadoop更加可靠, 并让企业用户更容易安装、管理和使用Hadoop。


(9)2014年2月,Spark逐渐代替MapReduce成为Hadoop的缺省执行引擎,并成为Apache基金会顶级项目。


3、企业大数据平台架构




企业大数据平台架构分为离线计算和实时计算。离线计算如Hadoop,以及以Hadoop为底层的大数据框架,如Hive,HBase等。实时计算如Storm和Spark等,用于流式计算和在线分析。企业中,通常实时计算和离线计算都是在一个架构或一个集群中,所需要的数据共用共享。此外,搭建大数据架构还需要考虑容灾机制、监控系统、恢复机制等等。


4、Hadoop模块


Hadoop 2.x主要包括以下四个模块:


(1)Hadoop Common:为其他Hadoop模块提供基础设施。


(2)Hadoop HDFS:一个高可靠、高吞吐量的分布式文件系统。


(3)Hadoop MapReduce:一个分布式的离线并行计算框架。


(4)Hadoop YARN:一个新的MapReduce框架,任务调度与资源管理。


5、HDFS(Hadoop Distributed File System)文件系统


(1)设计思想:一次写入,多次读取,写入后存储在HDFS上就不能修改,但可以把文件下载到本地,把HDFS上的文件删除,修改后再上传到HDFS上,实现文件的修改。


(2)文件属性(文件元数据):文件名称、存储位置、副本数、权限(RWX)、有哪些存储块,各个块存储在哪些DataNode上。


(3)存储的形式:块block,块的大小:默认128MB,可以用户自定义大小。


比如:文件大小为500MB,块大小是256MB,第一个块:256MB,第二个块:244MB。


如果文件大小小于数据块的大小,它是不会占据整个块的空间的。而且多个文件不能放到一个块中。


HDFS不太适合存储大量的小文件,可以将小文件进行合并。


(4)主从架构


主节点namenode:管理存储元数据;


从节点datanode:真正存储文件,消耗硬盘。


NameNode是主节点,存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表和块所在DataNode等。


DataNode在本地文件系统存储文件块数据,以及块数据的校验和。


SecondaryNameNode是用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。


(5)读写流程


首先client通过RPC协议请求namenode获取文件的位置,然后到具体datanode上读写。在哪个datanode上读写遵循就近原则,选择距离client近的datanode读写,目的是减少网络传输的时间消耗和资源消耗。


client -> namenode


client -> datanode


淘宝文件系统是TFS,在github上开源。


6、Yarn框架


(1)主从架构


主节点:resourcemanager,管理并分配整个集群的资源;


从节点:nodemanager,消耗资源。


(2)作用:集群资源分配管理,多任务调度。


总的资源:CPU、内存、硬盘。


多任务调度:运行的任务需要时间和资源。


ApplicationMaster应用管理者:每一个应用都会有一个应用管理者。


Container容器:每个map都是在各自独立的环境中去运行(资源独立),任务就在容器中运行。


(3)ResourceManager:负责处理客户端请求,启动/监控ApplicationMaster,监控NodeManager,资源分配与调度。


NodeManager:负责单个节点上的资源管理,处理来自ResourceManager的命令和来自ApplicationMaster的命令。


ApplicationMaster:负责数据切分,为应用程序申请资源,并分配给内部任务,负责任务监控与容错。


Container:对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。


NodeManager和DataNode一般会放在一台机器上。DataNode消耗磁盘空间,NodeManager消耗资源。集群单个节点的资源都在NodeManager中,每个Container容器也都是在不同的NodeManager节点上运行的。


Yarn是在Hadoop 2.x系统中才有的新的框架组件,Hadoop 0.x 和 Hadoop 1.x 版本中的组件服务很少,只有HDFS+MapReduce。


7、Hadoop伪分布式环境搭建


(1)三种模式


Local (Standalone) Mode  本地模式:不使用HDFS文件系统,使用本地文件系统,程序员调试用;


Pseudo-Distributed Mode  伪分布式模式:单节点,一台机器,使用HDFS文件系统,程序员调试用;


Fully-Distributed Mode  完全分布式模式:真实生产环境用,集群。


(2)卸载OpenJDK,安装Oracle JDK


解压JDK:software] $ tar  -zxf  jdk-7u67-linux-x64.tar.gz  -C  /opt/modules/


在/etc/profile文件中配置环境变量:


#JAVA_HOME

export JAVA_HOME=/opt/modules/jdk1.7.0_67

export PATH=$PATH:$JAVA_HOME/bin


配置环境变量后在root用户下输入 source /etc/profile 命令,并 exit 退出,重新登录,环境变量即可生效。


(3)解压Hadoop


software] $ tar -zxf hadoop-2.5.0.tar.gz -C /opt/modules/


(4)建议:删除rm -rf /opt/modules/hadoop-2.5.0/share/doc/,里面是英文文档,没有作用


(5)配置过程


1)hadoop-env.sh、mapred-env.sh、yarn-env.sh指定Java的安装路径

export JAVA_HOME=/opt/modules/jdk1.7.0_67


2)core-site.xml,指定namenode所在机器位置及namenode和datanode之间的交互端口号,另外也是指定使用的是HDFS文件系统。Hadoop1.x系列使用的旧端口号是9000,Hadoop2.x系列使用的是8020端口号。

<property>

         <name>fs.defaultFS</name>

         <value>hdfs://hadoop-senior.ibeifeng.com:8020</value>

</property>


3)hdfs-site.xml


指定副本数个数:


<property>

          <name>dfs.replication</name>

          <value>1</value>

</property>


修改文件系统块大小:


<property>

          <name>dfs.blocksize</name>

          <value>134217728</value>

</property>


4)core-site.xml,更改Hadoop默认的临时目录位置,用于存放块文件和元数据文件

<property>

          <name>hadoop.tmp.dir</name>

          <value>/opt/modules/hadoop-2.5.0/data/tmp</value>

</property>


5)slaves,指定从节点位置(主机名),包括datanode和nodemanager


6)格式化namenode,对于元数据进行初始化,生成元数据,否则无法读取元数据


hadoop-2.5.0] $ bin/hdfs namenode -format


7)更改mapred-site.xml文件名称,指定MR运行在yarn上

<property>

           <name>mapreduce.framework.name</name>

           <value>yarn</value>

</property>


8)yarn-site.xml

<property>

            <name>yarn.nodemanager.aux-services</name>

            <value>mapreduce_shuffle</value>

</property>

<property>

            <name>yarn.resourcemanager.hostname</name>

            <value>hadoop-senior.ibeifeng.com</value>

</property>


9)Yarn外部管理界面端口号:8088,Yarn和外部浏览器的交互端口号。


HDFS外部管理界面端口号:50070,HDFS和外部浏览器的交互端口号。


SecondaryNameNode外部管理界面端口号:50090,SecondaryNameNode和外部浏览器的交互端口号。


使用IP地址加端口号也同样可以访问。如果出现无法访问的情况,可能是防火墙导致的,也可能是selinux导致的,还有可能是本地Windows的hosts文件的网络映射没有设置导致的。


8、组件启动


启动namenode:


sbin/hadoop-daemon.sh start namenode


启动datanode:


sbin/hadoop-daemon.sh start datanode


启动resourcemanager:


sbin/yarn-daemon.sh start resourcemanager


启动nodemanager:


sbin/yarn-daemon.sh start nodemanager


9、日志


日志文件:分析日志文件的格式.log和.out


.log:通过log4j记录的,记录大部分应用程序的日志信息


.out:记录标准输出和标准错误日志,少量记录


日志文件的命名规则:【框架名称-用户名-进程名-主机名.日志格式后缀】


出错一定要学会看日志,看错误信息,看.log的日志


10、Hadoop自带历史服务器


配置:mapred-site.xml


<property>

        <name>mapreduce.jobhistory.address</name>

        <value>hadoop-senior.ibeifeng.com:10020</value>

</property>

<property>

         <name>mapreduce.jobhistory.webapp.address</name>

         <value>hadoop-senior.ibeifeng.com:19888</value>

</property>


存放正在运行的Hadoop的作业记录:mapreduce.jobhistory.intermediate-done-dir


存放已经完成的Hadoop的作业目录:mapreduce.jobhistory.done-dir


由于历史服务作业记录很多,所以存储的形式是按照年/月/日形式存放在对应的目录中,以便于查找和管理。


启动历史服务器:sbin/mr-jobhistory-daemon.sh start historyserver


11、日志聚集


日志聚合是YARN提供的日志中央化管理功能,它能将运行完成的Container任务日志上传到HDFS上,从而减轻NodeManager负载,且提供一个中央化存储和分析机制。默认情况下,Container任务日志存在在各个NodeManager上,如果启用日志聚合功能需要额外的配置。简单来说,就是将MapReduce运行时产生的日志文件上传到HDFS对应的目录中,然后就可以从页面查看日志内容,直接读取HDFS上存储的日志。


yarn-site.xml


<property>

        <name>yarn.log-aggregation-enable</name>

        <value>true</value>

</property>

<property>

        <name>yarn.log-aggregation.retain-seconds</name>

        <value>106800</value>

</property>


yarn-site.xml 中的 yarn.nodemanager.remote-app-log-dir 属性代表历史日志转移到HDFS上的目录路径,默认路径为 /tmp/logs,可以用户自定义配置。


单位:秒


重启resourcemanager、nodemanager和historyserver:


sbin/yarn-daemon.sh stop resourcemanager


sbin/yarn-daemon.sh stop nodemanager


sbin/mr-jobhistory-daemon.sh stop historyserver


sbin/yarn-daemon.sh start resourcemanager


sbin/yarn-daemon.sh start nodemanager


sbin/mr-jobhistory-daemon.sh start historyserver


12、HDFS用户权限检查


配置:hdfs-site.xml,指定不检测用户权限:


<property>

       <name>dfs.permissions.enabled</name>

       <value>false</name>

</property>


配置:core-site.xml,指定Hadoop的http静态用户名:


<property>

        <name>hadoop.http.staticuser.user</name>

        <value>beifeng</value>

</property>


重启namenode、datanode、resourcemanager、nodemanager和historyserver:


sbin/hadoop-daemon.sh stop namenode


sbin/hadoop-daemon.sh stop datanode


sbin/yarn-daemon.sh stop resourcemanager


sbin/yarn-daemon.sh stop nodemanager


sbin/mr-jobhistory-daemon.sh stop historyserver


sbin/hadoop-daemon.sh start namenode


sbin/hadoop-daemon.sh start datanode


sbin/yarn-daemon.sh start resourcemanager


sbin/yarn-daemon.sh start nodemanager


sbin/mr-jobhistory-daemon.sh start historyserver


13、SecondaryNameNode


NameNode启动后的元数据存放在内存中,启动前的元数据存放在本地文件系统文件中。


HDFS格式化后生成fsimage镜像文件,其中存放文件系统元数据,NameNode会读取此元数据,并存放在内存中。


edits文件,编辑日志文件,用于保存用户对于HDFS文件系统的每一步行为操作。


NameNode启动后,先读取fsimage镜像文件,得到元数据,再读取edits日志文件,数据就不会丢失。


一般工作中NameNode不太会轻易的重启或者关闭,所以用户对于HDFS的操作行为越多,edits文件会越来越大,导致再次重启读取时间过长。


SecondaryNameNode用于减少NameNode重启的时间,合并fsimage文件和edits文件,SecondaryNameNode读取两类文件,加载到内存,写到一个新的fsimage镜像文件,然后再生成一个edits编辑日志文件,每隔一段时间将新生成的fsimage和新生成的edits合并成一个fsimage镜像文件,即每隔一段时间获取HDFS元数据的快照,这样NameNode重启只需要读取SecondaryNameNode最新生成的fsimage镜像文件即可,读取镜像文件比读取日志文件快很多。


hdfs-site.xml


<property>

       <name>dfs.namenode.secondary.http-address</name>

       <value>hadoop-senior.ibeifeng.com:50090</value>

</property>


启动命令:$ sbin/hadoop-daemon.sh start secondarynamenode


14、文件存放地址


块文件存放地址:/opt/modules/hadoop-2.5.0/data/tmp/dfs/data/current/BP-2012260383-192.168.74.128-1516569449179/current/finalized


镜像文件、日志文件存放地址:/opt/modules/hadoop-2.5.0/data/tmp/dfs/name/current


可以在hdfs-site.xml中指定fsimage文件的路径:<name>dfs.namenode.name.dir</name>

在实际的工作中这个目录可以多配几个,保证元数据信息的安全。


dfs.blocksize自定义块大小属性(单位字节),在hdfs-site.xml中


15、SSH免密码登陆


使用sbin/start-dfs.sh脚本文件启动namenode、datanode和secondarynamenode时,需要输入用户密码,使用SSH免密码登陆的话,就给用户生成公钥和私钥,用户将自己的公钥储存在远程主机上,将公钥发到需要登陆的服务器,当需要登陆时,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回去,远程主机用事先存储的公钥进行解密,如果解密成功,就证明用户是可信的,直接允许登陆shell,不再要求密码。


配置SSH免密码登陆:


cd home/beifeng/.ssh


ssh-keygen -t rsa


-t 代表指定加密类型,rsa代表加密类型中的一种,该命令可以直接写为ssh-keygen,因为系统默认的就是rsa类型。


该命令生成id_rsa和id_rsa.pub文件,其中id_rsa是私钥,id_rsa.pub是公钥。


ssh-copy-id hadoop-senior.ibeifeng.com


即生成authorized_keys和known_hosts文件,其中authorized_keys是向远程主机发送的用户公钥,known_hosts是记录文件,有记录文件就不需要再输入密码了。


Linux中的用户主目录权限一般为700或755,.ssh一般权限为700。不要随意更改用户主目录的权限、.ssh目录权限以及下面的公钥和秘钥文件的权限,随意更改会直接导致ssh免密码登录失效。


16、Hadoop配置常见错误


(1)集群ID不一致,即


NameNode的集群ID:/opt/modules/hadoop-2.5.0/data/tmp/dfs/name/current/VERSION


DataNode的集群ID:/opt/modules/hadoop-2.5.0/data/tmp/dfs/data/current/VERSION


两文件中的ClusterID不一致,这是由于多次格式化导致的。


解决方法:如果需要再次格式化,需要先删除data/tmp/下的所有文件,再进行格式化。也可以依据NameNode中的ClusterID来修改DataNode中的ClusterID。


VERSION文件内容:


namespaceID=1449791764         //文件系统的唯一标识符,在格式化后生成的

clusterID=CID-dc0c2c65-03fe-4592-bb75-3ad9c99e7974          //集群ID,每个集群都会有一个唯一的ID

cTime=0           //表示NameNode创建的时间,之后如果更新了会更新时间戳

storageType=NAME_NODE

blockpoolID=BP-707742197-192.168.189.130-1492844537644

layoutVersion=-57


(2)进程启动之后消失了


解决方法:首先去看logs下的log日志,哪个进程出错就去看哪个进程对应的log文件,注意查看日志的时候需要查看最新的时间点的日志信息,或者删除原来logs文件夹下的旧的日志,再重新启动进程生成最新的日志文件。


(3)端口号被占用,使用netstat -tlun查看端口信息,是否已经在监听状态。


(4)多用户混用。即/tmp目录下有多个用户的pid,多个用户在各自的环境中启动了同一个进程,造成pid文件冲突。


解决方法:将/tmp目录下的.pid文件全部删除,再用一个用户启动进程,生成新的.pid文件。


(5)主机名不能有下划线,有下划线直接报错。


(6)权限问题。一定要注意所有的目录的所有者和所属组都是统一的一个用户。


(7)HDFS的安全模式。有些时候非正常的操作或者跑任务也会造成HDFS进入安全模式。


(8)配置细节问题。检查配置文件,IP、主机名、映射等等是否配置正确。


17、Hadoop配置文件


Hadoop配置文件分为默认的和自定义的,每个模块对应一个文件。


系统启动会先加载默认配置文件。默认配置文件存放在jar包中,/opt/modules/hadoop-2.5.0/share/hadoop/common/hadoop-common-2.5.0.jar中存放有core-default.xml,/opt/modules/hadoop-2.5.0/share/hadoop/hdfs/hadoop-hdfs-2.5.0.jar中存放有hdfs-default.xml,/opt/modules/hadoop-2.5.0/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.5.0.jar中存放有mapred-default.xml,/opt/modules/hadoop-2.5.0/share/hadoop/yarn/hadoop-yarn-common-2.5.0.jar中存放有yarn-default.xml。


自定义配置文件保存在etc/hadoop路径下,优先级高于默认配置文件,如果自定义配置文件中有配置,会覆盖默认配置文件中的相应属性。


18、安装rz工具


切换到root用户后,用yum安装lrzsz。rz工具用于将Windows中的文件上传到Linux虚拟机中,如CentOS中,sz工具用于将Linux虚拟机中的文件下载到Windows本地,只能在远程工具中使用,不能在虚拟机中使用。


su


password:


yum -y install lrzsz


19、遇到的问题


我的虚拟机IP地址为192.168.74.128,hostname为hadoop-senior.ibeifeng.com,在成功启动了namenode、datanode、resourcemanager、nodemanager、historyserver之后,物理机的浏览器可以输入http://192.168.74.128:50070后可以正常访问HDFS管理界面,但是输入http://hadoop-senior.ibeifeng.com:50070之后提示“网页无法访问”。原因是我的物理机上的C:\\Windows\System32\drivers\etc\下的hosts文件没有做虚拟机的主机名和虚拟机的IP地址的映射,用Administrator账户登录,并修改hosts文件即可。


20、Hadoop的本地库

执行Hadoop命令报出如下警告:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

原因是由于native库是由发行者在与我们不同的系统上编译的,导致在我们的系统上native库无法识别。信息如下:

Subversion http://svn.apache.org/repos/asf/hadoop/common -r 1616291

Compiled by jenkins on 2014-08-06T17:31Z

Compiled with protoc 2.5.0

该信息中并没有获取到这位编译者是在什么系统上编译Hadoop源码的。

解决方法一:编译Hadoop的源码,但编译源码非常受网络环境的影响。

解决方法二:直接替换编译好的native本地库。

但要注意:不要直接拷贝naive到lib下,以免产生冲突,可以先删除原来的目录再拷贝过来,或者先重命名旧的native再拷贝过来新的native。


软件
前端设计
程序设计
Java相关