设为首页 收藏本站
查看: 891|回复: 0

[经验分享] hadoop 配置示例

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-2-21 09:14:26 | 显示全部楼层 |阅读模式
        安装配置hadoop:

        1 安装前的准备工作

本示例所演示的过程基于RHEL 5.8(32bit)平台,用到的应用程序如下所示。
JDK: jdk-7u5-linux-i586.rpm
Hadoop:hadoop-0.20.2-cdh3u5.tar.gz

安全起见,运行Hadoop需要以普通用户的身份进行,因此,接下来先建立运行hadoop进程的用户hadoop并给其设定密码。
# useradd hadoop
# echo "password" | passwd --stdin hadoop

而后配置hadoop用户能够以基于密钥的验正方式登录本地主机,以便Hadoop可远程启动各节点上的Hadoop进程并执行监控等额外的管理工作。
[iyunv@master ~]# su - hadoop
[hadoop@master ~]$ ssh-keygen -t rsa -P ''
[hadoop@master ~]$ ssh-copy-id -i .ssh/id_rsa.pub hadoop@localhost

        2 安装JDK

Hadoop依赖于1.6 update 8或更新版本的Java环境。本文采用的jdk是rpm格式的安装包,在oracle官方的下载页面中即可找到合适的版本。其安装过程非常简单,使用类似如下命令即可。

# rpm -ivh jdk-7u5-linux-i586.rpm

Hadoop运行时需要能访问到如前安装的Java环境,这可以通过将其二进制程序(/usr/java/latest)所在的目录添加至PATH环境变量的路径中实现,也可以通过设定hadoop-env.sh脚本来进行。这里采用前一种方式,编辑/etc/profile.d/java.sh,在文件中添加如下内容:
JAVA_HOME=/usr/java/latest/
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH

切换至hadoop用户,并执行如下命令测试jdk环境配置是否就绪。
# su - hadoop
$ java -version
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)

        3.1 hadoop安装配置

# tar xf hadoop-0.20.2-cdh3u5.tar.gz -C /usr/local
# chown -R hadoop:hadoop /usr/local/hadoop-0.20.2-cdh3u5
# ln -sv /usr/local/hadoop-0.20.2-cdh3u5 /usr/local/hadoop

然后编辑/etc/profile.d/hadoop.sh,设定HADOOP_HOME环境变量的值为hadoop的解压目录,并让其永久有效。编辑/etc/profile,添加如下内容:
HADOOP_BASE=/usr/local/hadoop
PATH=$HADOOP_BASE/bin:$PATH
export HADOOP_BASE PATH

切换至hadoop用户,并执行如下命令测试hadoop是否就绪。
# hadoop version
Hadoop 0.20.2-cdh3u5
Subversion git://ubuntu-slave02/var/lib/jenkins/workspace/CDH3u5-Full-RC/build/cdh3/hadoop20/0.20.2-cdh3u5/source -r 30233064aaf5f2492bc687d61d72956876102109
Compiled by jenkins on Fri Oct  5 17:21:34 PDT 2012
From source with checksum de1770d69aa93107a133657faa8ef467


        3.2 Hadoop的配置文件:

hadoop-env.sh: 用于定义hadoop运行环境相关的配置信息,比如配置JAVA_HOME环境变量、为hadoop的JVM指定特定的选项、指定日志文件所在的目录路径以及master和slave文件的位置等;

core-site.xml: 用于定义系统级别的参数,如HDFS URL、Hadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置;

hdfs-site.xml: HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置;

mapred-site.xml:HDFS的相关设定,如reduce任务的默认个数、任务所能够使用内存的默认上下限等,此中的参数定义会覆盖mapred-default.xml文件中的默认配置;

masters: hadoop的secondary-masters主机列表,当启动Hadoop时,其会在当前主机上启动NameNode和JobTracker,然后通过SSH连接此文件中的主机以作为备用NameNode;

slaves:Hadoop集群的slave主机列表,master启动时会通过SSH连接至此列表中的所有主机并为其启动DataNode和taskTracker进程;

        3.3 Hadoop的分布式模型

Hadoop通常有三种运行模式:本地(独立)模式、伪分布式(Pseudo-distributed)模式和完全分布式(Fully distributed)模式。

