Hadoop 学习与安装

虚拟机:

  桥接模式:可以局域网共享

  NAT模式:如果只是自己用的话用这种 

学习目标:
	使用Hadoop分布式系统(HDFS)来海量存储数据集,通过MapReduce堆这些数据集运行分布式计算
	熟悉Hadoop的数据和IO组件,用于压缩、数据集成、序列化和持久处理
	熟悉编写MapReduce实际应用时的常见陷阱和高级特性
	设计、勾践和管理一个专用的Hadoop集群或在云上运行Hadoop
	使用高级查询语言Pig来处理大规模数据
	利用Hadoop数据库Hbase保存和处理结构化/半结构化数据
	学会ZooKeeper来构建分布式系统

Hadoop是是海量数据(GB,PB)完美解决方案

解决的问题
	Hadoop提供一个稳定的共享存储和分析系统,存储由HDFS实现,分析有MapReduce实现

子组件介绍
	Avro: 高效跨语言RPC的数据序列系统,持久化数据存储
	MapReduce: 分布式数据处理模式和执行环境,运行于大型商用机集群
	HDFS:分布式文件系统,运行于大型商用机集群
	Pig:一种数据流语言和运行环境,用于检索非常大的数据集。它运行在MapREduce和HDFS上。
	Hbase:一个分布式的,列存储数据库。使用HDFS作为底层存储同时支持MapReduce的批量式计算和点查询(随机读取)。
	ZooKeeper: 一个分布式高可用性的协调服务。它提供分布式锁之类的基本服务用于构建分布式应用。
	Hive:分布式数据仓库。Hive管理HDFS中存储的数据,并提供基于SQL的查询语言用于查询数据。
	Chukwa:分布式数据收集和分析系统。它是运行于HDFS中存储数据的收集器。

Hadoop安装流程:
虚拟机安装注意事项见另一个附件:

一、	配置hosts文件(/etc/hosts)
1)	修改主机名称,三台机器分别为   HOSTnAME=slave2,HOSTnAME=slave2, HOSTnAME=master
2)	修改三个机器的host为 (ip 主机名称,下面是我的测试环境)
三个机器的ip		三个机器的主机名称 
192.168.102.136  master
192.168.102.135	 slave2
192.168.102.128	 slave1


二、	建立hadoop运行帐号(专门负责hadoop管理)
在每台机器上都创建一个组,并且创建账号
groupadd hadoop 	
useradd -s /bin/bash  -d /home/tony2 -m tony2 -g hadoop
三、	配置ssh免密码连入
单节点设置
hadoop 集群各个节点之间需要进行数据的访问,被访问节点对与访问节点的可靠性进行验证,hadoop通过ssh方法通过
秘钥验证方式远程安全登陆操作,如果每个节点的访问都需要验证太麻烦,所以需要ssh免密码直接登陆被访问节点
1  在master中生成公钥
 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
 -t 秘钥类型,有两种RSA和DSA
 将生成一个公私钥的目录,这个目录是隐藏的,可以用ls -a  看到 
2 将公钥拷贝一份并换成另一个名字
  cat id_dsa.pub >> authorized_keys 

3 测试本机免密码成功,   需要用ssh登陆两次 ,第一次需要输入密码,第二次不需要输入密码
   ssh 机器名(master)  (提示输入密码)  exit(退出ssh)   ssh 用户名(不提示输入密码,直接登陆成功,则测试成功)
4 其余的机器按照上面3个步骤操作即可
则单个机器设置成功。
子节点和主节点设置
	为了让主节点(master)能通过SSH免密码登陆两个子节点,两个子节点的公钥必须包含主节点的公钥信息
主要通过在子节点中用scp将主节点公钥拷贝的子节点上
 
 scp介绍:主要可以再两个linux主机间复制文件(远程到本地或本地到远程都可以)
 命令格式:scp:  [可选参数] file_source file_target (是需要输入密码的)
 本地文件拷贝到远程文件: 
	scp local_file remote_username@remote_ip:remote_folder
1 登陆子机器中,拷贝master机器的公钥到到子机器中
 scp tony2@master:~/.ssh/id_dsa.pub /home/tony2/.ssh/master_dsa.pub
2 合并公钥 ,将master公钥合并到子机器中去 
   cat master_dsa.pub  >> authorized_keys  
   注意:authorized_keys 权限必须是600 即 只有当前用户可读写权限,其他用户没有权限的,否则可能不能用。
