hadoop集群部署-笔记
发布时间:2024-09-20
发布时间:2024-09-20
hadoop集群部署
1) 安装jdk
下载jdk-6u21-linux-i586.bin 然后修改/etc/profile:
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$PATH:$JAVA_HOME/bin
保存,并执行source /etc/profile 2) 配置host
Namenode的机器,需要配置集群中所有机器的ip 修改/etc/hosts
10.10.236.190 master 10.10.236.191 slave-A 10.10.236.193 slave-B
其他的datanode的/etc/hosts 只需要配置namenode的机器ip和本机ip
10.10.236.190 master 10.10.236.191 slave-A
修改hostname(可选)
vi /proc/sys/kernel/hostname 3) 建立ssh无密码登录 首先进到root目录下
root@master:~# $ssh-keygen -t rsa
进入.ssh目录
root@master:~/.ssh# cp id_rsa.pub authorized_keys
其余的datanode的机器 新建.ssh目录
root@slave-A:~# mkdir .ssh
在name(master)上远程拷贝
root@master:~/.ssh# scp authorized_keys slave-A:/root/.ssh/
测试ssh
4) 安装hadoop
下载Hadoop 解压到每台服务器的/data/soft 解压
root@master:/data/soft# tar zxvf hadoop-0.21.0.tar.gz
建立软连
root@master:/data/soft# ln -s hadoop-0.21.0 hadoop
然后修改/etc/profile
export HADOOP_HOME=/data/soft/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
5) 配置hadoop
1.修改conf/hadoop-env.sh,添加jdk支持
export JAVA_HOME=/usr/local/jdk
如果ssh端口不是默认的22,在conf/hadoop-env.sh里改下。如:
export HADOOP_SSH_OPTS="-p 1234"
2.修改conf/core-site.xml,增加下面内容
<property>
<name>http://www.77cn.com.cn</name>
<value>hdfs://master:54310</value> //这个才是真正决定namenode </property> <property>
<name>hadoop.tmp.dir</name>
<value>/data/hdfs/tmp</value> //临时文件,有问题的时候,可以删除 <description>A base for other temporary directories.</description> </property>
3.修改conf/hdfs-site.xml,增加下面内容
<property>
<name>http://www.77cn.com.cn.dir</name>
<value>/data/hdfs/name</value> //namenode持久存储名字空间,事务日志的本地路径 </property> <property>
<name>dfs.data.dir</name>
<value>/data/hdfs/data</value> //datanode存放数据的路径 </property> <property>
<name>dfs.datanode.max.xcievers</name> <value>4096</value> </property> <property>
<name>dfs.replication</name>
<value>1</value> //数据备份的个数,默认是3 </property>
3.修改conf/mapred-site.xml,增加下面内容
<property>
<name>mapred.job.tracker</name> //jobTracker的主机 <value>master:54311</value> </property>
4. .修改conf/masters,这个决定那个是secondarynamenode
master
5 .修改conf/slaves,这个是所有datanode的机器
slaves-A slaves-B
6) 将配置好的hadoop拷贝到所有的datanode
root@master:/data/soft/hadoop/conf# scp -rp /data/soft/hadoop-0.21.0 10.10.236.191:/data/soft/hadoop-0.21.0
在datanode上建立对应的软连
7) 格式化hdfs文件系统的namenode
root@master:/data/soft/hadoop# bin/hadoop namenode –format
输入Y
8) 启动hadoop集群
root@master:/data/soft/hadoop# bin/start-all.sh
9) Hdfs操作 建立目录
root@master:/data/soft/hadoop # bin/hadoop dfs -mkdir testdir
查看现有文件
root@master:/data/soft/hadoop # bin/hadoop dfs -ls
10) 关闭Hdfs
root@master:/data/soft/hadoop# bin/stop-all.sh
hadoop部署注意项
namenode磁盘: sas带RAID,多磁盘存储文件系统元信息.
datanode配置: 不带RAID, 双网卡: 一个用于内部数据传输,一个用于外部数据传输.
hadoop各节点的分布:namenode和jobtracker部署:namenode与jobtracker分离.tasktracker与datanode配对. Trash: hadoop回收站功能默认是禁止的,删除文件,就是直接删除了,所以要记得配置好trash。trash功能还是不错的,当rm后,它会move到当前文件夹下的.Trash目录下,误删文件后,可以到对应的.Trash目录下恢复文件,参考配置属性fs.trash.interval。 备份:namendoe的元数据切记做好多处备份,包括热备和冷备,否则元数据一丢,整个集群的数据都无法恢复了。热备:namenode的元数据配置写两份,一分写本地,另一份写远程nfs。冷备:定时拷贝namenode的元数据到远程的nfs,保留十天甚至更长。 Datanode的数据目录:如果datanode对应的机器上有多块磁盘,例如/disk1-/disk3,dfs.data.dir可以配置
为”/disk1/data,/disk2/data,/disk3/data”,datanode会在写数据时,以轮询的方式选择一个目录写入数据,一般这些目录是不同的块设备,不存在的目录会被忽略掉,参考配置属性dfs.data.dir.datanode如果有多个磁盘不建议做raid,因为做raid会有性能损失,还会导致一个磁盘坏了,整个硬盘也不能用了,而hadoop可以规避这个问题。
Tasktracker的中间输出目录: MapReduce产生的中间数据会特别多,为了减少磁盘压力,如果机器有多个磁盘,也可以像datanode的数据目录设为”/disk1/local,/disk2/local,/disk3/local”,参考配置属性mapred.local.dir。
map和reduce任务的JVM选项:mapred.child.java.opts配置map和reduce子进程的JVM属性,如果内存充裕,可以改为 -Xmx2400m.
Tasktracker的map和reducer数量配置: 属性mapred.tasktracker.map.tasks.maximum配置这个tasktracker同时可以最多跑多少个map task,要根据tracker的内存和磁盘情况规划。还有属性mapred.tasktracker.reduce.tasks.maximum配置这个tasktracker同时可以最多跑多少个reduce task.同理也是要根据tracker的内存和磁盘情况规划。
缓冲区大小:io.file.buffer.size默认是4KB,作为hadoop缓冲区,用于hadoop读hdfs的文件和写hdfs的文件,还有map的输出都用到了这个缓冲区容量,对于现在的硬件很保守,可以设置为128k(131072),甚至是1M(太大了map和reduce任务可能会内存溢出)。
noatime的设置:为了充分发挥性能,需要使用noatime选项挂载磁盘,表示执行读操作时,不更新文件的访问时间,可以显著提供性能。
hadoop配置文件说明
1、dfs.hosts 记录即将作为datanode加入集群的机器列表 2、mapred.hosts 记录即将作为tasktracker加入集群的机器列表
3、dfs.hosts.exclude mapred.hosts.exclude 分别包含待移除的机器列表 4、master 记录运行辅助namenode的机器列表 5、slave 记录运行datanode和tasktracker的机器列表 6、hadoop-env.sh 记录脚本要用的环境变量,以运行hadoop
7、core-site.xml hadoop core的配置项,例如hdfs和mapreduce常用的i/o设置等
8、hdfs-site.xml hadoop守护进程的配置项,包括namenode、辅助namenode和datanode等 9、mapred-site.xml mapreduce守护进程的配置项,包括jobtracker和tasktracker 10、hadoop-metrics.properties 控制metrics在hadoop上如何发布的属性
11、log4j.properties 系统日志文件、namenode审计日志、tasktracker子进程的任务日志的属性
hadoop集群默认配置和常用配置
获取默认配置
配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知道这些配置文件有哪些配置可以生效,上网找的配置可能因为各个hadoop版本不同,导致无法生效。浏览更多的配置,有两个方法:
1.选择相应版本的hadoop,下载解压后,搜索*.xml,找到core-default.xml,hdfs-default.xml,mapred-default.xml,这些就是默认配置,可以参考这些配置的说明和key,配置hadoop集群。 2.浏览apache官网,三个配置文件链接如下:
http://www.77cn.com.cn/common/docs/r0.20.2/core-default.html http://www.77cn.com.cn/common/docs/r0.20.2/hdfs-default.html http://www.77cn.com.cn/common/docs/r0.20.0/mapred-default.html 其中第一个方法找到默认的配置是最好的,因为每个属性都有说明,可以直接使用。
另外,core-site.xml是全局配置,hdfs-site.xml
和mapred-site.xml分别是hdfs和mapred的局部配置。
常用的端口配置
HDFS端口
MR端口
其他端口
参数 dfs.secondary.http.address
描述
secondary NameNode web 管理端口
默认 50090
配置文件 hdfs-site.xml
例子值 0.0.0.0:28680
其他配置参数 dfs.support.append dfs.replication 描述 支持文件 append,主要是支持 hbase 文件复制的副本数,如果创建时不指定这个参数,就使用这个默 认值作为复制的副本数 默认 false 3 配置文件 hdfs-site.xml hdfs-site.xml 例子值 true 2
集群目录配置参数 描述 name node 的元数据,以,号隔开,hdfs 会 http://www.77cn.com.cn.dir 把元数据冗余复制到这些目录,一般这些 {hadoop.tmp.dir} 目录是不同的块设备,不存在的目录会被 忽略掉 node node 的事务文件存储的目录,以,号 http://www.77cn.com.cn.edits.dir 隔开,hdfs 会把事务文件冗余复制到这些 目录,一般这些目录是不同的块设备,不 存在的目录会被忽略掉 secondary NameNode 的元数据以,号 fs.checkpoint.dir 隔开,hdfs 会把元数据冗余复制到这些目 ${hadoop.tmp.dir} 录,一般这些目录是不同的块设备,不存 在的目录会被忽略掉 secondary NameNode 的事务文件存储 fs.checkpoint.edits. dir hadoop.tmp.dir 的目录,以,号隔开,hdfs 会把事务文件冗 余复制到这些目录 /tmp/hadoop-${http://www.77cn.com.cn} core-site.xml /hadoop/tmp/hadoop-${use http://www.77cn.com.cn} ${fs.checkpoint.dir} core-site.xml ${fs.checkpoint.dir} core-site.xml /hadoop/hdfs/nameseconda ry ${http://www.77cn.com.cn.dir} hdfs-site.xm ${http://www.77cn.com.cn.dir} hdfs-site.xm /hadoop/hdfs/name 默认 配置文件 例子值
/dfs/name
/dfs/namesecondary
临时目录,其他临时目录的父目录
data node 的数据目录,以,号隔开,hdfs dfs.data.dir 会把数据存在这些目录下,一般这些目录 ${hadoop.tmp.dir} 是不同的块设备,不存在的目录会被忽略 掉 hdfs-site.xm
/hadoop/hdfs/data1/dat a, /hadoop/hdfs/data2/dat a
/dfs/data
MapReduce 产生的中间数据存放目录, mapred.local.dir 以,号隔开,hdfs 会把数据存在这些目录 下,一般这些目录是不同的块设备,不存 在的目录会被忽略掉
/hadoop/hdfs/data1/map ${hadoop.tmp.dir}mapred-site.xml
red/local, /hadoop/hdfs/data2/map red/local
/mapred/local
${hadoop.tmp.dir}mapred.system.dir MapReduce 的控制文件 mapred-site.xml /hadoop/hdfs/data1/system
/mapred/system
Hbase配置手册
环境:
操作系统:ubuntu 12.10 64bit jdk:sun jdk 1.6 64bit hadoop:apache hadoop 1.02 hbase:apache hbase 0.92
先决条件:配置apache hadoop append,默认这个属性是false,需要设置为true 1)下载hbase
解压到每台服务器的/data/soft 解压
root@master:/data/soft# tar zxvf hbase-0.92.0.tar.gz
建立软连
root@master:/data/soft# ln -s hbase-0.92.0 hbase
2)配置hbase
前提是安装完成hadoop,默认在namenode上进行 1.修改conf/hbase-env.sh,添加jdk支持
export JAVA_HOME=/usr/local/jdk export HBASE_MANAGES_ZK=true
export HBASE_LOG_DIR=/data/logs/hbase
2. 修改conf/hbase-site.xml,
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value> </property> <property>
<name>hbase.cluster.distributed</name> <value>true</value> </property> <property>
<name>hbase.master</name>
<value>hdfs://master:60000</value> </property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>slave-001,slave-002,slave-003</value> <description>Comma
separated
list
of
servers
in
the
ZooKeeper
Quorum.
For
example,
"http://www.77cn.com.cn,http://www.77cn.com.cn,http://www.77cn.com.cn". By default this is set to localhost for local and pseudo-distributed modes of operation. For a fully-distributed setup, this should be set to a full list of ZooKeeper quorum servers. If HBASE_MANAGES_ZK is set in hbase-env.sh this is the list of servers which we will start/stop ZooKeeper on. </description> </property> <property>
<name>hbase.zookeeper.property.dataDir</name> <value>/data/work/zookeeper</value>
<description>Property from ZooKeeper's config zoo.cfg. The directory where the snapshot is stored. </description> </property>
hbase.rootdir设置hbase在hdfs上的目录,主机名为hdfs的namenode节点所在的主机 hbase.cluster.distributed设置为true,表明是完全分布式的hbase集群 hbase.master设置hbase的master主机名和端口
hbase.zookeeper.quorum设置zookeeper的主机,建议使用单数 3.修改hadoop的目录下的conf/hdfs-site.xml
<property>
<name>dfs.datanode.max.xcievers</name> <value>4096</value> </property>
4.修改conf/regionservers
将所有的datanode添加到这个文件,类似与hadoop中slaves文件 5.拷贝hbase到所有的节点 6. 启动hbase
$ ./bin/start-hbase.sh
7 hbase自带的web界面
http://master:60010/
8 测试
1).登录hbase客户端
./bin/hbase shell
2).新建数据表,并插入3条记录
hbase(main):003:0> create 'test', 'cf' 0 row(s) in 1.2200 seconds hbase(main):003:0> list 'table' test
1 row(s) in 0.0550 seconds
hbase(main):004:0> put 'test', 'row1', 'cf:a', 'value1' 0 row(s) in 0.0560 seconds
hbase(main):005:0> put 'test', 'row2', 'cf:b', 'value2' 0 row(s) in 0.0370 seconds
hbase(main):006:0> put 'test', 'row3', 'cf:c', 'value3' 0 row(s) in 0.0450 seconds
3).查看插入的数据
hbase(main):007:0> scan 'test' ROW COLUMN+CELL
row1 column=cf:a, timestamp=1288380727188, value=value1 row2 column=cf:b, timestamp=1288380738440, value=value2
row3 column=cf:c, timestamp=1288380747365, value=value3 3 row(s) in 0.0590 seconds
4).读取单条记录
hbase(main):008:0> get 'test', 'row1' COLUMN CELL
cf:a timestamp=1288380727188, value=value1 1 row(s) in 0.0400 seconds
5).停用并删除数据表
hbase(main):012:0> disable 'test' 0 row(s) in 1.0930 seconds hbase(main):013:0> drop 'test' 0 row(s) in 0.0770 seconds
6).退出
hbase(main):014:0> exit
hive部署手册
安装环境:
机器 只需要安装一台机器
操作系统:Ubuntu 11.04 64操作系统
hadoop:版本是1.0.2,安装在/usr/local/hadoop
sun jdk:版本是1.6.0_31 64bit,安装在/usr/local/jdk hive:版本是0.8.1,安装在/usr/local/hive
安装步骤:
1.下载
下载hive:http://www.77cn.com.cn/apache-mirror/hive/hive-0.8.1/hive-0.8.1.tar.gz 2.安装
(1)上传hive安装包到机器上,使用root用户登陆:
tar -xvf hive-0.8.1.tar.gz
(2)将解压的hive分别移动并改名为/usr/local/hive
rm -rf /usr/local/hive
mv hive-0.8.1 /usr/local/hive
3.配置hive
(1)修改/usr/local/hive/bin/hive-config.sh
在文件末尾加入
export JAVA_HOME=/usr/local/jdk export HIVE_HOME=/usr/local/hive export HADOOP_HOME=/usr/local/hadoop
(2) 根据hive-default.xml复制hive-site.xml
cp /usr/local/hive/conf/hive-default.xml /usr/local/hive/conf/hive-site.xml
(3)配置hive-site.xml,主要配置项如下:
hive.metastore.warehouse.dir:(HDFS上的)数据目录 hive.exec.scratchdir:(HDFS上的)临时文件目录
hive.metastore.warehouse.dir默认值是/user/hive/warehouse hive.exec.scratchdir默认值是/tmp/hive-${http://www.77cn.com.cn} 以上是默认值,暂时不改。
(4)改变 /usr/local/hive的目录所有者为hadoop
chown -R hadoop:hadoop /usr/local/hive
(5)配置hive的log4j:
cp /usr/loca/hive/conf/hive-log4j.properties.template /usr/loca/hive/conf/hive-log4j.properties 修改/usr/loca/hive/conf/hive-log4j.properties将org.apache.hadoop.metrics.jvm.EventCounter改为org.apache.hadoop.log.metrics.EventCounter
(6)启动hive
使用hadoop用户登陆,执行/usr/local/hive/bin/hive (7)测试hive
hive> create TABLE pokes( id INT, name string); hive> SHOW TABLES;
hive> select * from pokes; hive> drop table pokes;
4.优化hive
默认meta数据库为derby ,为了避免使用默认的Derby数据库(有并发访问和性能的问题),通常还需要配置元数据库为MySQL
修改配置文件conf/hive-site.xml
<property>
<name>hive.metastore.local</name> <value>false</value>
<description>controls whether to connect to remove metastore server or open a new metastore server in Hive Client JVM</description> </property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://mysql_server_host:3306/hivedb?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=latin1</value>
<description>JDBC connect string for a JDBC metastore</description> </property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description> </property>
<property>
<name>javax.jdo.option.ConnectionUserName</name> <value>mysql_username</value>
<description>username to use against metastore database</description> </property>
<property>
<name>javax.jdo.option.ConnectionPassword</name> <value>mysql_password</value>
<description>password to use against metastore database</description> </property>
<property>
<name>hive.stats.dbconnectionstring</name>
<value>jdbc:mysql://mysql_server_host:3306/hive_stats?useUnicode=true&characterEncoding=latin1&user=mysql_username&password=mysql_password&createDatabaseIfNotExist=true</value>
<description>The default connection string for the database that stores temporary hive statistics.</description> </property>
<property>
<name>hive.stats.dbconnectionstring</name>
<value>jdbc:mysql://mysql_server_host:3306/hive_stats?useUnicode=true&characterEncoding=utf8&user=mysql_username&password=mysql_password&createDatabaseIfNotExist=true</value>
<description>The default connection string for the database that stores temporary hive statistics.</description> </property>
<property>
<name>hive.stats.dbclass</name> <value>jdbc:mysql</value>
<description>The default database that stores temporary hive statistics.</description> </property>
<property>
<name>hive.stats.jdbcdriver</name> <value>com.mysql.jdbc.Driver</value>
<description>The JDBC driver for the database that stores temporary hive statistics.</description> </property>
<property>
<name>hive.metastore.uris</name> <value>thrift://127.0.0.1:9083</value> </property>
添加metastore启动脚本bin/hive-metastore.sh
#!/bin/sh
nohup ./hive --service metastore >> metastore.log 2>&1 & echo $! > hive-metastore.pid
添加hive server启动脚本bin/hive-server.sh
nohup ./hive --service hiveserver >> hiveserver.log 2>&1 & echo $! > hive-server.pid
启动metastore和hive server
./hive-metastore.sh ./hive-server.sh
使用客户端连接和测试
参考之前的hive测试步骤一一执行。 如果出现
FAILED: Error in metadata: javax.jdo.JDODataStoreException: Error(s) were found while auto-creating/validating the datastore for classes. The errors are printed in the log, and are attached to this exception. NestedThrowables:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytes
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
或者是
FAILED: Error in metadata: MetaException(message:Got exception: org.apache.thrift.transport.TTransportException null)
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask 以上错误,主要是在select操作、drop操作时,就会出错。 这样的错误,可以修改hivedb数据库编码:
mysql> alter database hivedb character set latin1;
然后重启hive metastore和hive server就可以了
mysql数据库的编码目前最好设置为latin1,否则使用hive会出现莫名其妙的问题