安装完成后,Hadoop的默认配置即为本地模式,此时Hadoop使用本地文件系统而非分布式文件系统,而且其也不会启动任何Hadoop守护进程,Map和Reduce任务都作为同一进程的不同部分来执行。因此,本地模式下的Hadoop仅运行于本机。此种模式仅用于开发或调试MapReduce应用程序但却避免了复杂的后续操作。

伪分布式模式下,Hadoop将所有进程运行于同一台主机上,但此时Hadoop将使用分布式文件系统,而且各jobs也是由JobTracker服务管理的独立进程。同时,由于伪分布式的Hadoop集群只有一个节点,因此HDFS的块复制将限制为单个副本,其secondary-master和slave也都将运行于本地主机。此种模式除了并非真正意义的分布式之外,其程序执行逻辑完全类似于完全分布式,因此,常用于开发人员测试程序执行。

要真正发挥Hadoop的威力,就得使用完全分布式模式。由于ZooKeeper实现高可用等依赖于奇数法定数目(an odd-numbered quorum),因此,完全分布式环境需要至少三个节点。

        配置Hadoop的伪分布式模式

传统上使用的hadoop-site.xml文件已经过时,现在分别使用core-site.xml、mapred-site.xml和hdfs-site.xml来取代core-default.xml、mapred-default.xml和 hdfs-default.xml中的默认配置。hadoop为这些文件提供了模板,其关于xml文档文件格式定义的部分及<configure></configure>已经存在,此时所需要做的仅是在其中添加相应的配置即可。

        3.4.1 编辑conf/core-site.xml,配置Hadoop的核心属性
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/hadoop/temp</value>
  </property>

  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:8020</value>
  </property>  
</configuration>

上面示例中hadoop.tmp.dir属性用于定义Hadoop的临时目录,其默认为/tmp/hadoop-${username}。HDFS进程的许多目录默认都在此目录中,本示例将其定义到了/hadoop/temp目录,需要注意的是,要保证运行Hadoop进程的用户对其具有全部访问权限。fs.default.name属性用于定义HDFS的名称节点和其默认的文件系统,其值是一个URI,即NameNode的RPC服务器监听的地址(可以是主机名)和端口(默认为8020)。其默认值为file:///,即本地文件系统。

        3.4.2 编辑conf/mapred-site.xml,定义MapReduce

运行MapReduce需要为其指定一个主机作为JobTracker节点,在一个小规模的Hadoop集群中,它通常跟NameNode运行于同一物理主机。可以通过mapred.job.trakcer属性定义JobTracker监听的地址(或主机名)和端口(默认为8021),与前面的fs.default.name属性的值不同的是,这不是一个URI,而仅一个“主机-端口”组合。

在MapReduce作业运行过程中,中间数据(intermediate data)和工作文件保存于本地临时文件中。根据运行的MapReduce作业不同,这些数据文件可能会非常大,因此,应该通过mapred.local.dir属性为其指定一个有着足够空间的本地文件系统路径,其默认值为${hadoop.tmp.dir}/mapred/local。mapred.job.tracker可以接受多个以逗号分隔路径列表作为其值,并会以轮流的方式将数据分散存储在这些文件系统上,因此指定位于不同磁盘上的多个文件系统路径可以分散数据I/O。

另外,MapReduce使用分布式文件系统为各TaskTracker保存共享数据,这可以通过mapred.system.dir属性进行定义,其默认值为${hadoop.tmp.dir}/mapred/system。下面给出了一个较简单的mapred-site.xml文件示例。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>localhost:8021</value>
  </property>
</configuration>

        3.4.3 编辑conf/hdfs-site.xml,定义hdfs的属性

HDFS进程有许多属性可以定义其工作路,如dfs.name.dir属性定义的HDFS元数据持久存储路径默认为${hadoop.tmp.dir}/dfs/name、dfs.data.dir属性定义的DataNode用于存储数据块的目录路径默认为${hadoop.tmp.dir}/dfs/data、fs.checkpoint.dir属性定义的SecondaryNameNode用于存储检查点文件的目录默认为${hadoop.tmp.dir}/dfs/namesecondary。

