当前位置:   article > 正文

docker搭建hadoop hdfs完全分布式集群_docker hdfs

docker hdfs

1  制作hadoop镜像
参见 https://www.cnblogs.com/rmxd/p/12051866.html
该博客中只参考制作镜像部分,固定IP及启动集群的部分应该跳过。
这里注意,在做好的镜像里,要安装 which 工具,否则在执行 hdfs 命令时会报命令不存在异常。

yum install which -y

2 启动容器

  1. docker run --name hmaster --hostname hmaster --network hadoop -d -P \
  2. -p 50070:50070 \
  3. -p 50010:50010 \
  4. -p 9000:9000 \
  5. -p 8088:8088 \
  6. -p 50090:50090 \
  7. taiga/hadoop:v1.1
  8. docker run --name hslave1 --hostname hslave1 --network hadoop -d -P \
  9. -p 51070:51070 \
  10. -p 51010:51010 \
  11. -p 9100:9100 \
  12. -p 8188:8188 \
  13. -p 51090:51090 \
  14. taiga/hadoop:v1.1
  15. docker run --name hslave2 --hostname hslave2 --network hadoop -d -P \
  16. -p 52070:52070 \
  17. -p 52010:52010 \
  18. -p 9200:9200 \
  19. -p 8288:8288 \
  20. -p 52090:52090 \
  21. taiga/hadoop:v1.1


可以看到,我的镜像名称是  taiga/hadoop:v1.1
这里启动了三个容器,一个master,两个slave。注意要向外映射 51010 52010 端口,这两个端口用作 datanode 的控制端口,用于远程上传文件时,可以将datanode在端口映射给宿主机。

3 master免密登陆slave
进行 hmaster 容器,执行以下命令

  1. ssh-keygen
  2. # 剩下的一路回车即可
  3. ssh-copy-id hmaster
  4. # master也是免下密,根据提示输入yes以及主机密码
  5. ssh-copy-id hslave1
  6. ssh-copy-id hslave2

4 配置
hmaster core-site.xml

  1. <configuration>
  2.         <property>
  3.                 <name>fs.defaultFS</name>
  4.                 <value>hdfs://hmaster:9000</value>
  5.         </property>
  6.         <property>
  7.                 <name>hadoop.tmp.dir</name>
  8.                 <value>/usr/local/hadoop/tmp</value>
  9.         </property>
  10.          <property>
  11.                  <name>fs.trash.interval</name>
  12.                  <value>1440</value>
  13.         </property>
  14. </configuration>

hmaster hdfs-site.xml
 

  1. <configuration>
  2.     <property>
  3.         <name>dfs.replication</name>
  4.         <value>2</value>
  5.     </property>
  6.     <property>
  7.         <name>dfs.permissions</name>
  8.         <value>false</value>
  9.     </property>
  10.     <property>
  11.         <name>dfs.namenode.name.dir</name>
  12.         <value>/var/bigdata/hadoop/full/dfs/name</value>
  13.      </property>
  14.      <property>
  15.           <name>dfs.datanode.data.dir</name>
  16.           <value>/var/bigdata/hadoop/full/dfs/data</value>
  17.       </property>
  18.       <property>
  19.            <name>dfs.namenode.secondary.http-address</name>
  20.            <!-- 这里是启动 hslave1 时映射的端口-->
  21.            <value>hslave1:51090</value>
  22.        </property>
  23.        <property>
  24.             <name>dfs.namenode.checkpoint.dir</name>
  25.             <value>/var/bigdata/hadoop/full/dfs/secondary</value>
  26.         </property>
  27. </configuration>

hmaster hadoop-env.sh
在hadoop-env.sh里添加JAVA_HOME,这是必须要做的,因为当master节点ssh到slave节点上时,是获取不到slave节点的环境变量的,因此也拿不到  slave  节点的 $JAVA_HOME ,所以在hadoop-env.sh 里必须配置为绝对路径。

export JAVA_HOME=/usr/local/jdk1.8

