English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

شرح تفصيلي لإنشاء قاعدة بيانات Hadoop الموزعة باستخدام Docker

استخدام Docker لبناء وتشغيل كتلة hadoop الموزعة

لقد بحثت لفترة طويلة ولم أجد أي وثيقة حول كيفية استخدام docker لبناء كتلة hadoop الموزعة، لا خيار آخر سوى كتابة واحدة بنفسي.

1: إعداد البيئة:

1: يجب أن يكون لديك نظام تشغيل CentOS7 أولاً، يمكن تثبيته في محاكي.

2: تثبيت docker في CentOS7، إصدار docker هو 1.8.2

خطوات التثبيت كالتالي:

<1> تثبيت إصدار معين من docker 

yum install -y docker-1.8.2-10.el7.centos 

<2> قد يتم إظهار خطأ أثناء التثبيت، يجب حذف هذه الاعتماد

rpm -e lvm2-7:2.02.105-14.el7.x86_64

تشغيل docker

service docker start

تحقق من نتائج التثبيت:

 

<3> بعد التشغيل، سيتم رؤية معلومات تحذيرية في صفحتين عند تشغيل docker info

يجب إغلاق جدار الحماية وإعادة تشغيل النظام

systemctl stop firewalld
systemctl disable firewalld
# النصيحة: بعد تنفيذ الأوامر أعلاه، يجب إعادة تشغيل النظام
reboot -h (إعادة تشغيل النظام)

<4> قد يتم إظهار خطأ عند تشغيل الحاوية

يجب إغلاق selinux

حل المشكلة:

1: setenforce 0 (يتم تطبيقه على الفور، ولا يتطلب إعادة تشغيل النظام)

2: تعديل ملف /etc/selinux/config حيثSELINUX=disabled ثم إعادة تشغيل النظام لجعل التغييرات سارية المفعول

يُنصح بتنفيذ الخطوتين معًا، مما يضمن أن يكون حالة selinux مغلقة بعد إعادة تشغيل النظام

3: يجب بناء صورة أساسية لـ hadoop أولاً، باستخدام ملف dockerfile لبناء.

إولاً، قم ببناء صورة صورة تحتوي على ميزة ssh لسهولة الاستخدام لاحقًا. (لكن هذا قد يؤثر على أمان الصندوق)

النصيحة: كلمة المرور للمستخدم root في هذه الصورة هي root

Mkdir centos-ssh-root 
Cd centos-ssh-root 
Vi Dockerfile
# اختيار صورة نظام التشغيل الموجودة مسبقًا كأساس 
FROM centos 
# مؤلف الصورة 
MAINTAINER crxy 
# تثبيت مكتبات openssh-server و sudo، وإعداد معلمة UsePAM لتكون no 
RUN yum install -y openssh-server sudo 
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config 
# تثبيت openssh-clients
RUN yum install -y openssh-clients
# إضافة مستخدم اختباري root، كلمة المرور root، وإضافة هذا المستخدم إلى sudoers 
RUN echo "root:root" | chpasswd 
RUN echo "root  ALL=(ALL)    ALL" >> /etc/sudoers 
# الكلمتين التاليتين مميزتان للغاية، يجب أن تكون موجودة على CentOS 6، وإلا لن يمكن تسجيل الدخول إلى sshd المكون من الصندوق 
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key 
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key 
# تشغيل خدمة sshd وتقديم 22 
RUN mkdir /var/run/sshd 
EXPOSE 22 
CMD [ "/usr/sbin/sshd", "-D" ]

أمر البناء:

docker build -t = "crxy/centos-ssh-root" .

استعلام الصورة التي تم بناؤها مؤخرًا

 

4: بناء صورة جديدة تحتوي على JDK بناءً على هذه الصورة
الاحتياط: يستخدم JDK إصدار 1.7

Mkdir centos-ssh-root-jdk 
Cd centos-ssh-root-jdk 
Cp ../jdk-7u75-Linux-x64.tar.gz . 
Vi Dockerfile
FROM crxy/centos-ssh-root
ADD jdk-7u75-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.7.0_75 /usr/local/jdk1.7
ENV JAVA_HOME /usr/local/jdk1.7
ENV PATH $JAVA_HOME/bin:$PATH

أمر البناء:

docker build -t = "crxy/centos-ssh-root-jdk" .

استعلام عن صورة الحلقة التي تم بناؤها بنجاح

 

5: بناء صورة JDK هذا مع إضافة hadoop

ملاحظة: يستخدم hadoop إصدار 2.4.1.

Mkdir centos-ssh-root-jdk-hadoop 
Cd centos-ssh-root-jdk-hadoop 
Cp ../hadoop-2.4.1.tar.gz . 
Vi Dockerfile
FROM crxy/centos-ssh-root-jdk
ADD hadoop-2.4.1.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.4.1 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

أمر البناء:

docker build -t=crxy/centos-ssh-root-jdk-hadoop .

استعلام عن صورة الحلقة التي تم بناؤها بنجاح

2: بناء شبكة hadoop الموزعة

