Hadoop 学习系列之二 企业记性选型配置 选型理念:普通的,廉价的,标准的(容易替换的),工业话大规模生产的。 Hadoop 可以自动支持多核CPU,比如选择2个四核CPU,主流主频 16-32G内存,更大的内存可以使Linux将常用的数据缓存在内存,减少IO,提高速度。 存储集群应该使用大量廉价硬盘,例如主流大容量(2T)普通SATA硬盘,出于成本考虑一般无需使用 SCSI,SAS接口类型硬盘或SSD硬盘。 网络非常重要,建议使用前兆和高带宽的交换机,但无需使用infinband这类专用设备 RAID是不需要的,可以考虑使用JBOD.RAID提供的数据的冗余容错,但Hadoop本身就提供了冗余容错的功能,所以没有必要使用RAID。 网络拓扑设计 主流构架方案使用局域网,尽量不要使用低速率的跨数据中心连接。 Hadoop支持机架感知机制。 操作系统的选择 Hadoop基于Java,因此只要能运行JVM的平台,几乎都能跑HADOOP。 32位或者64位平台均可,Hadoop没有区分位数。 操作系统主流选项是Linux,常用的发布版均可,例如CentOS,Rehat等,较新的版本均可。 Windows也可以安装Hadoop,但不建议。 很很多Apache官版之外的Hadoop发布版,例如CDH,Intel,EMC等,有和一体机融合的解决方案。 这些发布版一般比官方版本更容易安装和管理,但部分需要收费。 JDK Java是Hadoop的原生开发语言,Hadoop本身用Java书写,主要开发语言也是Java。 --配置免密码 1.生成Key文件 [anker@anker ~]$ ssh-keygen -t rsa [anker@anker ~]$ cd .ssh [anker@anker .ssh]$ ls id_rsa id_rsa.pub known_hosts 2.在另外一个机器上也做同样的操作 [anker@anker ~]$ ssh-keygen -t rsa 3.将生成的id_rsa.pub文件拷贝到另外一台机器上 scp ./id_rsa.pub [email protected]:/home/anker/.ssh/authorized_keys 在目标机器上查看 [anker@anker .ssh]$ ls -l total 12 -rw-r--r--. 1 anker anker 401 Apr 12 20:27 authorized_keys -rw-------. 1 anker anker 1671 Apr 12 20:24 id_rsa -rw-r--r--. 1 anker anker 401 Apr 12 20:24 id_rsa.pub 需要确保权限为rw-r-r,若权限不对,需要通过chmod 644 authorized_keys来进行赋权。 4.继续上面的步骤,双方都用户对方生成的公钥文件.即可以免密码访问。 RSA算法 是一种不对称加密,它有两种秘钥,一种公钥,一种私钥。 公钥可以让全世界都知道,私钥只有持有者拥有,凡是用公钥加密的内容,都可以通过私钥来解开, 凡是私钥加密的内容,通过公钥可以解开。 公钥是推不出私钥,私钥也推不出公钥。 一般的SSH的原理 客户端向服务器端发出连接请求(注意非口令认证) 服务器端向客户端发出自己的公钥 客户端使用服务器端的公钥加密认证密码,然后发给服务器端 如果通讯过程被截获,由于qie听者即使获知公钥和经过公钥加密的内容,但不拥有 私钥依然无法解密(RSA算法). 服务器端接受到密文后,用私钥解密,获知通讯密钥,后建立了通讯。 免密码原理 客户端先为自己创建一对密钥,把公用密钥放在需要访问的服务器上。 如果要连接ssh服务器,客户端软件想服务器发出请求,请求用自己的密钥进行安全验证。 服务器端收到请求后,会随机产生一段随机的密码,这段密码称为质询,然后使用客户端的公钥进行加密, 加密之后发送给客户端。 客户端软件收到质询之后,就可以用你的私人密钥解密再把它发送到服务器。 服务器比较发送来的质问和原先是否一致,若一致就进行授权,完成建立会话的操作。 [root@localhost ~]# chkconfig --list 显示开机可以自动启动的服务 [root@localhost ~]# chkconfig --add *** 添加开机自动启动***服务 [root@localhost ~]# chkconfig --del *** 删除开机自动启动***服务 安装Hadoop 1.下载Hadoop,并解压 http://archive.apache.org/dist/hadoop/core/hadoop-1.1.2/hadoop-1.1.2-bin.tar.gz tar -xzvf hadoop-1.1.2-bin.tar.gz 2.配置Hadoop 2.1 /conf/hadoop-env.sh(配置运行hadoop的环境变量) --设置Java Home export JAVA_HOME=/usr/jdk1.7.0_51 2.2 /conf/core-site.xml(配置Hadoop的核心,比如关于HDFS和MapReduce的I/O的设置) <configuration> <property> <name>fs.default.name</name> --NAMENODE的位置 <value>hdfs://anker.centos1:9000</value> </property> <property> <name>hadoop.tmp.dir</name>--Hadoop的临时路径,否则hadoop会使用系统的的tmp目录存放Hadoop的数据。而此目录在系统重启后会被清空 <value>/home/anker/hadoop-1.1.2/tmp</value> </property> <configuration> 2.3 /conf/hdfs-site.xml(配置HDFS的守护进程:namenode, secondary namenode,及datanodes) <configuration> <property> <name>dfs.replication</name>--指定在hdfs的服务器因子 <value>2</value> </property> <configuration> 2.4 /conf/mapred-site.xml(配置MAPReduce的守护进程:jobtracker, tasktracker) <configuration> <property> <name>mapred.job.tracker</name>--指定jobtracker的监听地址及端口 <value>anker.centos1:9001</value> </property> <configuration> 2.5 /conf/masters(充当master的服务器) anker.centos1 2.6 /conf/slaves(充当slave的服务器) anker.centos2 anker.centos3 3.修改host文件,包括master和slave服务器 192.168.1.107 centos1 192.168.1.109 centos2 4.关闭防火墙 service iptables stop 5.复制配置好的Hadoop到slaves节点 scp -r ./hadoop-1.1.2 [email protected]:/home/anker --r代表将所有的子目录文件全部复制过去 6.格式化namenode,观察日志信息是否提示成功 bin/hadoop/ namenode -format 7.配置本机的免密码设置(包括masters和slaves) 将本机的公钥内容(id_rsa.pub)拷贝到authorized_keys里面即可。 8.启动hadoop /bin/start-all.sh 9.查看java的启动进程,包括master和slave的进程 /usr/jdk1.7.0_25/bin/jps 杀掉进程 kill -0 13439(进程号) 10.日志存放在logs文件夹里面 namenode和jobtracker的日志记录在master上面,而tasktracker及datanode是记录在slave机器上面。 http://archive.apache.org/dist/hadoop/core/hadoop-1.1.2/hadoop-1.1.2-bin.tar.gz --安装wget yum -y install wget --删除目录下的所有文件 rm -rf * scp -r ./hadoop-1.1.2 [email protected]:/home/anker --安装Hadoop2.x 1.建立虚拟机(32位的linux) 2.安装JDK(32位的jdk) 3.编辑hosts文件 4.关闭防火墙 5.部署免密码 6.下载hadoop2.x解压 7.修改配置文件 8.分发hadoop到各个节点 9.启动集群。 Hadoop的下载地址:http://archive.apache.org/dist/hadoop/core/hadoop-2.2.0/hadoop-2.2.0.tar.gz Java的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html yarn是hadoop的第二代mapreduce,解决了第一代的缺点,提高了性能。 新建文件夹: DATA(数据文件夹) NAME(存放元数据,NAMENODE会用到) TMP(临时文件夹) 要修改的配置文件 hadoop-2.2.0/etc/hadoop/hadoop-env.sh hadoop-2.2.0/etc/hadoop/yarn-env.sh hadoop-2.2.0/etc/hadoop/slave.sh hadoop-2.2.0/etc/hadoop/core-site.sh hadoop-2.2.0/etc/hadoop/hdfs-site.sh hadoop-2.2.0/etc/hadoop/mapred-site.sh hadoop-2.2.0/etc/hadoop/yarn-site.sh //masters不用设置,除非secondary namenode不在同一台机器 修改配置文件,设置java home yarn-env.sh export JAVA_HOME=/usr/lib/j2sdk1.5-sun 修改core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://anker.centos4:9000</value>----NAMENODE的位置 </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/home/anker/hadoop-2.2.0/tmp</value>--hadoop的临时目录,需要提前建立好 <description>Abase for other temporary directories.</description> </property> <property> <name>hadoop.proxyuser.hduser.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hduser.groups</name> <value>*</value> </property> </configuration> 修改hdfs-site.xml <configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>h1:9001</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/home/grid/hadoop-2.2.0/name</value>--name目录需要提前建立好 </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/home/grid/hadoop-2.2.0/data</value>--data目录需要提前建好 </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration> 修改mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>h1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>h1:19888</value> </property> </configuration> 修改yarn-site.xml文件 <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>h1:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>h1:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>h1:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>h1:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>h1:8088</value> </property> </configuration> 启动集群及验证 格式化namenode:./bin/hdfsnamenode–format 启动hdfs: ./sbin/start-dfs.sh 此时在h1上面运行的进程有:namenode,secondarynamenode h2和h3上面运行的进程有:datanode 启动yarn: ./sbin/start-yarn.sh 此时在h1上运行的进程有:namenode,secondarynamenode,resourcemanager h2和h3上面运行的进程有:datanode,nodemanager Hadoop 2.2.0上面 nodemanager = tasktracker resourcemanager = jobtracker Hadoop 第三讲 第一个Hello.world程序来检验Hadoop是否安装成功 --hadoop自带的例子wordcount [anker@anker input]$ echo "hello world" > test1.txt [anker@anker input]$ cat test1.txt hello world [anker@anker input]$ echo "hello hadoop" > test2.txt [anker@anker input]$ cat test2.txt hello hadoop [anker@anker ~]$ cd hadoop-1.1.2 [anker@anker hadoop-1.1.2]bin/hadoop fs -ls #查看fs文件系统下面是否存在文件 [anker@anker hadoop-1.1.2]bin/hadoop fs -put ../input in #这里的hadoop是启动jvm的一个脚本 ../input上级目录的input下的文件 [anker@anker hadoop-1.1.2]bin/hadoop fs -ls ./in/* #列出in目录下的所有内容 -rw-r--r-- 2 anker supergroup 12 2014-04-25 22:46 /user/anker/in/test1.txt -rw-r--r-- 2 anker supergroup 13 2014-04-25 22:46 /user/anker/in/test2.txt [anker@anker hadoop-1.1.2]bin/hadoop jar hadoop-examples-1.1.2.jar wordcount in out #执行jar包中的wordcount类,将输出写入到out目录中 #查看输出结果 [anker@anker hadoop-1.1.2]$ bin/hadoop fs -ls Found 2 items drwxr-xr-x - anker supergroup 0 2014-04-25 22:46 /user/anker/in drwxr-xr-x - anker supergroup 0 2014-04-25 22:51 /user/anker/out [anker@anker hadoop-1.1.2]$ bin/hadoop fs -ls ./out #结果放在part-r-00000文件中 Found 3 items -rw-r--r-- 2 anker supergroup 0 2014-04-25 22:51 /user/anker/out/_SUCCESS drwxr-xr-x - anker supergroup 0 2014-04-25 22:50 /user/anker/out/_logs -rw-r--r-- 2 anker supergroup 25 2014-04-25 22:51 /user/anker/out/part-r-00000 #查看输出结果 [anker@anker hadoop-1.1.2]$ bin/hadoop fs -cat ./out/part-r-00000 hadoop 1 hello 2 world 1 #通过web了解hadoop的活动 1.通过用浏览器和http访问jobtracker所在节点的50030端口监控jobtracker 2.通过用浏览器和http访问namenode所在节点的50070端口监控集群 http://192.168.1.201:50070/ http://192.168.1.201:50030/ 重启后永久性生效:(需要root用户) 开启:chkconfig iptables on 关闭:chkconfig iptables off (2) 即时生效,重启后失效: 开启:service iptables start 关闭:service iptables stop --查看具体端口 netstat -nap | grep 9000