为了数据可用性及冗余的目的,HDFS会在多个节点上保存同一个数据块的多个副本,其默认为3个。而只有一个节点的伪分布式环境中其仅用保存一个副本即可,这可以通过dfs.replication属性进行定义。如下所示的内容即可作为最简单的hdfs-site.xml配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

        3.4.4 格式化名称节点

以hadoop用户运行如下命令
$ hadoop namenode -format

其执行后会显示为类似如下内容:
17/02/06 22:16:02 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = localhost.localdomain/127.0.0.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.20.2-cdh3u5
STARTUP_MSG:   build = git://ubuntu-slave02/var/lib/jenkins/workspace/CDH3u5-Full-RC/build/cdh3/hadoop20/0.20.2-cdh3u5/source -r 30233064aaf5f2492bc687d61d72956876102109; compiled by 'jenkins' on Fri Oct  5 17:21:34 PDT 2012
************************************************************/
17/02/06 22:16:03 INFO util.GSet: VM type       = 32-bit
17/02/06 22:16:03 INFO util.GSet: 2% max memory = 19.33375 MB
17/02/06 22:16:03 INFO util.GSet: capacity      = 2^22 = 4194304 entries
17/02/06 22:16:03 INFO util.GSet: recommended=4194304, actual=4194304
17/02/06 22:16:03 INFO namenode.FSNamesystem: fsOwner=hadoop (auth:SIMPLE)
17/02/06 22:16:04 INFO namenode.FSNamesystem: supergroup=supergroup
17/02/06 22:16:04 INFO namenode.FSNamesystem: isPermissionEnabled=true
17/02/06 22:16:04 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=1000
17/02/06 22:16:04 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
17/02/06 22:16:04 INFO common.Storage: Image file of size 112 saved in 0 seconds.
17/02/06 22:16:05 INFO common.Storage: Storage directory /hadoop/temp/dfs/name has been successfully formatted.
17/02/06 22:16:05 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost.localdomain/127.0.0.1
************************************************************/

其中的“Storage directory /hadoop/temp/dfs/name has been successfully formatted”一行信息表明对应的存储已经格式化成功。

        3.4.5 启动hadoop

Hadoop提供了2个脚本start-dfs.sh和start-mapred.sh,分别用于启动hdfs相关的进程和mapred相关的进程。事实上,为了使用的便捷性,在NameNode和JobTracker运行于同一主机的场景中,Hadoop还专门提供了脚本start-all.sh脚本来自动执行前述两个脚本。

$ /usr/local/hadoop/bin/start-all.sh
其会输出类似如下内容:
starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-localhost.localdomain.out
localhost: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-localhost.localdomain.out
starting jobtracker, logging to /usr/local/hadoop/logs/hadoop-hadoop-jobtracker-localhost.localdomain.out
localhost: starting tasktracker, logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-localhost.localdomain.out

运行jps命令查看正在运行的Hadoop进程
$ jps | grep -iv "jps"
29326 DataNode
29478 SecondaryNameNode
29685 TaskTracker
29208 NameNode
29563 JobTracker

        3.4.6 Hadoop进程监听的地址和端口

Hadoop启动时会运行两个服务器进程,一个为用于Hadoop各进程之间进行通信的RPC服务器,另一个是提供了便于管理员查看Hadoop集群各进程相关信息页面的HTTP服务器。

用于定义各RPC服务器所监听的地址和端口的属性有如下几个:
fs.default.name:定义HDFS的NameNode用于提供URI所监听的地址和端口,默认端口为8020;
dfs.datanode.ipc.address:DataNode上IPC服务器监听的地址和端口,默认为0.0.0.0:50020;
mapred.job.tracker:JobTracker的PRC服务器所监听的地址和端口,默认端口为8021;
mapred.task.tracker.report.address:TaskTracker的RPC服务器监听的地址和端口;TaskTracker的子JVM使用此端口与TaskTracker进行通信,它仅需要监听在本地回环地址127.0.0.1上,因此可以使用任何端口;只有在当本地没有回环接口时才需要修改此属性的值;

除了RPC服务器之外,DataNode还会运行一个TCP/IP服务器用于数据块传输,其监听的地址和端口可以通过dfs.datanode.address属性进行定义,默认为0.0.0.0:50010。

