java 远程连接Pseudo-Distributed Hadoop
程序员文章站
2022-04-03 20:01:16
...
本文主要描述如何实现在一台Linux机器上搭建一个Pseudo-Distributed的Hadoop,在另外一台机器上通过API访问
服务器端环境搭建:
1.版本信息
java:1.8.0_172
Hadoop: 2.9.1
2.设置JAVA_HOME
在~/.bash_profile中追加如下内容
执行如下命令使上述设置立即生效
3.设置hostname
4.下载hadoop, 点击下载
5.解压下载的文件
6.修改配置文件
6.1 修改etc/hadoop/core-site.xml文件,追加如下内容
6.2 修改etc/hadoop/hdfs-site.xml文件,追加如下内容
6.3 修改etc/hadoop/hadoop-env.sh,将JAVA_HOME修改成正确值
7. 配置无密码登录
8. 格式化name node
9.启动 dfs
客户端环境
1.配置hostname
在客户端机器上也需要设置hostname,如192.168.0.172 docker05
2.工程目录如下
3. 工程pom.xml文件
4.测试代码
5.执行后到服务器端执行 hadoop fs -ls 可以看到文件正常上传了
遇到错误
1.
原因 hadoop-env.sh中JAVA_HOME的设置有问题
具体的修改办法如下:
vim etc/hadoop/hadoop-env.sh
将语句 export JAVA_HOME=$JAVA_HOME
修改为 export JAVA_HOME=/usr/java/jdk1.8.0_172-amd64
保存后退出。
再次输入start-dfs.sh启动hadoop,则没有报错。
2.
权限问题
解决方法,可暂时去掉权限检查
在 hdfs-site.xml文件中追加
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
另一种连接方式,通过hdfs的配置文件来创建Configuration
1.工程目录
其中core-site.xml、hdfs-site.xml是从服务器上copy下来的文件
2.测试类
服务器端环境搭建:
1.版本信息
java:1.8.0_172
Hadoop: 2.9.1
2.设置JAVA_HOME
在~/.bash_profile中追加如下内容
JAVA_HOME=/usr/java/jdk1.8.0_172-amd64 export JAVA_HOME
执行如下命令使上述设置立即生效
source ~/.bash_profile
3.设置hostname
hostname docker05
4.下载hadoop, 点击下载
5.解压下载的文件
$ tar xzvf hadoop-2.9.1.tar.gz
6.修改配置文件
6.1 修改etc/hadoop/core-site.xml文件,追加如下内容
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://docker05:9000</value> </property> </configuration>
6.2 修改etc/hadoop/hdfs-site.xml文件,追加如下内容
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration>
6.3 修改etc/hadoop/hadoop-env.sh,将JAVA_HOME修改成正确值
# The java implementation to use. export JAVA_HOME=/usr/java/jdk1.8.0_172-amd64
7. 配置无密码登录
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 0600 ~/.ssh/authorized_keys
8. 格式化name node
$ bin/hdfs namenode -format
9.启动 dfs
sbin/start-dfs.sh
客户端环境
1.配置hostname
在客户端机器上也需要设置hostname,如192.168.0.172 docker05
2.工程目录如下
3. 工程pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>falcon.chengf</groupId> <artifactId>simple-hdfs-test</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.8.1</version> </dependency> </dependencies> </project>
4.测试代码
/** * */ package simple.hdfs.test; import java.io.IOException; import java.net.URI; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; /** * @author: 作者: chengaofeng * @date: 创建时间:2018-06-01 15:25:47 * @Description: TODO * @version V1.0 */ public class HdfsTest { public static String uri = "hdfs://docker05:9000"; public static void main(String[] args) throws IOException { uploadLocalFile2HDFS("/Users/chengaofeng/Downloads/hadoop-test1.data", "/chengf/hadoop-test1.data"); } public static boolean uploadLocalFile2HDFS(String localFile, String hdfsFile) throws IOException { if (StringUtils.isBlank(localFile) || StringUtils.isBlank(hdfsFile)) { return false; } hdfsFile = uri + hdfsFile; Configuration config = new Configuration(); FileSystem hdfs = FileSystem.get(URI.create(uri), config); Path src = new Path(localFile); Path dst = new Path(hdfsFile); hdfs.copyFromLocalFile(src, dst); hdfs.close(); return true; } }
5.执行后到服务器端执行 hadoop fs -ls 可以看到文件正常上传了
遇到错误
1.
starting namenodes on docker05 docker05 Error: JAVA_HOME is not set and could not be found. localhost: Error:JAVA_HOME is not set and could not be found.
原因 hadoop-env.sh中JAVA_HOME的设置有问题
具体的修改办法如下:
vim etc/hadoop/hadoop-env.sh
将语句 export JAVA_HOME=$JAVA_HOME
修改为 export JAVA_HOME=/usr/java/jdk1.8.0_172-amd64
保存后退出。
再次输入start-dfs.sh启动hadoop,则没有报错。
2.
权限问题
Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=chengaofeng, access=WRITE, inode="/":root:supergroup:drwxr-xr-x at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:350)
解决方法,可暂时去掉权限检查
在 hdfs-site.xml文件中追加
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
另一种连接方式,通过hdfs的配置文件来创建Configuration
1.工程目录
其中core-site.xml、hdfs-site.xml是从服务器上copy下来的文件
2.测试类
/** * */ package simple.hdfs.test; import java.io.IOException; import java.io.InputStream; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; /** * @author: 作者: chengaofeng * @date: 创建时间:2018-06-01 15:25:47 * @Description: TODO * @version V1.0 */ public class HdfsTest { public static void main(String[] args) throws IOException { Configuration config = new Configuration(); InputStream input = HdfsTest.class.getResourceAsStream("/core-site.xml"); config.addResource(input); InputStream input2 = HdfsTest.class.getResourceAsStream("/hdfs-site.xml"); config.addResource(input2); FileSystem hdfs = FileSystem.get(config); uploadLocalFile2HDFS("/Users/chengaofeng/Downloads/hadoop-test1.data", "/chengf/hadoop-test2.data", hdfs); System.out.println("upload ok"); } public static boolean uploadLocalFile2HDFS(String localFile, String hdfsFile, FileSystem hdfs) throws IOException { if (StringUtils.isBlank(localFile) || StringUtils.isBlank(hdfsFile)) { return false; } Path src = new Path(localFile); Path dst = new Path(hdfsFile); hdfs.copyFromLocalFile(src, dst); hdfs.close(); return true; } }
推荐阅读
-
java远程连接调用Rabbitmq的实例代码
-
java远程连接调用Rabbitmq的实例代码
-
使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount
-
Windows下IntelliJ IDEA远程连接服务器中Hadoop运行WordCount(详细版)
-
Java驱动远程连接mongoDB(简明易懂版)
-
IDEA远程连接HBase及其Java API实战详解
-
分享Java如何远程连接调用Rabbitmq?
-
java连接access数据库的三种方式以及远程连接
-
分享Java如何远程连接调用Rabbitmq?
-
mysql-JAVA桌面程序远程连接数据库失败