hadoop 安装步骤
本次环境一共三台服务器,JAVA使用的版本是jdk1.6.0_45,zookeeper-3.4.5,hadoop-2.0.0,hive-0.10.0,hbase-0.94.6
主机名 | IP地址 | 用途 |
vmtmstorm01 | 192.168.59.178 | namenode、jobtracker |
monitor04 | 192.168.59.173 | datanode、tasktracker |
monitor01 | 192.168.59.170 | datanode、tasktracker |
对于hadoop来说,在hdfs看来节点分为namenode、datanode。namenode只有一个,datanode可以是很多;在mapreduce看来节点分为jobtracker、tasktracker,jobtracker只有一个,tasktracker有多个。我这里是将namenode和jobtracker部署在同一节点上,datanode和tasktracker部署在其它节点上,
1. 安装jdk,上传到/root目录下,执行
chmod a+xjdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
将安装目录移动到/app目录下
mkdir /app
mv jdk1.6.0_45 /app
建立链接:
mkdir -p /app/java/; (-p确保目录名称存在,如果目录不存在的就新创建一个)
ln -sf /app/jdk1.6.0_45 /app/java/latest/
(-f:链结时先将与 dist 同档名的档案删除 -s:进行软链结(symbolic link))
配置JAVA的环境变量
vi /etc/profile
添加如下内容:
exportJAVA_HOME=/app/jdk1.6.0_45
exportPATH=$JAVA_HOME/bin:$PATH
让添加的环境变量生效执行如下命令:
source /etc/profile; java –version
2. 配置网络
以root账户登录每台服务器,并执行如下操作:
vi /etc/hosts
添加如下内容:
192.168.59.178vmtmstorm01
192.168.59.173monitor04
192.168.59.170 monitor01
注:在所有服务器的/etc/hosts文件中添加如上内容;
同时,修改windows下该文件,使得个人的笔记本也能识别主机名 c:\windows\system32\drivers\etc\hosts 中添加如上内容。
3. 配置SSH互信
SSH互信:在目标机器上,预先设置好经过认证的key文件,当需要访问目标机器时,目标机器通过key文件,对访问者进行自动认证,从而实现互信。
在任意一台服务器上,以bdp账号登陆(密码123)
执行如下命令,生成bdp账号的密钥对 (这里是主机执行)
/usr/bin/ssh-keygen -t rsa
cd ~/.ssh/
cp id_rsa.pub authorized_keys
chmod 600 authorized_keys
将~/.ssh目录拷贝覆盖到集群其他节点的bdp用户目录下
scp -r .ssh/ 192.168.59.173:~/
scp -r .ssh/ 192.168.59.170:~/
注意,要确保/etc/ssh/sshd_config的RSAAuthentication和PubkeyAuthentication为yes,(打开认证方式)改好后重启ssh服务 /sbin/service sshd restart
执行 ssh`hostname` 测试是否配置成功
4. 操作系统参数优化 (每台机器,且以root操作)
4.1防火墙配置:关闭selinux / iptables (每台机器,root权限)
• 关闭iptables
– 停止服务:service iptables stop
– 关闭服务自动启动:chkconfig --del iptables
• 关闭selinux
– 修改/etc/selinux/config里
SELINUX=disabled
4.2 关闭swapiness,减少swap使用倾向 (每台机器,root权限)
• 当系统有swap时会很慢,所以让系统最大限度的使用物理内存(默认vm.swappiness = 60)
• 修改/etc/sysctl.conf,增加一行 vm.swappiness = 0
echo "vm.swappiness = 0" >>/etc/sysctl.conf
• 动态生效 sysctl -w vm.swappiness=0 ( -w 临时改变某个指定参数的值)
• 查看是否生效 cat /proc/sys/vm/swappiness
(/proc 可以在该目录下获取系统信息,这些信息是在内存中由系统自己产生的)
注:sysctl.conf是一个用于在系统运作中查看及调整系统参数的工具
4.3 最大打开文件数和最大进程数limits.conf (每台机器,root权限)
• Linux默认是1024,对于分布式文件系统太小,Hadoop有可能会报错误
• 执行ulimit -a,查看open files项和maxuser processes项
• 执行下面脚本,修改这两项值
• echo"* - nofile 1000000" >>/etc/security/limits.conf
• echo"YOUR_USER_NAME - nproc 1000000">> /etc/security/limits.conf
• sysctl–p
• 重启服务器,执行 ulimit -a 查看是否修改成功
?在/etc/security/limits.conf中重复出现了多个YOUR_USER_NAME - nproc 1000000
4.4 屏蔽文件访问时间,优化/etc/fstab参数 (每台机器,root权限)(注:未配置)
• HDFS存储着海量文件,如果屏蔽底层Linux的文件访问时间,会提高HDFS的IO
• 修改/etc/fstab,添加如下noatime,nodiration,例如
LABEL=/data1/data1 ext4 defaults,noatime,nodiratime 1 2
LABEL=/data2 /data2ext4 defaults,noatime,nodiratime 1 2
LABEL=/data3 /data3ext4 defaults,noatime,nodiratime 1 2
• 重新mount或重启机器使之生效
• 注:由于我们使用的是虚拟机,可以不配置该参数
4.5 配置ntp时间同步 (每台机器,root权限)
• 在Hadoop集群中,要求服务器之间的时间同步
• 选一台服务器作为NTP server, 修改 /etc/ntp.conf 如下,
restrictdefault nomodify
server 192.168.59.178
fudge 192.168.59.178 stratum 8
并重启 service ntpdrestart
• 在集群其他节点上,首先关闭NTP
service ntpd stop
• 执行 /usr/sbin/ntpdateNTPSERVER_IP 进行同步,执行 date 查看是否正确
• 再cron里加入同步命令:执行 crontab –e (-e:执行文字编辑器来设定时程表,内定的文字编辑器是 VI,),添加如下内容,使其每小时同步一次
测试情况:/etc/ntp.conf文件下
192.168.59.178:
restrictdefault nomodify
server 192.168.59.178
fudge 192.168.59.178 stratum 8
192.168.59.173:
server 192.168.59.178
fudge 192.168.59.178 stratum 10
192.168.59.173:无修改
结果:三台机器时间已同步
补充:
crontab [ -uuser ] filecrontab [ -u user ] { -l | -r | -e }
说明:
crontab 是用来让使用者在固定时间或固定间隔执行程式之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
参数:
-e:执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r:删除目前的时程表
-l:列出目前的时程表
时程表的格式如下:
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为*/n 表示每 n 小时个时间间隔执行一次,其余类推
5. Zookeeper安装
5.1 ZK配置:单节点配置
在${ZOOKEEPER_HOME}/conf/zoo.cfg( /app/zookeeper-3.4.5-cdh4.3.0/conf/zoo.cfg)中做如下定义
tickTime=5000
dataDir=/app/zookeeper-3.4.5-cdh4.3.0/data (/tmp/zookeeper /tmp用来存放不同程序执行时产生的临时文件)
clientPort=2181
配置参数
a) tickTime: 每个tick的时间长度(毫秒),是zk中最小时间单元。
b) dataDir:内存快照(snapshot)和transaction log的存储目录
c) clientPort :用于服务client连接的端口号
5.2 ZK配置:多节点配置(为3个节点的集群)
在${ZOOKEEPER_HOME}/conf/zoo.cfg ( /app/zookeeper-3.4.5-cdh4.3.0/conf/zoo.cfg)中做如下定义
tickTime=5000
dataDir=/app/zookeeper-3.4.5-cdh4.3.0/data
clientPort=2181
initLimit=10
syncLimit=5
server.1=192.168.59.178:4888:5888
server.2=192.168.59.173:4888:5888
server.3=192.168.59.170:4888:5888
• 配置参数
– initLimit:刚选举出leader后,followers 与leader连接和同步(connect/sync)的时间周期:initLimit*tickTime。
– syncLimit:正常工作状态下,允许followers与leader同步(sync)的时间,当follower与leader相差太大的话,该follower将被排除出集群。
– server.x=[hostname]:nnnnn[:nnnnn]第一个端口用于follower与leader连接,第二个端口用于leader election。
同时在dataDir目录下创建一个名为myid的文件,里面写入1或者2或者3,该值与zoo.cfg中的“server.#=…”的#一致
需要在每个zookeeper上均执行 bin/zkServer.shstart,该集群才可以正常工作
• 启动zookeeper服务: bin/zkServer.sh start
• 停止zookeeper服务:bin/zkServer.sh stop
由于HBase和Hadoop依赖于ZK,所以在停止ZK时需要首先关闭HBase和Hadoop。
• 检查Zookeeper运行状态:
bin/zkCli.sh -server 172.168.0.1:2181
或者直接运行bin/zkCli.sh
在shell中运行help来查看可用命令
[zk:localhost:2181(CONNECTED) 0] help
ZooKeeper-server host:port cmd args
connect host:port
get path [watch]
ls path [watch]
set path data [version]
rmr path
delquota [-n|-b] path
quit
printwatches on|off
create [-s] [-e] path data acl
stat path [watch]
close
ls2 path [watch]
history
listquota path
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
setquota -n|-b val path
6 Hadoop安装
6.1 Hadoop安装路径
/app/hadoop-2.0.0-cdh4.3.0
6.2 配置Hadoop的环境变量
vi /etc/profile
添加如下内容:(192.168.59.178情况)
export HADOOP_HOME=/app/hadoop-2.0.0-cdh4.3.0
exportPATH=.:$HIVE_HOME/bin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
让添加的环境变量生效执行如下命令:
source /etc/profile;
6.3 设置Hadoop需要的环境变量
添加Hadoop需要的环境变量
在$HADOOP_HOME/etc/hadoop-mapreduce1目录下的hadoop-env.sh中设置Hadoop需要的环境变量,其中JAVA_HOME是必须设定的变量 exportJAVA_HOME=/app/java/latest
修改slaves文件
在$HADOOP_HOME/etc/hadoop-mapreduce1目录下的slaves
添加 vmtmstorm01 monitor04 monitor01(包含:所有tasktracker节点的IP/Hostname列表)
masters文件
在$HADOOP_HOME/etc/hadoop-mapreduce1目录下的masters内容:localhost
修改core-site.xml文件
<property>
<name>fs.defaultFS</name>
<value>hdfs://vmtmstorm01:8020</value> ---9000
<description>The name forthe cluster. HBase will use this to connect to HDFS</description>
</property>
<property>
<name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/app/hadoop-2.0.0-cdh4.3.0/tmp</value>
</property>
修改hdfs-site.xml文件
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/bdp/dfs/nn</value> --NameNode元数据存储目录,可多个,逗号分隔
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/bdp/dfs/data1,/home/bdp/dfs/data2,/home/bdp/dfs/data3</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>vmtmstorm01:50070</value> --secondarynamenode:50070
</property>
修改mapred-site.xml文件
<!-- jobtracker haconf -->
<property>
<name>mapred.job.tracker</name>
<value>vmtmstorm01:9001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/bdp/mapred/local1,/home/bdp/mapred/local2,/home/bdp/mapred/local3</value>
<description> mapred做本地计算所使用的文件夹,可以配置多块硬盘,逗号分隔</description>
</property>
<property>
<name>mapred.map.tasks</name>
<value>1</value>
<description>默认每个job所使用的map数,意思是假设设置dfs块大小为64M,需要排序一个60M的文件,也会开启2个map线程,当jobtracker设置为本地是不起作用。 </description>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>1</value>
<description默认每个job所使用的reduce数,意思是假设设置dfs块大小为64M,需要排序一个60M的文件,也会开启2个reduce线程,当jobtracker设置为本地是不起作用。 </description>
</property>
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>2</value>
<description>每服务器允许启动的最大map槽位数。 </description>
</property>
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>1</value>
<description>每服务器允许启动的最大reduce槽位数. </description>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m-Djava.net.preferIPv4Stack=true -XX:+UseParallelGC</value>
<description>Java opts for the tasktracker child processes.
The following symbol, if present, will beinterpolated: @taskid@ is replaced
by current TaskID. Any other occurrences of'@' will go unchanged.
For example, to enable verbose gc logging toa file named for the taskid in
/tmp and to set the heap maximum to be agigabyte, pass a 'value' of:
-Xmx1024m -verbose:gc-Xloggc:/tmp/@taskid@.gc
The configuration variablemapred.child.ulimit can be used to control the
maximum virtual memory of the childprocesses.
</description>
</property>
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
<description> map输出结果在进行网络交换前是否以压缩格式输出,默认false,建议true,可以减小带宽占用,代价是会慢一些。 </description>
</property>
将该配置拷贝至所有tasktracker节点
将/app/hadoop-2.0.0-cdh4.3.0目录拷贝覆盖到集群其他节点, 保证目录结构一致
scp -r /app/ hadoop-2.0.0-cdh4.3.0 192.168.59.173:/
scp -r /app/ hadoop-2.0.0-cdh4.3.0 192.168.59.170:/
6.4启动之前,我们先要格式化namenode /app/ hadoop-2.0.0-cdh4.3.0下
仅在首次启动HDFS前执行
在NameNode执行
bin/hadoop namenode -format
6.5 MapReduce服务启停: 启停命令 /app/hadoop-2.0.0-cdh4.3.0下
• 启动MR集群
– bin-mapreduce1/start-mapred.sh 会自动ssh到slaves配置的机器上启动DataNode
• 停止MR集群
– bin-mapreduce1/stop-mapred.sh 会自动ssh到slaves配置的机器上停止DataNode
• 也可以启停单个服务
– Jobtracker
• 启动: bin-mapreduce1/hadoop-daemon.shstart jobtracker
• 停止: bin-mapreduce1/hadoop-daemon.shstop jobtracker
– 启动tasktracker
• bin-mapreduce1/hadoop-daemon.shstart tasktracker
bin-mapreduce1/hadoop-daemon.shstop tasktracacker
6.6MapReduce服务启停:启停状态检查
通过Web查看:http://HOSTNAME_YOUR_JOBTRACKER:50030/
http://192.168.59.178:50030/jobtracker.jsp查看启动状态
6.7设软链接
ln–sf /app/ hadoop-2.0.0-cdh4.3.0 /home/bdp/ hadoop-2.0.0-cdh4.3.0
7 Hbase安装
7.1解压软件并安装
tar -zxvf hbase-0.94.6-cdh4.3.0.tar.gz
安装在 /app/ hbase-0.94.6-cdh4.3.0
7.2 cd到hbase-0.94.6-cdh4.3.0配置目录下
cdhbase-0.94.6-cdh4.3.0/conf/
配置regionservers,加入集群的主机名
vmtmstorm01
monitor04
monitor01
7.3配置hbase环境变量
vi hbase-env.sh
export JAVA_HOME=/app/java/latest (此处配置当前的JAVA_HOME路径)
export HBASE_MANAGES_ZK=false
7.4配置hbase-site.xml
vi hbase-site.xml
• 配置hbase.rootdir
<name>hbase.rootdir</name>
<value>hdfs://vmtmstorm01:8020/hbase</value>
• 配置zookeeper集群
<name>hbase.zookeeper.quorum</name>
<value> vmtmstorm01,monitor04,monitor01</value>
//此处配置系统的zookeeper集群
7.4设软链接
ln –sf /app/ hbase-0.94.6-cdh4.3.0 /home/bdp/ hbase-0.94.6-cdh4.3.0
8 Hive安装
8.1安装前的准备工作
1).安装JDK1.6
2).安装Hadoop-1.0.4
3).安装MySQL5.x (项目路径:/var/lib/mysql )
8.2 Hive安装路径
/app/hive-0.10.0-cdh4.3.0
8.3配置Hive的环境变量
vi /etc/profile
添加如下内容:(192.168.59.178情况)
exportHIVE_HOME=/app/hive-0.10.0-cdh4.3.0
exportPATH=.:$HIVE_HOME/bin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
让添加的环境变量生效执行如下命令:
source /etc/profile;
8.4 设置Hive需要的环境变量 (/app/hive-0.10.0-cdh4.3.0/conf)
解压tar zxf hive-0.10.0-cdh4.3.0.tar.gz
修改hive-env.sh文件
指定HADOOP_HOME及HIVE_CONF_DIR的路径如下:
HADOOP_HOME=/app/hadoop-2.0.0-cdh4.3.0
exportHIVE_CONF_DIR=/app/hive-0.10.0-cdh4.3.0/conf
修改hive-site.xml文件
<property>
<name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true&autoReconnect=true</value>
<description>the URL of the MySQLdatabase</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
查看MySQL驱动mysql-connector-java-5.1.7-bin.jar是否存在于hive-0.10.0-cdh4.3.0/lib目录下,若没有拷贝到其下
Ganglia依赖以下包:302页
zlib-1.2.2-4
libpng-1.2.1-6
freetype2-2.1.7-2
libart_lgpl-2.3.16-1
rrdtool-1.2.11
perl
上传的数据 存放在哪个目录下
/tmp/bdp/hive_job_log_114f6655-01c9-46b9-9238-40d185b1542f_1840308181.txt
cd${HIVE_HOME}/bin
./hive-hiveconf hive.root.logger=DEBUG,console 进入hive异常控制台,调试
hive>show tables;
java.sql.SQLException: Your password has expired.To log in you must change it using a client that supports expired passwords.
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Could not create connection to database server. Attempted reconnect 3 times.Giving up
javax.jdo.JDOFatalDataStoreException: Could notcreate connection to database server. Attempted reconnect 3 times. Giving up.
FAILED:ParseException line 2:0 missing EOF at 'show' near 'tables'
FAILED:Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
FAILED:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
修改root用户的密码;
1 2 3 4 5 6 | [html] mysql> update mysql.user set password=PASSWORD('newpassword') where User='root'; mysql> flush privileges;
mysql> quit |
重新启动MySQL
/etc/init.d/mysql restart |
root用户登录系统
/usr/local/mysql/bin/mysqladmin-u root -p password 新密码
enter password 旧密码
第二种方法:
root用户登录mysql数据库
mysql> updatemysql.user set password=password(”新密码”)where User=”root”;
mysql> flushprivileges;
mysql> quit ;
mysql忘记root密码如何处理?
如果 MySQL 正在运行,首先结束mysql进程: killall mysqld
启动 MySQL (非正常方式起动):/usr/local/mysql/bin/mysqld_safe –skip-grant-tables&
这样就可以不需要密码进入MySQL :/usr/local/mysql/bin/mysql -u root -p (要求输入密码时直接回车即可)
mysql> update usermysql.set password=password(”新密码”) where user=”root”;
mysql> flushprivileges;
mysql> quit;
重新结束进程:killallmysqld
用正常方式启动 MySQL :/usr/local/mysql/bin/mysqld_safe -user=mysql &
service mysql start 启动MYSQL
Starting MySQL...Theserver quit without updating PID file (/var/lib/mysql/monitor01.pid).[FAILED]
df –h查看磁盘使用情况
/var/lib/mysql/monitor01.err
VMwareTools-9.0.0-782409.tar.gz
ps -ef | grep mysql 查看运行进程
5.启动使用
(1) 启动
进入bin目录下,执行命令:hive
(2) 查看当前库及表
show databases; //默认为:default
show tables;
(3) 创建表示例
这部分为我自己的测试, 测试数据见附件。
CREATE TABLE cite (citing INT, citedINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
CREATE TABLE cite_count (cited INT,count INT);
INSERT OVERWRITE TABLE cite_count
SELECT cited,COUNT(citing)
FROM cite
GROUP BY cited;
SELECT * FROM cite_count WHERE count> 10 LIMIT 10;
CREATE TABLE age (name STRING,birthday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
CREATE TABLE age_out (birthday INT,birthday_count INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
(4) 查看表结构
desribe cite;
(5) 加载数据
hive