hadoop安装笔记

hadoop
 
 
安装虚拟机
1, 使用vmware安装ubuntu server
2, 为ubuntu server 14.04 安装图形界面
login进入系统之后,开始进行用户界面的安装。首先输入如下命令:
sudo apt-get install xinit。
sudo apt-get install gdm //安装环境管理器
sudo apt-get install ubuntu-desktop  /安装桌面环境 
reboot
3, 进入图形界面后可以安装vmware tools,在vmware选项中选择安装tools,会自动将文件挂载到虚拟cdrom上,使用mount命令挂载到/media/cdrom,然后将里面的压缩文件拷贝到用户目录下进行解压,根据vmware下方提示,运行 sudo ./vm*.pl 会自动运行安装程序,中间需要手工确定一些参数设置。
(以上虚拟机已进行备份)
ubuntu默认root是不能图形界面登录的,root还没有设置密码:
sudo passwd root
首先要输入当前用户的密码,然后连续输入两次相同的密码就为root设置了密码。
(如果其他主机是通过复制该主机,那么要将其他主机的计算机名修改一下)
安装java jdk
手动将下好的 jdk 拖到虚拟机中的目录中,在 /usr/lib 目录下:
sudo mkdir jvm //新建目录 jvm
tar zxvf /home/ Hadoop /java/jdk1.8.gz 
接下来配置环境变量:
sudo vi /etc/profile   (或者 #sudo vim  ~/.bashrc)
在最后面加入
#set java environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_51
export JRE_HOME=/usr/lib/jvm/jdk1.8.0_51/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH 保存退出。
在修改上述命令以后,还不能立即生效,有两种方法能够生效,一种是logout ,然后再登陆,还有一种是执行命令
source /etc/profile
在终端使用echo 命令检查环境变量设置情况。
#echo $JAVA_HOME
#echo $CLASSPATH
#echo $PATH
检查JDK 是否安装成功。
#java -version
 
安装ssh服务(必需)
必要准备:
   a、修改机器名:sudo gedit /etc/hostname ,四台机子分别为A、B、C、D
   b、在 /etc/hosts 中添加机器名和相应的 IP(NameNode、DataNode都如下设置) :
      127.0.0.1 localhost
      172.18.50.10  A
      172.18.50.11  B
      172.18.50.12  C
      172.18.50.13  D
   c、关闭防火墙   $ sudo ufw disable
配置SSH无密码登陆
SSH 无密码原理简介 :
首先在 hadoop1 上生成一个密 钥对,包括一个公钥和一个私钥,并将公钥复制到所有的 slave(hadoop2-hadoop4) 上。
然后当 master 通 过 SSH 连接 slave 时, slave 就会生成一个随机数并用 master 的公 钥对随机数进行加密,并发送给 master 。
最后 master 收到加密数之后再用私 钥解密,并将解密数回传给 slave , slave 确 认解密数无误之后就允许 master 不 输入密码进行连接了。
(配置了ssh认证的机器集群, Master免密码登录Slave(Master远程登录其他node,启动相应的进程),整个集群才能启动(否则要手动启动所有机器的进程)),运行启动命令的机器要能够免密码登录其他机器,然后所有的机器都会启动相应的进程
具体步 骤(在root用户和hadoop用户登陆情况下执行)
0,ssh可以实现远程登录和管理,ubuntu默认并没有安装ssh服务,如果通过ssh链接ubuntu,需要自己手动安装ssh-server。命令行:
sudo apt-get install ssh openssh-server
(这里首先会提示错误信息:
hadoop@ubuntu1:~/hadoop$ sudo apt-get install ssh openssh-server
E: dpkg 被中断,您必须手工运行 sudo dpkg --configure -a 解决此问题。
解决:运行sudo dpkg --configure -a)
1,创建ssh-key,这里我们采用rsa方式,命令行如下:
ssh-keygen  -t rsa -P ""   (执行命令 ssh-keygen -t rsa 之后一路回车,查看刚生成的无密码钥对: cd .ssh 后 执行 ll)
出现一个图形,出现的图形就是密码,不用管它,生成结果如下所示:
 
会在.ssh目录下生成三个文件:id_dsa(私钥),id_dsa.pub(公钥),known_hosts
2 、把 id_rsa.pub 追加到授权的 key 里面去。 执行命令  cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
3 、修改权限: 执行 chmod 600 ~/.ssh/authorized_keys
4 、确保 cat /etc/ssh/sshd_config 中存在如下内容
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
如需修改, 则在修改后执行重启 SSH 服 务命令使其生效 :service sshd restart
5 、将公 钥复制到所有的 slave 机器上 :scp ~/.ssh/id_rsa.pub 192.168.1.203 : ~/    然后 输入 yes ,最后 输入 slave 机器的密 码
6 、在 slave 机器上 创建 .ssh 文件夹 :mkdir ~/.ssh 然后 执行 chmod 700 ~/.ssh (若文件夹以存在 则不需要创建)
7 、追加到授权文件 authorized_keys 执行命令 :cat ~/id_rsa.pub >> ~/.ssh/authorized_keys 然后 执行 chmod 600 ~/.ssh/authorized_keys,(不行的话在slave机器上就执行以下1过程)
8 、重复第 4 步
9 、 验证命令 : 在 master 机器上 执行  ssh 192.168.1.203  发现主机名由 hadoop1 变成 hadoop3 即成功,最后 删除 id_rsa.pub 文件 :rm -r id_rsa.pub
按照以上步 骤分别配置 hadoop1,hadoop2,hadoop3,hadoop4 ,要求每个都可以无密 码登录。退出命令行为: exit
 
Hadoop 是一个由Apache 基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop 的框架最核心的设计就是: HDFS MapReduce HDFS 为海量的数据提供了存储,则 MapReduce 为海量的数据提供了计算。
HDFS是一个文件存储系统,用户可以在该系统中进行文件操作,如查看文件、修改文件等。
 
单机环境下配置 ssh免密码:
ssh-keygen
cd ~/.ssh/
\cp id_rsa.pub authorized_keys
安装hadoop
这里首先固定下各个主机的 ip 地址:
ifconfig  eth0 192.168.1.99  broadcast  192.168.1.255  netmask  255.255.255.0
解压 hadoop.tar.gz 的文件到用户 Hadoop 目录下的 Hadoop 文件夹内。
 
配置 hadoop 环境变量:  vim /etc/profile
添加
export HADOOP_DEV_HOME=/home/hadoop/hadoop
export PATH=$PATH:$HADOOP_DEV_HOME/bin
export PATH=$PATH:$HADOOP_DEV_HOME/sbin
export HADOOP_MAPARED_HOME=${HADOOP_DEV_HOME}
export HADOOP_COMMON_HOME=${HADOOP_DEV_HOME}
export HADOOP_HDFS_HOME=${HADOOP_DEV_HOME}
export YARN_HOME=${HADOOP_DEV_HOME}
export HADOOP_CONF_DIR=${HADOOP_DEV_HOME}/etc/hadoop
export HDFS_CONF_DIR=${HADOOP_DEV_HOME}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_DEV_HOME}/etc/hadoop
(修改完文件后,要使用 source /etc/profile 使配置生效)
配置完 hadoop 路径,在 shell 输入 hadoop 可以看到提示信息
 