hmaster slaves
在该文件里配置上slave节点的域名。因为在启动容器时已经将master和slave放在了同一个network里,所以直接使用域名即可相通通信,这也是不需要参照刚才那个博主中“固定IP”这一步骤的原因了。

  1. hslave1
  2. hslave2

将hmaster节点的配置分发到hslave  hslave2中

  1. cd /usr/local/hadoop/etc
  2. scp ./hadoop hslave1:`pwd`
  3. scp ./hadoop hslave2:`pwd`

配置slave节点
配置hslave1和hslave2的 hdfs-site.xml。为了将datanode的控制端口映射到宿主机,我们分别将 hslave1 和 hslave2的控制端口改成了 51010 和 52010, 所以要配置hslave1和hslave2的 hdfs-site.xml。

在hslave1中添加,是添加,其它的配置不动

  1.     <property>
  2.         <name>dfs.datanode.address</name>
  3.         <value>hslave1:51010</value>
  4.     </property>

在hslave2中添加,是添加,其它的配置不动

  1.     <property>
  2.         <name>dfs.datanode.address</name>
  3.         <value>hslave2:52010</value>
  4.     </property>

到这里所有的配置都完毕了。

5 启动
回到hmaster节点,执行

  1. hdfs namenode -format
  2. /usr/local/hadoop/sbin/start-dfs.sh

6 验证
OKAY ,集群搭建完毕。下面进行验证
浏览器访问 http://x.x.x.x:50070/dfshealth.html#tab-overview 。访问前首先保证虚拟机 50070 端口开放,或是虚拟机关闭防火墙。出现以下页面表示搭建成功:

来看一下datanode
 
这里的两个端口就是在 hslave1 和 hslave2里配置的

7 上传文件
在容器里上传文件肯定是会成功的了,就不验证了,下面验证一下通过 java 客户端上传个文件。
首先在电脑的 hosts 文件里加两行配置

  1. x.x.x.x hslave1
  2. x.x.x.x hslave1


x.x.x.x就是你虚拟机的ip

上传文件代码示例

  1. package cn.hgd11.hadoop;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.*;
  4. import org.junit.After;
  5. import org.junit.Before;
  6. import org.junit.Test;
  7. import java.io.BufferedInputStream;
  8. import java.io.FileInputStream;
  9. import java.io.FileOutputStream;
  10. import java.io.IOException;
  11. import java.net.URI;
  12. import java.net.URISyntaxException;
  13. import java.nio.ByteBuffer;
  14. public class HdfsTest {
  15.     private Configuration configuration;
  16.     private long start;
  17.     private long end;
  18.     private FileSystem fs;
  19.     @Before
  20.     public void before () throws URISyntaxException, IOException, InterruptedException {
  21.         start = System.currentTimeMillis();
  22.         configuration = new Configuration(true);
  23.         // 这行代码一定要有,表示从namenode拉回的datanode信息是域名,而不是ip,因为docker里的容器ip在本机是访问不到的
  24.         configuration.set("dfs.client.use.datanode.hostname", "true");
  25.         URI uri = new URI("hdfs://node128:9000/");
  26.         fs = FileSystem.get(uri, configuration, "root");
  27.     }
  28.     @Test
  29.     public void upload () throws IOException {
  30.         try {
  31.             String pathStr = "D:\\java\\mash\\资料\\hbase-book-master\\ch07\\test-data.txt";
  32.             Path src = new Path(pathStr);
  33.             Path dst = new Path("/hbase-book-code/ch07/test-data.txt");
  34.             fs.copyFromLocalFile(src, dst);
  35.             System.out.println("上传完成");
  36.         } catch (IllegalArgumentException e) {
  37.             e.printStackTrace();
  38.         } catch (Exception e) {
  39.             e.printStackTrace();
  40.         }
  41.     }
  42.     @After
  43.     public void after () throws IOException {
  44.         if (fs != null) {
  45.             fs.close();
  46.         }
  47.         System.out.println("程序耗时:" + (System.currentTimeMillis() - start));
  48.     }
  49. }

上传成功后的效果
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/482069
推荐阅读
相关标签
  

闽ICP备14008679号