3 测试master可以免密码登陆slave1和slave2 
  登陆master机器,执行 ssh slave1 
  第一次执行需要输入密码,然后exit退出,第二次执行不需要输入密码,配置成功 
  用同样的方法测试slave2配置是否可以用
则主机与子机器通讯设置成功
四、	下载并解压hadoop安装包
http://mirrors.hust.edu.cn/apache/hadoop/common/
五、	配置namenode,修改site文件()
   1 解压hadoop压缩包
   2 配置环境变量(hadoop安装目录):
	export HADOOP_INSTALL=/web/hadoop-2.2.0
	export PATH=$PATH:$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin
   3 查看hadoop是否生效
   source /etc/profile 
   env|grep HADOOP

   4 配置hadoop配置文件 
			   Create HDFS directory
           mkdir -p /web/hadoop-2.2.0/tmp 
   5 修改 /hadoop/etc/hadoop/core-site.xml (inside <configuration> tag):
	主要的localhost需要改成master主机的ip地址
	<property>
	  <name>fs.default.name</name>
	  <value>hdfs://192.168.102.136:9000</value> 
	</property>
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/web/hadoop-2.2.0/tmp</value>
	</property>
    6 修改 /hadoop/etc/hadoop/hdfs-site.xml 
 备份文件的数量
	<property>
   <name>dfs.data.dir</name>
   <value>/web/hadoop-1.2.1/data</value>
  </property>
 <property>
    <name>dfs.replication</name>
     <value>1</value>
 </property>	
最后两个是创建的dfs目录;
     7 修改 /hadoop/etc/hadoop/yarn-site.xml

	<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>

    8 创建mapred-site.xml 
	cp  mapred-site.xml.template mapred-site.xml
	修改配置:IP地址为主机master的主机地址 
	<property>
	  <name>mapred.job.tracker</name>
	  <value>192.168.102.136:9001</value>
	</property>

  
   
六、	配置hadoop-env.sh文件
修改jdk的安装目录。
七、	配置masters和slaves文件
 
修改slaves和masters文件,内部添加子节点和主节点的 “机器名称” 
     Slaves添加的是 slave1  slave2 
		Masters中添加master(我的主节点名称)

八、	向各节点复制hadoop
 
例:scp -r hadoop-1.2.1/  root@slave1:/web

九、            格式化namenode(初始化一些文件)
    	  bin/hadoop namenode -format
十、            启动hadoop
1.	start-all.sh/shutdown-all.sh
下面是个人启动的时候报的错误:
2.	错误记录:
1)原因:hadoop需要更高版本的linux内核,需要换linux或者降低hadoop的版本。
启动报错:Unable to load native-hadoop library for your platform.
调试命令:-bash-3.2# export HADOOP_ROOT_LOGGER=DEBUG,console
-bash-3.2# hadoop fs -text /test/data/origz/access.log.gz
出现:GLIBC_2.6' not found  (系统glibc版本不够)
 解决:1 查看当前系统支持的glibc版本,如果当前版本低,但当前系统支持升级高版本,则可以升级,否则换高版本操作系统
查看支持版本的命令:strings /lib64/libc.so.6 |grep GLIBC_   
查看当前系统glibc版本:rpm -qa | grep glibc

2)be replicated to 0 nodes, instead of 1 
原因:因为所有机器的防火墙开启,导致机器之间不能访问
解决:关闭各个机器的防火墙 service iptables stop 


3.	Cygwin和openssh 可以再windows中模拟linux环境,不是很稳定
十一、      用jps检验各后台进程是否成功启动

1)	jps命令查看启动进程:
查看是否成功:执行命令 /web/jdk1.7.0_60/bin/jps(查看与java相关的进程) 
会列出下面几个进程:JobTracker,SecondaryNameNode,NameNode,Jps	
子节点进程:TaskTracker  DataNode Jps
	