首先配置 etc/Hadoop / hadoop-env.sh ,在文件中查找 JAVA_HOME ,如果没有设置那么需要设置一下、
export JAVA_HOME=(注意应当使用绝对路径。)
在用户 Hadoop Hadoop 目录下新建目录 Hadoop_tmp
以下配置在 hadoop 官方文档中均有说明:
Configuring the Hadoop Daemons 目录下有下面这些配置文件的介绍。
配置 etc/Hadoop/ core_site .xml:
<configuration>
 
    <property>
        <name> fs.default.name </name>
        <value> hdfs://192.168.40.128:9000 </value>
    </property>
//fs.default.name指定 namenode 在哪台主机以及入口端口,要写主机 ip 地址或者主机名,完全模式下 value 不能够写 localhost:9000 ,否则每台主机都认为自己是 namenode ,另外,该地址是 hdfs 文件系统主目录地址,是进行 hdfs 操作的默认路径。
 
    <property>
        <name>hadoop.tmp.dir</name>
        <value> /home/hadoop/hadoop/hadoop_tmp </value>
        <description>A base for other temporary directories.</description>
    </property>
//hadoop.tmp.dir指定 hdfs 的工作目录,默认会在 linux tmp 目录下,重启后会自动清空。
</configuration>
此外,还可以添加如下配置:
1. <property>
2. <name>fs.checkpoint.period</name>
3. <value>3600</value>
4. <description>The number of seconds between two periodic checkpoints.
5. </description>
6. </property>
7. <property>
8. <name>fs.checkpoint.size</name>
9. <value>67108864</value>
<description>The size of the current edit log (in bytes) that triggers
a periodic checkpoint even if the fs.checkpoint.period hasn't expired.
</description>
</property>
// fs.checkpoint.period 表示多长时间记录一次 hdfs 的镜像。默认是 1 小时。 fs.checkpoint.size 表示一次记录多大的 size ,默认 64M
说明:在第二个 hadoop.tmp.dir 属性中, hadoop_tmp 是自行创建的,该目录要给予当前用户足够的 w 权限,否则 start-all.sh 运行的时候会报错,提示没有权限创建该目录。
 