1: تخطيط الشبكة

نحن نستعد لبناء شبكة معينة تحتوي على ثلاثة عقد، رئيسية واثنتين

الجهة الرئيسية: hadoop0 ip: 192.168.2.10

الجهة الأولى: hadoop1 ip: 192.168.2.11

الجهة الثانية: hadoop2 ip: 192.168.2.12

لكن بعد إعادة تشغيل صناديق docker، سيتم تغيير ip، لذا نحتاج إلى إعداد ip ثابتة للـ docker. استخدم pipework لإعداد ip ثابتة للصناديق docker

2: قم ببدء ثلاث صناديق، كـ hadoop0 hadoop1 hadoop2

في المضيف الرئيسي، قم بتشغيل الأوامر التالية، لضبط اسم المضيف واسم الصندوق، وأيضاً فتح منفذ 50070 و8088 في hadoop0

docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 crxy/centos-ssh-root-jdk-hadoop
docker run --name hadoop1 --hostname hadoop1 -d -P crxy/centos-ssh-root-jdk-hadoop
docker run --name hadoop2 --hostname hadoop2 -d -P crxy/centos-ssh-root-jdk-hadoop

使用docker ps 查看刚才启动的是三个容器

3: 给这三台容器设置固定IP

1: 下载pipework 下载地址:https://github.com/jpetazzo/pipework.git

2: 把下载的zip包上传到宿主机服务器上,解压,改名字

unzip pipework-master.zip
mv pipework-master pipework
cp -rp pipework/pipework /usr/local/bin/ 

3: 安装bridge-utils

yum -y install bridge-utils

4: 创建网络

brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0

5: 给容器设置固定ip

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

验证一下,分别ping三个ip,能ping通就说明没问题

4: 配置hadoop集群

先连接到hadoop0上, 使用命令

docker exec -it hadoop0 /bin/bash

下面的步骤就是hadoop集群的配置过程

1: 设置主机名与ip的映射,修改三台容器:vi /etc/hosts

添加下面配置

192.168.2.10  hadoop0
192.168.2.11  hadoop1
192.168.2.12  hadoop2

2: 设置ssh免密码登录

在hadoop0上执行下面操作

cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa(一直按回车即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2
在hadoop1上执行下面操作
cd ~
cd .ssh
ssh-keygen -t rsa(一直按回车即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop1
在hadoop2上执行下面操作
cd ~
cd .ssh
ssh-keygen -t rsa(一直按回车即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop2

3: 在hadoop0上修改hadoop的配置文件

进入到/usr/local/hadoop/etc/hadoop目录

修改目录下的配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml

(1) hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.7

(2) core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop0:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/tmp</value>
    </property>
     <property>
         <name>fs.trash.interval</name>
         <value>1440</value>
    </property>
</configuration>

(3) hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.permissions</name>
    <value>false</value>
  </property>
</configuration>

(4) yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property> 
        <name>yarn.log-aggregation-enable</name> 
        <value>true</value> 
    </property>
</configuration>

(5) تعديل اسم الملف: mv mapred-site.xml.template mapred-site.xml

vi mapred-site.xml

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

(6) التشكيل

الانتقال إلى مجلد /usr/local/hadoop

1. تنفيذ عملية التشكيل

bin/hdfs namenode -format

ملاحظة: قد يتم عرض خطأ أثناء التنفيذ، لأنه يفتقر إلى أمر which، يمكنك تثبيته.

إجراء الأوامر التالية لالتثبيت

yum install -y which

رؤية الأوامر التالية تشير إلى نجاح التشكيل.

لا يمكن تكرار عملية التشكيل. إذا كنت بحاجة إلى تكرار التشكيل، يمكنك استخدام 参数-force.

(7) بدء التوزيع الوهمي hadoop

الأمر:

sbin/start-all.sh

في عملية البدء لأول مرة، يجب عليك إدخال yes لتحديد.

استخدام jps، هل يمكن التحقق من بدء عملية النظام بشكل صحيح؟ هل يمكنك رؤية العمليات التالية التي تعني بدء التوزيع الوهمي بنجاح

[root@hadoop0 hadoop]# jps
3267 SecondaryNameNode
3003 NameNode
3664 Jps
3397 ResourceManager
3090 DataNode
3487 NodeManager

(8) التوقف عن تشغيل Hadoop المزيف

الأمر:

sbin/stop-all.sh

(9) تحديد عنوان nodemanager، تعديل ملف yarn-site.xml

<property>
  <description>The hostname of the RM.</description>
  <name>yarn.resourcemanager.hostname</name>
  <value>hadoop0</value>
 </property>

(10) تعديل ملف إعدادات Hadoop في Hadoop0، ملف etc/hadoop/slaves

حذف المحتويات الأصلية، وتعديلها كما يلي

hadoop1
hadoop2

(11) تنفيذ الأمر في Hadoop0

 scp -rq /usr/local/hadoop  hadoop1:/usr/local
 scp -rq /usr/local/hadoop  hadoop2:/usr/local

(12) بدء خدمة كتلة Hadoop الموزعة

تنفيذ sbin/start-all.sh

ملاحظة: سيتم عرض خطأ أثناء التنفيذ، لأن العقدة الثانوية تفتقر إلى الأمر which، ولكن يمكن تركيبها

في كل من العقدة الثانوية، قم بتنفيذ الأوامر التالية لتركيبها

yum install -y which

ثم قم ببدء الكتلة (إذا كانت الكتلة قد تم بدءها، يجب التوقف أولاً)

sbin/start-all.sh

(13) التحقق من أن الكتلة تعمل بشكل صحيح

أولاً، قم بعرض العمليات:

يحتاج Hadoop0 إلى هذه العمليات

[root@hadoop0 hadoop]# jps
4643 Jps
4073 NameNode
4216 SecondaryNameNode
4381 ResourceManager

يحتاج Hadoop1 إلى هذه العمليات

[root@hadoop1 hadoop]# jps
715 NodeManager
849 Jps
645 DataNode

يحتاج Hadoop2 إلى هذه العمليات

[root@hadoop2 hadoop]# jps
456 NodeManager
589 Jps
388 DataNode

استخدام البرنامج للتحقق من خدمة الكتلة

إنشاء ملف محلي

vi a.txt
مرحبًا أنت
مرحبًا أنا

التحميل a.txt إلى hdfs

hdfs dfs -put a.txt /

تنفيذ برنامج wordcount

cd /usr/local/hadoop/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /a.txt /out

مراجعة نتائج تنفيذ البرنامج

 

إذا كان ذلك، فإن ذلك يعني أن المجموعة تعمل بشكل صحيح

زيارة خدمات المجموعة من خلال المتصفح
بسبب أننا قد أرسلنا 50070 و8088 إلى منافذ المضيف عند بدء صناديق hadoop0

adb9eba7142b        crxy/centos-ssh-root-jdk-hadoop   "/usr/sbin/sshd -D"   About an hour ago   Up About an hour    0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp   hadoop0

لذا يمكنك الوصول إلى خدمات مجموعة hadoop في الصندوق مباشرة من المضيف
عنوان IP للمضيف هو: 192.168.1.144

http://192.168.1.144:50070/

http://192.168.1.144:8088/

ثالثًا: إعادة تشغيل نقاط المجموعة

توقف الثلاثة صناديق، وتنفيذ الأمر التالي على المضيف المضيف

docker stop hadoop0
docker stop hadoop1
docker stop hadoop2

بعد إيقاف الصناديق، سيختفي IP الثابت الذي تم تعيينه مسبقًا، وعند استخدام هذه الصناديق مرة أخرى، ستحتاج إلى إعادة تعيين IP الثابت
أولاً، أعد بدء الثلاثة صناديق التي تم إيقافها

docker start hadoop0
docker start hadoop1
docker start hadoop2

تنفيذ الأمر التالي على المضيف المضيف لتحديد IP الثابت للصندوق

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

يجب إعادة تكوين اسم المضيف وإعداد العنوان IP في الصندوق الخاص بك، وكتابة اليدوية كل مرة أمر مزعج

كتابة سكربت،runhosts.sh

#!/bin/bash
echo 192.168.2.10 hadoop0 >> /etc/hosts
echo 192.168.2.11 hadoop1 >> /etc/hosts
echo 192.168.2.12 hadoop2 >> /etc/hosts

إضافة صلاحية التنفيذ

chmod +x runhosts.sh 

أكتب هذا السكربت إلى جميع العقد، وأ�行ره كلًا منهم

scp runhosts.sh hadoop1:~
scp runhosts.sh hadoop2:~

أمر تنفيذ السكربت

./runhosts.sh

تحقق من أن الملف /etc/hosts تم إضافته بنجاح

الإشارة: لا يُمكن في بعض إصدارات Docker أن يتم إنشاء هذه المappings تلقائيًا في ملف hosts، لذا نحن نصنع هنا إعداد IP ثابت للصندوق وإنشاء علاقة اسم/IP.

172.17.0.25 hadoop0
172.17.0.25 hadoop0.bridge
172.17.0.26 hadoop1
172.17.0.26 hadoop1.bridge
172.17.0.27 hadoop2
172.17.0.27 hadoop2.bridge

إطلاق مجموعة هادووب

sbin/start-all.sh

هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أن تشجعوا دروس الصراخ كثيرًا.

البيان: محتويات هذا المقال تم جمعها من الإنترنت، ويحقوق النشر مملوكة للمالك الأصلي، ويتم جمع المحتوى بشكل تلقائي من قبل المستخدمين على الإنترنت، ويحتفظ هذا الموقع بملكية حقوق الطبع والنشر ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية متعلقة بذلك. إذا اكتشفتم أي محتوى مخالف لحقوق النشر، فلا تترددوا في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) للإبلاغ، وقدموا الدليل المتعلق بالحقوق النشر، وسنقوم بإزالة المحتوى المزعوم بعد التحقق.

أعجبك هذا