java 远程连接Pseudo-Distributed Hadoop

阅读更多
本文主要描述如何实现在一台Linux机器上搭建一个Pseudo-Distributed的Hadoop,在另外一台机器上通过API访问
服务器端环境搭建:
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文件,追加如下内容

  
    fs.defaultFS
    hdfs://docker05:9000
  


6.2 修改etc/hadoop/hdfs-site.xml文件,追加如下内容

  
    dfs.replication
    1
  
  
   dfs.permissions.enabled
   false
  


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.工程目录如下

java 远程连接Pseudo-Distributed Hadoop_第1张图片
3. 工程pom.xml文件

	4.0.0
	falcon.chengf
	simple-hdfs-test
	0.0.1-SNAPSHOT
	
		
			org.apache.hadoop
			hadoop-client
			2.8.1
		
	


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文件中追加

   dfs.permissions.enabled
   false


另一种连接方式,通过hdfs的配置文件来创建Configuration
1.工程目录

java 远程连接Pseudo-Distributed Hadoop_第2张图片
其中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 远程连接Pseudo-Distributed Hadoop_第3张图片
  • 大小: 32.4 KB
  • java 远程连接Pseudo-Distributed Hadoop_第4张图片
  • 大小: 19.4 KB
  • java 远程连接Pseudo-Distributed Hadoop_第5张图片
  • 大小: 38.2 KB
  • 查看图片附件

你可能感兴趣的:(hadoop,hdfs)