slaves配置(配置了该属性,所配置的机器会成为 DataNode
vim /home/hadoop/hadoop/etc/hadoop/slaves
添加  slave  的  IP (或者主机名)
192.168. 40 . 128
masters配置(配置了该属性,所配置的机器会成为 SecondaryNameNode
vim etc/hadoop/masters(没有的话自行创建, secondaryNameNode 可以配置多个 )
ubuntu2
//输入主机名或者 ip 地址,该台主机会成为 secondarynamenode ,这里将 secondaryNameNode 放在了 DataNode 主机上。
 
hdfs-site.xml配置
该文件中配置了 namenode datanode 路径和访问的 ip 地址(端口号)
<configuration>
 
    <property>
        <name>dfs.replication</name>
        <value> 1 </value>
</property>
//配置的是数据的副本数,默认为 3 ,该值要小于 DataNode 的个数(副本数不能超过 DataNode 节点的个数)
 
    <property>  
        <name>dfs.http.address</name>  
        <value>192.168.40.128:50070</value>  
        <description>  
        The address and the base port where the dfs namenode web ui will listen on.  
        If the port is 0 then the server will start on a free port.  
        </description>  
    </property>
 
<property>
<name> dfs.namenode.name.dir </name>
<value> file:/home/hadoop/ hadoop/ hdfs/name </value>
<final>true</final>
</property>
//namenode路径
 
<property>
<name>dfs.dataname.data.dir</name>
<value> file:/ home/ hadoop /hadoop /hdfs/data </value>
<final>true</final>
</property>
 
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>192.168.40.129:50090</value>
    </property>
//配置 secondnode 所在主机
 
</configuration>
说明: 1,dfs.replication 默认的值为 3 ,如果集群中 slave 的个数小于 3 要修改该值,由于测试环境只有一个 slave ,故值改为 1
2,涉及到目录的地方是自行创建的(没有程序会自动创建),该目录要给予足够的 w 权限,否则 start-all.sh 运行的时候会报错,提示没有权限创建该目录。
3,在 xml 配置文件中,字段内的值不要加空格,字段内的值都有严格的规定(一般是字母 + 数字或 . ),如果随意加了空格,可能会导致某一个服务开启失败,
<value>   192.168.40.128:23003   </value> ,在 ip 地址两端包含了空格,会引发 namenode 启动不了
 
配置 yarn-site.xml
<configuration>
 
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.address</name>
<value>192.168.40.128:18040</value>
</property>
 
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>192.168.40.128:18030</value>
</property>
 
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>192.168.40.128:18088</value>
</property>
 
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>192.168.40.128:18025</value>
</property>
 
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>192.168.40.128:18141</value>
</property>
 
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce _ shuffle</value>
</property>
 
</configuration>
 
配置 etc/Hadoop /mapred-site.xml
我们看到该目录下没有 mapred-site.xml 文件,却含有 mapred-site.xml.template 文件,
那么: cp mapred-site.xml.template mapred-site.xml ,然后配置如下:
<configuration>
<property>
        <name>mapred.job.tracker</name>
        <value>192.168.40.128:9001</value>
    <property>
</configuration>
//配置 Job Tracker task tracker 默认在剩余的 datanode
注: hadoop2 以后就没有 jobtracker tasktracker 了,由 yarn 进行管理。参考: http://www.aboutyun.com/thread-7678-1-1.html  
运行  hadoop 进入  hadoop-0.20.2 
 
同步以上代码和配置( masters,slaves,core-site.xml,hdfs-site.xml,yarn-site.xml,mapred.xml.template )到其他 slave 机器
 
开始运行
1,格式化文件系统:  
$  hadoop namenode  format   (如果没有配置 hadoop 路径,需要指定 hadoop 程序所在目录: hadoop/bin/hadoop)
格式化之后会在配置的临时目录下生成一系列目录。
2,启动 hadoop 服务
/ s bin/start-all.sh   (我的版本在 sbin 目录下才能找到,有的版本是 /bin 目录下 )
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting   namenodes  on [192.168.40.128]
192.168.40.128: starting namenode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-namenode-ubuntu1.out
192.168.40.129:   datanode  running as process 7801. Stop it first.
Starting secondary namenodes [192.168.40.128]
192.168.40.12 9 : starting  secondarynamenode , logging to /home/hadoop/hadoop/logs/hadoop-hadoop-secondarynamenode-ubuntu1.out
starting yarn daemons
starting  resourcemanager , logging to /home/hadoop/hadoop/logs/yarn-hadoop-resourcemanager-ubuntu1.out
192.168.40.129: starting  nodemanager , logging to /home/hadoop/hadoop/logs/yarn-hadoop-nodemanager-ubuntu2.out
会提示: This script is Deprecated. (不赞成这么做,会被建议一步步手动启动各个服务)
在启动过程中,我们还可以看到各项服务启动信息,某项服务在使用 jps 时没有出现,那么要去查看响应的日志文件所报出的错误信息。
3, jps (java ps) 来查看 java 虚拟机运行的 java 线程
[root@hadoop1 hadoop]# jps
7396  NameNode
24834 Bootstrap
7594  SecondaryNameNode
7681  ResourceManager
32261 Jps
 
[root@hadoop2 ~]# jps
8966 Jps
31822  DataNode
31935  NodeManager
可以看到, namenode datanode 上的服务均被开启,恭喜你, hadoop 安装配置成功,运行正常。
其中 namenode(master),secondnamenode(master),datanode(slave) HDFS 的服务, resourseManager(master) nodemanger(slave) yarn 的服务。
 
访问: http://192.168.40.128:50070/  可以链接到 namenode ,对 hdfs 进行检测 
Configured Capacity: 18.32 GB
DFS Used: 100 KB (0%)
Non DFS Used: 7.3 GB
DFS Remaining: 11.02 GB (60.16%)
Block Pool Used: 100 KB (0%)
DataNodes usages% (Min/Median/Max/stdDev): 0.00% / 0.00% / 0.00% / 0.00%
Live Nodes 1 (Decommissioned: 0)
Dead Nodes 0 (Decommissioned: 0)
Decommissioning Nodes 0
Total Datanode Volume Failures 0 (0 B)
Number of Under-Replicated Blocks 0
Number of Blocks Pending Deletion 0
Block Deletion Start Time 2015/8/24 上午10:08:12
 
访问: http://192.168.40.129:50090/  可以连接到 SecondaryNameNode
4,退出 hadoop
bin/stop-all.sh 
会提示: This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh
所有的服务同时启动时不建议的,最好是先 stop-dfs.sh 然后 stop-yarn.sh ,一步步手工操作,
hadoop 官方文档 (hadoop.apache.org/Documention/) 中也给出了各个进程开启的顺序,在 Hadoop Startup 目录下
 
可以通过以下步骤来进行:
Hadoop启动
格式化集群
hadoop namenode -format -clusterid clustername
启动 hdfs
start-dfs.sh     //开 启  hadoop dfs 服 务     
启动 Yarn ,开 启  yarn  资 源管理服 务
start-yarn.sh
启动 httpfs ,开 启  httpfs  服 务
httpfs.sh start
使得 对外 可以提高  http  restful 接口服 务
 
开启过程中遇到问题:
1, jps 查看不到 namenode
(1 namenode not format
查看 hadoop 目录下的 Logs 文件夹内的日志文件, namendoe 节点的日志在     hadoop- namenode-主机名 .log    的文件中,打开该文件查看错误日志,最下面是最新的日志:
2015-08-20 18:52:06,480 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage
java.io.IOException:  NameNode is not formatted.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:225)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:975)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:681)
at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:584)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:644)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:811)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:795)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1488)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1554)
2015-08-20 18:52:06,493 INFO org.mortbay.log: Stopped HttpServer2$SelectChannelConnectorWithSafeStartup@192.168.40.128:23001
2015-08-20 18:52:06,498 WARN org.apache.hadoop.http.HttpServer2: HttpServer Acceptor: isRunning is false. Rechecking.
2015-08-20 18:52:06,499 WARN org.apache.hadoop.http.HttpServer2: HttpServer Acceptor: isRunning is false
2015-08-20 18:52:06,499 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Stopping NameNode metrics system...
2015-08-20 18:52:06,499 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NameNode metrics system stopped.
2015-08-20 18:52:06,499 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NameNode metrics system shutdown complete.
2015-08-20 18:52:06,500 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
java.io.IOException:  NameNode is not formatted.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:225)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:975)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:681)
at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:584)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:644)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:811)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:795)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1488)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1554)
2015-08-20 18:52:06,501 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1
2015-08-20 18:52:06,505 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ubuntu1/127.0.1.1
************************************************************/
从上面的日志中可以看到,出现问题的原因是因为 namenode 节点没有格式化,解决通过如下命令:
hadoop namendoe  format
 