可用于定义各HTTP服务器的属性有如下几个:
mapred.job.tracker.http.addrss:JobTracker的HTTP服务器地址和端口,默认为0.0.0.0:50030;
mapred.task.tracker.http.address:TaskTracker的HTTP服务器地址和端口,默认为0.0.0.0:50060;
dfs.http.address:NameNode的HTTP服务器地址和端口,默认为0.0.0.0:50070;
dfs.datanode.http.address:DataNode的HTTP服务器地址和端口,默认为0.0.0.0:50075;
dfs.secondary.http.address:SecondaryNameNode的HTTP服务器地址和端口,默认为0.0.0.0:50090;

上述的HTTP服务器均可以通过浏览器直接访问以获取对应进程的相关信息。

下面的命令可以查看jvm监听的端口。
$ netstat -tnlp | grep "java"
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:50020               0.0.0.0:*                   LISTEN      29326/java         
tcp        0      0 0.0.0.0:52805               0.0.0.0:*                   LISTEN      29208/java         
tcp        0      0 0.0.0.0:50090               0.0.0.0:*                   LISTEN      29478/java         
tcp        0      0 0.0.0.0:50060               0.0.0.0:*                   LISTEN      29685/java         
tcp        0      0 0.0.0.0:50030               0.0.0.0:*                   LISTEN      29563/java         
tcp        0      0 0.0.0.0:51664               0.0.0.0:*                   LISTEN      29478/java         
tcp        0      0 0.0.0.0:54898               0.0.0.0:*                   LISTEN      29326/java         
tcp        0      0 0.0.0.0:55475               0.0.0.0:*                   LISTEN      29563/java         
tcp        0      0 127.0.0.1:8020              0.0.0.0:*                   LISTEN      29208/java         
tcp        0      0 127.0.0.1:44949             0.0.0.0:*                   LISTEN      29685/java         
tcp        0      0 127.0.0.1:8021              0.0.0.0:*                   LISTEN      29563/java         
tcp        0      0 0.0.0.0:50070               0.0.0.0:*                   LISTEN      29208/java         
tcp        0      0 0.0.0.0:50010               0.0.0.0:*                   LISTEN      29326/java         
tcp        0      0 0.0.0.0:50075               0.0.0.0:*                   LISTEN      29326/java     


        4 Hadoop命令

hadoop有很多子命令,用于完成不同的功能,这个可以通过如下命令查看。
$ hadoop

其中的fs子命令用于进行跟文件系统相关的多种操作,如创建目录、复制文件或目录等,其具体的使用帮助可以使用如下命令获得。
$ hadoop fs -help

hadoop的fs命令能同时跟本地文件系统和HDFS交互,甚至可以跟Amazon的S3进行交互。其使用URI格式路径引用文件路径,完全的URI格式类似schema://authority/path,其中schema类似于协议,这里可以使用hdfs或file,分别用于引用 HDFS文件或本地文件系统中的文件。而对于HDFS来说,authority是指Namenode主机,path是指具体的文件路径。例如,在伪文件系统模式中,HDFS运行于本机的8020端口,因此hdfs://localhost:8020/user/hadoop/test.txt就是一个完整意义上的URI。事实上,在使用中,也可以省略URI中的schema://authority部分,此时其使用配置文件中默认名称段的定义,如我们前面定义的类似如下段的配置信息:

  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
  </property>

在fs命令用于实现在本地文件系统和HDFS之间传递文件时,可以使用-get(从HDFS中复制文件至本地文件系统)或-put(将本地文件复制到HDFS中)命令实现,而fs会根据使用的命令来判断哪个是本地文件系统路径,哪个是HDFS文件系统路径,如将本地的/etc/issue复制到HDFS中存放至当前hadoop用户的目录中,则可使用如下命令:

$ hadoop fs -put /etc/issue  hdfs://localhost:9000/user/hadoop/
或使用命令
$ hadoop fs -put /etc/issue  /user/hadoop/

复制的结果可以使用如下命令查看:
$ hadoop fs -ls
Found 1 items
-rw-r--r--   1 hadoop supergroup         74 2012-09-20 23:03 /user/hadoop/issue



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345031-1-1.html 上篇帖子: hadoop 分布式示例 下篇帖子: hadoop集群环境搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表