伪分布式Hadoop下对HDFS的操作常见问题
先行条件:
已经配置好了 伪分布式 的 Hadoop ,并且可以 正常启动 伪分布式集群。
若没有的话,按如下步骤操作:
-
首先到以下镜像网站下载需要的Hadoop版本(无论哪个版本,下载 最大 的那个压缩包):https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/
-
然后使用tar命令解压到目标文件夹下:
# 下面是解压到了主目录下 /home/username tar -zxf hadoop-2.10.1.tar.gz -C ~
-
解压之后进行伪分布式的配置,需要修改三个文件内容: hadoop-env.sh、hdfs-site.xml、core-site.xml
<!-- 将以下内容修改到 hdfs-site/xml --> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/home/wangli/hadoop-2.10.1/nodes/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/home/wangli/hadoop-2.10.1/nodes/dfs/data</value> </property>
<!-- 将下列内容修改到 core-site.xml --> <property> <name>hadoop.tmp.dir</name> <value>file:/home/username/hadoop-2.10.1/nodes</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property>
# 在 hadoop-env.sh 中指明JAVA_HOME export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
-
对 Namenode 进行格式化
> hadoop namenode -format # 中途如果出现要输入 就按要求输入大写Y 没有就不用管了
-
之后就可以启动伪分布式的 HDFS 集群了
cd ~/hadoop-2.10.1 ./sbin/start-dfs.sh # 等待一会儿后输入jps 查看是否有以下三个节点 >namenode >secondarynamenode >datanode
-
启动HDFS集群的过程中如果报以下错误:
-
如果只是 Permission denied 报错的话,只需要配置ssh免密登录就好了,如下:
这个操作在我的另一篇文章中的第二个问题有步骤 点我跳转
-
localhost: rcmd: socket: Permission denied
解决方案:
# 首先要执行上面配置ssh的操作 sudo vim /etc/pdsh/rcmd_default # 在打开或者新建的文件中输入 ssh # 保存退出
-
在终端中使用HDFS命令常见问题:
-
对HDFS进行操作的时候首先要保证HDFS集群启动:
# 输入jps查看是否启动了hdfs集群,如果没有的话执行以下命令 cd ~/hadoop-2.10.1 ./sbin/start-dfs.sh # 再次输入jps查看各个节点是否全部启动 # 如果出现缺失namenode或者datanode的情况,需要对hadoop伪分布式设置进行查看 # 查看节点对应的路径中是否包含tmp或者temp,并且修改为其他任意名称的文件夹 # (linux会自动清理缓存文件夹中的文件),之后删除原路径下的数据,重新格式化namenode hadoop namenode -format
-
在hadoop目录下使用如下命令:
# put命令:上传本地文件到hdfs ./bin/hdfs dfs -put ~/test/test.txt /usr/test # get命令:从hdfs中下载文件到本地 ./bin/hdfs dfs -get /usr/test/test.txt ~/桌面
上述两个操作需要注意的是:put命令上传 本地文件 ( 文件必须已经存在 )需要明确 指明 本地文件的 路径 ,上传到hdfs的路径也必须已经存在;get命令下载hdfs中的文件到本地也需要 指明路径 。
在IDE中编写Java代码进行操作常见问题(以Eclipse为例):
-
首先要下载Eclipse,可以去 官网 下载最新版或者使用之前版本(有的机器上安装比较慢,可以下载绿色解压版本,直接解压使用)。如果下载最新版本的Eclipse, 一定!一定!一定!一定!一定!一定! 要把 Java compiler 的版本设置成和 本机jdk相同 的版本,如下:(笔者的jdk是1.8的)
-
新版本的Eclipse创建 Java Project 的时候,使用本机安装了的jre,以及不要勾选一个选项:
-
要多HDFS进行操作需要在项目中添加依赖的jar包, 导入的jar包要在classpath下,不能再modulepath下,否则导包语句就报错 。
需要导入的jar包有:
- ~/hadoop-2.10.1/share/hadoop下common文件夹中的:hadoop-common-2.10.1.jar、hadoop-nfs-2.10.1.jar 以及lib目录下的所有jar包
- ~/hadoop-2.10.1/share/hadoop下hdfs文件夹中的:hadoop-hdfs-2.10.1.jar、 hadoop-hdfs-client-2.10.1.jar 、hadoop-hdfs-nfs-2.10.1.jar以及lib目录下的所有jar包。
特别注意的是 hadoop-hdfs-client-2.10.1.jar 包一定要导入,否则可能导致的结果:
- 报:No FileSystem for scheme “hdfs” 错
- 报:Class org.apache.hadoop.hdfs.DistributedFileSystem not found
-
使用Eclipse打包成jar包之后,使用如下命令在终端中执行打包好的jar包:
cd ~/hadoop-2.10.1 # 下面的 ~/test.jar 是打包成jar包的输出位置 ./bin/hadoop jar ~/test.jar
若出现 java.lang.UnsupportedClassVersionError ,则证明ide用更高版本的编译器进行了编译,需要在properties设置Java编译器版本和自己的jdk版本相同。执行第一步。
-
在Eclipse里面执行程序在HDFS上进行操作的时候如果报错:
- java.net.ConnectException:拒绝连接
原因是HDFS集群尚未启动或者没有配置ssh免密登录导致HDFS集群启动异常。
配置ssh和启动HDFS集群在上面有介绍。重新启动后执行就可以了。
关于HDFS的Web管理界面:
- 查看HDFS的Web管理界面,首先要确保HDFS集群正常启动。
- HDFS启动之后打开浏览器,如果自己没有对端口号进行更改,打开浏览器,输入以下url:
- Hadoop 2.x: localhost:50070
- Hadoop 3.x: localhost:9870
- 根据自己的hadoop版本输入后就可以进入到Web管理界面了
# 关于上一篇 伪分布式HBASE文章 常见问题的补充:
-
如果进入hbase shell中,执行任意语句报错:
- master initialzing
- Nonode /hbase/master
- 与上篇文章中相同报错不同的是 --> 这个问题是启动伪分布式hbase之后,HMaster进程自动消失
-
解决方案:
cd ~/hadoop-2.10.1 ./sbin/start-dfs.sh # 执行下面的命令删除之前hbase的相关内容,然后重新启动hbase # 下面的/hbase是在文件hbase-site.xml中指明的hbase根目录,存放在hdfs中 # hbase-site.xml 文件在 ~/hbase-2.3.7/conf下 根据自己的hbase目录找 ./bin/hdfs dfs -rm -r -f /hbase cd ~/hbase-2.3.7 ./bin/start-hbase.sh # 然后查看是否成功启动了hbase,如果成功,就可以到hbase shell界面进行正常操作了
其他问题可以在评论里提出。