(2)/tmp/hadoop/name not exists or cant be accessed
        查看目录 /tmp/hadoop/name 只有 root 用户有权限, hadoop 无法对该目录进行操作,执行 : sudo chown zhangwj.zhangwj tmp 
在启动namenode 可以解决
 
2, jps 查看不到 datanode
 之前做过的操作是对 namenode 进行格式化,运行 start-all.sh jps 查看到 datanode 未启动
 解决:
 查看 datanode 日志文件, 根据时间信息找到最近一次运行的日志 hadoop-datanode.log 文件 ,查看到错误提示如下:
 2015-08-21 11:08:35,729 INFO org.apache.hadoop.hdfs.server.common.Storage: Lock on /home/hadoop/hadoop/hadoop_tmp/dfs/data/in_use.lock acquired by nodename 6353@ubuntu2
 2015-08-21 11:08:35,731 WARN org.apache.hadoop.hdfs.server.common.Storage: java.io.IOException: Incompatible clusterIDs in /home/hadoop/hadoop/hadoop_tmp/dfs/data: namenode clusterID = CID-a4277d56-80ae-48a6-b9b7-0c6e44d1df60; datanode clusterID = CID-2efa3199-3aa0-4737-9d0f-616e17e0e94b
2015-08-21 11:08:35,731 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to /192.168.40.128:9000. Exiting. 
java.io.IOException: All specified directories are failed to load.
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:477)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1361)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1326)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:316)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:223)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:801)
at java.lang.Thread.run(Thread.java:745)
2015-08-21 11:08:35,733 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Ending block pool service for: Block pool <registering> (Datanode Uuid unassigned) service to /192.168.40.128:9000
2015-08-21 11:08:35,734 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Removed Block pool <registering> (Datanode Uuid unassigned)
2015-08-21 11:08:37,735 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Exiting Datanode
2015-08-21 11:08:37,736 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 0
2015-08-21 11:08:37,738 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down DataNode at ubuntu2/127.0.1.1
************************************************************/
在这些日志中,后面提示的问题是 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to /192.168.40.128:9000. Exiting. 
java.io.IOException: All specified directories are failed to load.
从这些信息里看不到出题出在哪里,那么继续往上寻找问题: java.io.IOException:  Incompatible clusterIDs  in /home/hadoop/hadoop/hadoop_tmp/dfs/data: namenode clusterID = CID-a4277d56-80ae-48a6-b9b7-0c6e44d1df60; datanode clusterID = CID-2efa3199-3aa0-4737-9d0f-616e17e0e94b
从这里我们可以看到问题所在:不兼容的 clusterIDs,namenode clusterID datanode clusterID 不一致。
 
 出现该问题的原因:在第一次格式化 dfs 后,启动并使用了 hadoop ,后来又重新执行了格式化命令( hdfs namenode -format) ,这时 namenode clusterID 会重新生成, namenode format 清空了 namenode 下的数据 , 但是没有清空 datanode 下的数据 , 导致启动时失败,故 datanode clusterID  保持不变。
 解决办法 1 :停掉集群,删除问题节点的 data 目录下的所有内容 (tmp/dfs/data/) 。即 hdfs-site.xml 文件中配置的 dfs.data.dir 目录。重新格式化 namenode
 解决办法 2 :先停掉集群,然后将 datanode 节点目录 tmp/dfs/data/current/VERSION 中的修改为与 tmp/dfs/name/current/VERSION 一致即可(不是文件替换)。
