服务器端环境搭建:
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.工程目录如下
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文件中追加
另一种连接方式,通过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; } }