2)	hdfs命令导入文件,来测试hdfs是否正常运行 
Hadoop 中HDFS测试:创建一个文件夹/root/input 在里面放2个文件,执行文件导入报错
  命令: Hadoop dfs –put  /root/input   in (说明:将目录拷贝到hadoop的in目录中)
   查看文件是否导入成功:bin/hadoop dfs  -ls  ./in/*
  问题及解决: http://blog.sina.com.cn/s/blog_67f81bad0101bmn4.html


	 3)运行hadoop自带的例子:
bin/hadoop jar hadoop-examples-1.2.1.jar pi 10 100
bin/hadoop jar hadoop-examples-1.2.1.jar wordcount in out
		bin/hadoop dfs –ls 查看根目录的所有文件
bin/hadoop dfs -ls ./out	查看out目录中所有文件
bin/hadoop dfs -cat ./out/*  统计一下运算


十二、      通过网站查看集群情况
 查看hadoop服务启动情况,IP为Master的IP地址
Jobtracker工作情况: http://192.168.102.136:50030/
namenode工作情况: http://192.168.102.136:50070/  
调整日志级别:http://192.168.102.136:50070/logLevel
很多工具可以对hadoop进行监控
官方文档:http://hadoop.apache.org/docs/r1.2.1/#HDFS
基本组件功能介绍:

日志调试:Jobtracker的页面中可以查看打印到控制台的日志:如: System.err.println("系统执行了map方法 ");    
    到页面中找 Completed Jobs->jobid->map->task->tasklogs->点击就可以看到打印的日志

HDFS基本特性:
	硬件错误是常态。因此需要冗余
	流式数据访问。即数据批量读取而非随机读写,Hadoop擅长做的是数据分析而不是事务处理
	大规模数据集
	简单一致性模型。为了降低系统复杂度,对文件采用一次性写多次读的逻辑设计,即是文件一经写入,关闭,就再也不能修改
	程序采用“数据就近”原则分配节点执行

Namenode作用:
	管理文件系统的命名空间
	记录每个文件数据块在各个Datanode上的位置和副本信息
	协调客户端对文件的访问
	记录命名空间内的改动或空间本身属性的改动
	Namenode使用事务日志记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等

DataNode作用:
	负责所在物理节点的存储管理
	一次写入,多次读取(不修改)
	文件由数据块组成,典型的块大小是64MB
	数据块尽量散布道各个节点
读取数据流程:
	客户端要访问HDFS中的一个文件
	首先从namenode获得组成这个文件的数据块位置列表
	根据列表知道存储数据块的datanode
	访问datanode获取数据
	Namenode并不参与数据实际传输
HDFS的可靠性:

	冗余副本策略
	机架策略:不同机架进行冗余
	心跳机制:数据校验、数据块多少校验等
	安全模式:可以确保数据有足够的冗余
	使用文件块的校验和 Checksum来检查文件的完整性
	回收站:文件删除后可以自动删除
	元数据保护:
	快照机制:快速返回某个时间点的数据状态
HDFS命令示例:
	hadoop fs -mkdir /user/trunk
	hadoop fs -ls /user
	hadoop fs -lsr /user   (递归的)
	hadoop fs -put test.txt /user/trunk
	hadoop fs -put test.txt .  (复制到hdfs当前目录下,首先要创建当前目录)
	hadoop fs -get /user/trunk/test.txt . (复制到本地当前目录下)
	hadoop fs -cat /user/trunk/test.txt
	hadoop fs -tail /user/trunk/test.txt  (查看最后1000字节)
	hadoop fs -rm /user/trunk/test.txt
	hadoop fs -help ls (查看ls命令的帮助文档)	 
	dfsadmin –safemode enter  进入hadoop的安全模式
dfsadmin –safemode leave   退出安全模式


MapReduce学习
Mapreduce运行机制图:

Input -> map -> shuffle -> reduce ->output 

 

运行机制:
1.	客户端(client):编写mapreduce程序,配置作业,提交作业,这就是程序员完成的工作;
2.	JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业的执行;
3.	TaskTracker:保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务,TaskTracker和JobTracker的不同有个很重要的方面,就是在执行任务时候TaskTracker可以有n多个,JobTracker则只会有一个(JobTracker只能有一个就和hdfs里namenode一样存在单点故障,我会在后面的mapreduce的相关问题里讲到这个问题的)
4.	Hdfs:保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面

MapReduce性能调优:
	1 调整reducer个数
	2 大文件优于小文件
	3 减少网络输出,压缩map的输出(之传送有用的)
	4 

调度机制:
1.	缺省为先入先出作业调度
2.	支持公平调度器和容量调度器

任务执行优化:
1.	推测式执行,这个方式默认是打开的,可以再配置文件(mapred-site.xml)中设置关闭	
2.	可以重用JVM即单个JVM中可以执行的任务数量,可以提高效率(mapred-site.xml设置)。
3.	忽略模式:任务失败2次后,会把失败位置告诉jobTracker,jobtracker会重启这个任务,并且跳过上次执行失败的位置。(默认关闭)

错误处理机制:
	硬件故障
	Jobtracker是单点,需要找比较好的机器做这个节点。
	Jobtracker通过心跳信号了解tasktracker是否发生故障,如果故障则会移除tasktracker任务。
	如果故障节点在执行map任务并且尚未完成,则jobtracker会要求其他节点重新执行map任务。
	如果故障节点在执行reduce任务尚未完成,jobtracker会要求其他节点继续执行reduce任务。

	任务失败
1.	由于代码缺陷或进程崩溃引起任务失败
2.	Jvm自动退出,向tasktracker父进程发送错误信息,并且错误信息会写到日志中
3.	Tasktracker坚挺程序会发现进程退出,或进程很久没有信息送回,任务标记失败
4.	标记失败后,通过心跳告诉jobtracker任务失败
5.	Jobtrack获悉任务失败后,将把任务重新放入调度队列重新分配在执行
6.	如果任务失败次数超过4(配置文件中设置),将不会再被执行,同时宣布作业失败

Mapreduce开发学习:
1 elipse 插件下载安装与使用,可以看安装文档
http://pan.baidu.com/share/link?shareid=2552850400&uk=2399653584

   2 mapReduce开发与运行(开发完的程序必须打包成jar文件,然后在服务器上运行,elipse运行没有成功)










定义:一种用于数据处理的编程模型。
18 页面

 
 


Hadoop 完全分布式一些技巧
一、	Hadoop大集群实施
a)	设备选型(普通的pc机就可以了,但最多使用多个硬盘)
b)	是否使用虚拟机(资源允许的话可以,最好不要用一个硬盘)
c)	Host维护,在急群中用DNS解析域名来查找响应的ip,例如:linux中的bind服务
d)	解决免密码登陆设置的繁琐:可以用NFS处理
e)	解决scp文件发送命令问题。 用awk解析slave文件生成scp文件脚本
,chmod a+x 文件名 ,将文件变成可执行脚本
	
	云计算理解
	云计算是服务模式:不是新技术,不是某一种软件,是一些关键技术日趋成熟后催生的一种新的服务模式
	云计算是集中拥有:使用户能得到其本身无法得到的服务,降低拥有成本是云计算核心价值之一。
	  好处:提高软硬件使用率、集中管理降低能耗、节约维护人员费用。
	风险:安全性风险,可用性风险,绑架风险
		
	云计算形态
私有云(公司内部用),公有云(搜索,网盘),混合云
云计算解决方案:
	Hadoop,Openstack

1.	基于Hadoop的日志分析项目的一些问题,可以分析出工程中:访问用户IP ,用户所在城市 ,访问时间 , 访问量怎么样
2.	离线日志分析,不适合做在线处理
3.	当传统方法解决不了,能处理足够大的数据,管理成本低,机器成本低

Hadoop解决方案(运维,写map-reduce和修改源代码,数据仓储)
1.	数据定时从收集服务器装在到Hadoop集群
2.	数据经过整理后放到数据仓库系统,数据仓库是基于Hive架构的(选用原因:支持sql语句复杂sql可能不支持,可以用Java写自定义函数),
3.	数据仓库查询系统结果被导入hbase中
4.	通过API进行连接展现
5.	对于权限需要看源代码,自己加上。

  Mapreduce 几个优化配置参数的了解

1 mapred.reduce.parallel.copies 复制map阶段产生的数据到reduce节点的线程数据,默认5个
2 mapred.compress.map.output  map产生的数据写入磁盘前是否压缩:true 压缩  false不压缩 
3 mapred.map.output.compression.codec  上面的压缩用的压缩库设置 
4 io.sort.mb map任务缓冲区大小设置:map任务产生的数据会放到缓冲区,大于这个缓冲区会将数据写到磁盘中,
5 io.sort.spill.percent 缓冲区内存达到多少的时候,数据会开始溢写到磁盘
6 mapred.local.dir 上面,溢写内容到磁盘的什么位置 



猜你喜欢

转载自username2.iteye.com/blog/2106532