3 :不停集群,将 data 目录下所有内容清空,再次执行 sbin/start-dfs.sh ,会提示namenode 已经启动(忽略),会继续将 datanode 重新启动。
 
3, jps 查看不到 NodeManger
 解决:
 查看日志文件 , 有如下错误信息:
 2015-08-21 13:15:30,329 FATAL org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices: Failed to initialize mapreduce.shuffle
java.lang.IllegalArgumentException: The ServiceName: mapreduce.shuffle set in yarn.nodemanager.aux-services is invalid.The valid service name should only contain a-zA-Z0-9_ and can not start with numbers
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:88)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices.serviceInit(AuxServices.java:114)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl.serviceInit(ContainerManagerImpl.java:245)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:260)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:485)
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:533)
提示说 yarn.nodemanager.aux-services 里的 mapreduce.shuffle 不合法,只能是 a-zA-Z0-9_ ,去查看 yarn-site.xml 的配置文件,发现
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce.shuffle</value>
</property>
任意修改 mapreduce.shuffle mapreduceShuffle ,发现 nodemanager 仍启动不了,提示 mapreduceShuffle 类无法识别,网上找了一下解决方案,解决方法如下:
mapreduce.shuffle改为 mapreduce_shuffle
另外,需要说明的是,理论上应该将该集群中所有的配置均更新,但如果只有该台节点有这问题,那么可以只修改当前节点的 yarn-site.xml
 
测试:
hadoop@ubuntu1:~/hadoop/sbin$ hadoop fs - ls  hdfs://192.168.40.128:9000/      //此时目录下没有文件
hadoop@ubuntu1:~/hadoop/sbin$ hadoop fs - mkdir  hdfs://192.168.40.128:9000/testfolder        //新建 testfolder 文件夹
hadoop@ubuntu1:/bin$ cd -
/home/hadoop/hadoop/sbin
hadoop@ubuntu1:~/hadoop/sbin$ cd ../bin
hadoop@ubuntu1:~/hadoop/bin$  hdfs dfs -ls /
hadoop@ubuntu1:~/hadoop/bin$  hdfs dfs -ls /
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2015-08-20 19:21 / testfolder
hadoop@ubuntu1:~/hadoop/bin$ hadoop fs -ls hdfs://192.168.40.128:9000/Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2015-08-20 19:21 hdfs://192.168.40.128:9000/testfolder
注: hdfs 文件系统里的文件在外面系统是看不到的。
 
验证 map/reduce
 
在  master  上, 创建输入目录  :hadoop fs -mkdir /input
将  / hadoop/ 目 录下的所有  txt  文件复制到  hdfs  分布式文件系 统的目录里,执行以下命令
hadoop fs -put *.txt /input
在  hadoop1  上, 执行  HADOOP  自 带的例子,  wordcount  包,命令如下
cd share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples.jar wordcount /input /output
在  hadoop  上, 查看结果命令(各个节点都可以查看)如下  :
[root@master1 hadoop]# hadoop fs -ls /output
Found 2 items
-rw-r--r--   2 root supergroup          0 2012-06-29 22:59 hdfs://192.168.1.201:9000/output/_SUCCESS
-rw-r--r--   2 root supergroup       8739 2012-06-29 22:59 hdfs://192.168.1.201:9000/output/part-r-00000
 
[root@hadoop1 hadoop]# hadoop fs -cat  /output/part-r-00000 即可看到每个 单词的数量
 
HDFS
HDFS( Hadoop Distributed File System  Hadoop 分布式文件系统。是根据 google 发表的论文翻版的。论文为 GFS Google File System Google  文件系统。
HDFS有很多特点:
    ① 保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存 3 份。
    ② 运行在廉价的机器上。
③ 适合大数据的处理。多大?多小? HDFS 默认会将文件分割成 block 64M 1 block 。然后将 block 按键值对存储在 HDFS 上,并将键值对的映射存到内存中。如果小文件太多,那内存的负担会很重。
 
关于 Secondary NameNode:
NameNode 将对文件系统的改动追加保存到本地文件系统上的一个日志文件( edits )。当一个 NameNode 启动时,它首先从一个映像文件 ( fsimage )中读取 HDFS 的状态,接着应用日志文件中的 edits 操作。然后它将新的 HDFS 状态写入( fsimage )中,并使用一个空的  edits 文件开始正常操作。因为 NameNode 只有在启动阶段才合并 fsimage edits ,所以一段时间后日志文件可能会变得非常庞大,特别是 对大型的集群。日志文件太大的另一个副作用是下一次 NameNode 启动会花很长时间。
Secondary NameNode 定期合并 fsimage edits 日志,将 edits 日志文件大小控制在一个限度下。因为内存需求和 NameNode 在一个数量级上, 所以通常 secondary NameNode (运行在单独的物理机器上)和 NameNode 运行在不同的机器上。 Secondary NameNode 通过 bin/start-dfs.sh conf/masters 中指定的节点上启动。
Secondary NameNode 的检查点进程启动,是由两个配置参数控制的:
    * fs.checkpoint.period ,指定连续两次检查点的最大时间间隔, 默认值是 1 小时。
    * fs.checkpoint.size 定义了 edits 日志文件的最大值,一旦超过这个值会导致强制执行检查点(即使没到检查点的最大时间间隔)。默认值是 64MB
Secondary NameNode 保存最新检查点的目录与 NameNode 的目录结构相同。 所以 NameNode 可以在需要的时候读取 Secondary NameNode 上的检查点镜像。
假使namenode 损坏或丢失之后,无法启动 hadoop 这时就要人工去干预恢复到 secondarynamenode 中所照快照的状态,这就意味着集群的数据会或多或少的丢失和一些宕机时间,并且将 secondarynamenode 作为重要的 namenode 来处理,这就要求,尽量不要将 secondarynamede namenode 放在同一台机器上。
另外一种保障的机制是: HDFS HA 架构,参考文章: http://itindex.net/detail/50686-hdfs-ha-qjm  
HDFS 集群中只有一个 Namenode ,这就会引入单点问题;即如果 Namenode 故障,那么这个集群将不可用,直到 Namenode 重启或者其他 Namenode 接入。
     有两种方式会影响集群的整体可用性:
    1 、意外的突发事件,比如物理机器 crash ,集群将不可用,直到管理员重启 Namenode
    2 、系统维护,比如软件升级等,需要关闭 Namenode ,也会导致集群暂时性的失效。
    HDFS HA 特性即解决这个问题,它通过在集群中同时运行 2 (redundant)Namenodes ,并让 active passive 之间热备 (hot standby) 。当 Active Namenode 故障失效后,即可快速故障转移到新的 Namenode (passive Namenode) ;也可以在计划维护期间,基于管理员发起 (administrator-inited) 的友好的 failover 。 
 
HDFS shell 
假设已经在 core-site.xml 里配置了  fs.default.name=hdfs://localhost:9000 ,则仅使用下面的命令即可:
$ hadoop fs - ls   /      (可以省略前面的 hdfs://192.168.40.128:9000/ )
shell命令可以使用下面三种形式:
Following are the three commands which appears same but have minute differences
     hadoop fs  {args}
    hadoop dfs {args}
     hdfs dfs  {args}
   1,   hadoop fs <args>
FS relates to a generic file system which can point to any file systems like local, HDFS etc. So this can be used when you are dealing with different file systems such as Local FS, HFTP FS, S3 FS, and others
   2, hadoop dfs <args> ,
dfs is very specific to HDFS. would work for operation relates to HDFS. This has been deprecated and we should use hdfs dfs instead.
3,   hdfs   dfs <args>
same as 2nd i.e would work for all the operations related to HDFS and is the recommended command instead of hadoop dfs
 
查看 hdfs 提供的 shell-like 命令帮助,在 shell 中输入:
bin/hdfs dfs –help    //查看所有命令的帮助
bin/hdfs dfs -help command-name     //查看 command-name 命令的帮助文档
了解了这些命令就可以在使用 hdfs shell 了:
$ hadoop fs -ls /
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2015-08-21 11:56 /testfolder
 
hadoop shell 命令查看文档:
put
使用方法: hadoop fs -put <localsrc> ... <dst>
从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。
    hadoop fs -put localfile /user/hadoop/hadoopfile
    hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
    hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile
    hadoop fs -put - hdfs://host:port/hadoop/hadoopfile
从标准输入中读取输入。
返回值:成功返回 0 ,失败返回 -1
 
get
使用方法: hadoop fs -get [-ignorecrc] [-crc] <src> <localdst>
复制文件到本地文件系统。可用 -ignorecrc 选项复制 CRC 校验失败的文件。使用 -crc 选项复制文件以及 CRC 信息。
示例:
    hadoop fs -get /user/hadoop/file localfile
    hadoop fs -get hdfs://host:port/user/hadoop/file localfile
返回值:成功返回 0 ,失败返回 -1
 
copyFromLocal
使用方法: hadoop fs -copyFromLocal <localsrc> URI
除了限定源路径是一个本地文件外,和 put 命令相似。
copyToLocal
使用方法: hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>
除了限定目标路径是一个本地文件外,和 get 命令类似。
 
hadoop安全模式:
 
离开安全模式方法
  bin/hadoop  dfsadmin -safemode leave
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop是一个开源的分布式计算框架,可用于大数据的存储和处理。它采用了分布式文件系统(HDFS)和分布式计算框架(MapReduce),能够将大数据分割成小的数据块,并在集群中的多台计算机上并行处理这些数据块。 HDFS是Hadoop的分布式文件系统,它将大文件切分为多个数据块,并将这些数据块存储在集群中的多个计算机上。HDFS使用主从架构,其中NameNode负责管理文件系统的元数据,而多个DataNode负责实际存储数据。HDFS具有高容错性,能够自动复制数据块以保证数据的可靠性。 MapReduce是Hadoop的分布式计算框架,它通过将计算任务划分为多个Map和Reduce阶段来进行并行计算。Map阶段将输入数据切分为多个独立的小任务,并在集群中的多个计算机上并行执行。Reduce阶段将Map阶段的输出合并并进行聚合计算。MapReduce具有自动并行化、容错性和可扩展性等优点,能够高效地处理大规模数据集。 在学习Hadoop时,首先要了解Hadoop的核心组件,包括HDFS和MapReduce。然后,需要学习Hadoop的架构和工作原理,理解Hadoop如何实现分布式存储和计算。接下来,需要学习Hadoop安装和配置,包括在单机和集群环境下的安装和配置过程。此外,还需要学习Hadoop的命令行工具和管理工具,以及Hadoop的API和编程模型。 在实际使用Hadoop时,需要掌握Hadoop的常用操作和管理技巧,如如何上传和下载文件、如何执行MapReduce作业、如何监控和管理Hadoop集群等。同时,需要学习Hadoop的优化技术和调优方法,以提高Hadoop集群的性能和效率。 总之,对于Hadoop的学习,除了理解其基础知识和工作原理外,还需要熟悉其常用操作和管理技巧,以及灵活运用Hadoop来解决实际的大数据问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值