Jadual Kandungan
将WordCount.java复制到linux下的一个目录,这里我复制到/home/crazyant/hadoop_wordcount
在该目录(/home/crazyant/hadoop_wordcount)下创建wordcount_classes目录,用于存放编译WordCount.java生成的class文件。
编译WordCount.java文件,其中-classpath选项表示要引用hadoop官方的包,-d选项表示要将编译后的class文件生成的目标目录。
然后将编译后的class文件打包:
在本地用echo生成一个文件,用于输入数据:
在hadoop上建立一个目录,里面建立输入文件的目录
将本地刚刚写的的inputfile上传到hadoop上的input目录
运行jar,以建立的Input目录作为输入参数
查看output目录是否有结果
将该目录下所有文本文件合并后下载到本地
查看一下下载下来的计算结果
Rumah pangkalan data tutorial mysql hadoop第一个程序WordCount.java的编译运行过程

hadoop第一个程序WordCount.java的编译运行过程

Jun 07, 2016 pm 04:31 PM
hadoop program yang pertama

java是hadoop开发的标准官方语言,本文下载了官方的WordCount.java并对其进行了编译和打包,然后使用测试数据运行了该hadoop程序。 这里假定已经装好了hadoop的环境,在Linux下运行hadoop命令能够正常执行; 下载java版本的WordCount.java程序。 将WordCount

java是hadoop开发的标准官方语言,本文下载了官方的WordCount.java并对其进行了编译和打包,然后使用测试数据运行了该hadoop程序。

这里假定已经装好了hadoop的环境,在Linux下运行hadoop命令能够正常执行;

下载java版本的WordCount.java程序。

将WordCount.java复制到linux下的一个目录,这里我复制到/home/crazyant/hadoop_wordcount

[crazyant@dev.mechine hadoop_wordcount]$ ll

total 4

-rwxr–r–? 1 crazyant crazyant 1921 Aug 16 20:03 WordCount.java

在该目录(/home/crazyant/hadoop_wordcount)下创建wordcount_classes目录,用于存放编译WordCount.java生成的class文件。

[crazyant@dev.mechine hadoop_wordcount]$ mkdir wordcount_classes

[crazyant@dev.mechine hadoop_wordcount]$ ll

total 8

drwxrwxr-x? 2 crazyant crazyant 4096 Aug 16 20:07 wordcount_classes

-rwxr–r–? 1 crazyant crazyant 1921 Aug 16 20:03 WordCount.java

编译WordCount.java文件,其中-classpath选项表示要引用hadoop官方的包,-d选项表示要将编译后的class文件生成的目标目录。

[crazyant@dev.mechine hadoop_wordcount]$ javac -classpath /home/crazyant/app/hadoop/hadoop-2-core.jar -d wordcount_classes WordCount.java

[crazyant@dev.mechine hadoop_wordcount]$ ll -R

.:

total 8

drwxrwxr-x? 3 crazyant crazyant 4096 Aug 16 20:09 wordcount_classes

-rwxr–r–? 1 crazyant crazyant 1921 Aug 16 20:03 WordCount.java

./wordcount_classes:

total 4

drwxrwxr-x? 3 crazyant crazyant 4096 Aug 16 20:09 org

./wordcount_classes/org:

total 4

drwxrwxr-x? 2 crazyant crazyant 4096 Aug 16 20:09 myorg

./wordcount_classes/org/myorg:

total 12

-rw-rw-r–? 1 crazyant crazyant 1546 Aug 16 20:09 WordCount.class

-rw-rw-r–? 1 crazyant crazyant 1938 Aug 16 20:09 WordCount$Map.class

-rw-rw-r–? 1 crazyant crazyant 1611 Aug 16 20:09 WordCount$Reduce.class

然后将编译后的class文件打包:

[crazyant@dev.mechine hadoop_wordcount]$ jar -cvf wordcount.jar -C wordcount_classes/ .

added manifest

adding: org/(in = 0) (out= 0)(stored 0%)

adding: org/myorg/(in = 0) (out= 0)(stored 0%)

adding: org/myorg/WordCount$Map.class(in = 1938) (out= 798)(deflated 58%)

adding: org/myorg/WordCount$Reduce.class(in = 1611) (out= 649)(deflated 59%)

adding: org/myorg/WordCount.class(in = 1546) (out= 749)(deflated 51%)

[crazyant@dev.mechine hadoop_wordcount]$ ll

total 12

drwxrwxr-x? 3 crazyant crazyant 4096 Aug 16 20:09 wordcount_classes

-rw-rw-r–? 1 crazyant crazyant 3169 Aug 16 20:11 wordcount.jar

-rwxr–r–? 1 crazyant crazyant 1921 Aug 16 20:03 WordCount.java

在本地用echo生成一个文件,用于输入数据:

[crazyant@dev.mechine hadoop_wordcount]$ echo “hello world, hello crazyant, i am the ant, i am your brother” > inputfile

[crazyant@dev.mechine hadoop_wordcount]$ more inputfile

hello world, hello crazyant, i am the ant, i am your brother

在hadoop上建立一个目录,里面建立输入文件的目录

[crazyant@dev.mechine hadoop_wordcount]$ hadoop fs -mkdir /app/word_count/input

[crazyant@dev.mechine hadoop_wordcount]$ hadoop fs -ls /app/word_count

Found 1 items

drwxr-xr-x?? 3 czt czt????????? 0 2013-08-16 20:16 /app/word_count/input

将本地刚刚写的的inputfile上传到hadoop上的input目录

[crazyant@dev.mechine hadoop_wordcount]$ hadoop fs -put inputfile /app/word_count/input

[crazyant@dev.mechine hadoop_wordcount]$ hadoop fs -ls /app/word_count/input

Found 1 items

-rw-r–r–?? 3 czt czt???????? 61 2013-08-16 20:18 /app/word_count/input/inputfile

运行jar,以建立的Input目录作为输入参数

[crazyant@dev.mechine hadoop_wordcount]$ hadoop jar wordcount.jar org.myorg.WordCount /app/word_count/input /app/word_count/output

13/08/16 20:19:38 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.

13/08/16 20:19:40 INFO util.NativeCodeLoader: Loaded the native-hadoop library

13/08/16 20:19:40 INFO compress.LzoCodec: Successfully loaded & initialized native-lzo library

13/08/16 20:19:40 INFO compress.LzmaCodec: Successfully loaded & initialized native-lzma library

13/08/16 20:19:40 INFO compress.QuickLzCodec: Successfully loaded & initialized native-quicklz library

13/08/16 20:19:40 INFO mapred.FileInputFormat: Total input paths to process : 1

13/08/16 20:19:41 INFO mapred.JobClient: splits size : 61

13/08/16 20:19:41 INFO mapred.JobClient: Running job: job_20130813122541_105844

13/08/16 20:19:43 INFO mapred.JobClient:? map 0% reduce 0%

13/08/16 20:19:57 INFO mapred.JobClient:? map 24% reduce 0%

13/08/16 20:20:07 INFO mapred.JobClient:? map 93% reduce 0%

13/08/16 20:20:16 INFO mapred.JobClient:? map 100% reduce 1%

13/08/16 20:20:26 INFO mapred.JobClient:? map 100% reduce 61%

13/08/16 20:20:36 INFO mapred.JobClient:? map 100% reduce 89%

13/08/16 20:20:47 INFO mapred.JobClient:? map 100% reduce 96%

13/08/16 20:20:57 INFO mapred.JobClient:? map 100% reduce 98%

13/08/16 20:21:00 INFO mapred.JobClient: Updating completed job! Ignoring …

13/08/16 20:21:00 INFO mapred.JobClient: Updating completed job! Ignoring …

13/08/16 20:21:00 INFO mapred.JobClient: Job complete: job_20130813122541_105844

13/08/16 20:21:00 INFO mapred.JobClient: Counters: 19

13/08/16 20:21:00 INFO mapred.JobClient:?? File Systems

13/08/16 20:21:00 INFO mapred.JobClient:???? HDFS bytes read=1951

13/08/16 20:21:00 INFO mapred.JobClient:???? HDFS bytes written=68

13/08/16 20:21:00 INFO mapred.JobClient:???? Local bytes read=5174715

13/08/16 20:21:00 INFO mapred.JobClient:???? Local bytes written=256814

13/08/16 20:21:00 INFO mapred.JobClient:?? Job Counters

13/08/16 20:21:00 INFO mapred.JobClient:???? Launched reduce tasks=100

13/08/16 20:21:00 INFO mapred.JobClient:???? Rack-local map tasks=61

13/08/16 20:21:00 INFO mapred.JobClient:???? ORIGINAL_REDUCES=100

13/08/16 20:21:00 INFO mapred.JobClient:???? Launched map tasks=61

13/08/16 20:21:00 INFO mapred.JobClient:???? MISS_SCHEDULED_REDUCES=15

13/08/16 20:21:00 INFO mapred.JobClient:?? TASK_STATISTICS

13/08/16 20:21:00 INFO mapred.JobClient:???? Total Map Slot Time=34

13/08/16 20:21:00 INFO mapred.JobClient:???? Attempt_0 Map Task Count=61

13/08/16 20:21:00 INFO mapred.JobClient:???? Total Reduce Slot Time=892

13/08/16 20:21:00 INFO mapred.JobClient:?? Map-Reduce Framework

13/08/16 20:21:00 INFO mapred.JobClient:???? Reduce input groups=9

13/08/16 20:21:00 INFO mapred.JobClient:???? Combine output records=0

13/08/16 20:21:00 INFO mapred.JobClient:???? Map input records=1

13/08/16 20:21:00 INFO mapred.JobClient:???? Reduce output records=9

13/08/16 20:21:00 INFO mapred.JobClient:???? Map input bytes=61

13/08/16 20:21:00 INFO mapred.JobClient:???? Combine input records=0

13/08/16 20:21:00 INFO mapred.JobClient:???? Reduce input records=9

查看output目录是否有结果

[crazyant@dev.mechine hadoop_wordcount]$ hadoop fs -ls /app/word_count/output??????????????????????????????????????????????????? Found 100 items

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00000

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00001

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00002

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00003

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00004

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00005

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00006

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00007

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00008

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00009

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00010

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00011

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00012

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00013

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00014

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00015

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00016

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00017

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00018

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00019

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00020

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00021

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00022

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00023

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00024

-rw-r–r–?? 3 czt czt????????? 0 2013-08-16 20:20 /app/word_count/output/part-00025

将该目录下所有文本文件合并后下载到本地

[crazyant@dev.mechine hadoop_wordcount]$ hadoop fs -getmerge /app/word_count/output wordcount_result

[crazyant@dev.mechine hadoop_wordcount]$ ls

inputfile? wordcount_classes? wordcount.jar? WordCount.java? wordcount_result

查看一下下载下来的计算结果

[crazyant@dev.mechine hadoop_wordcount]$ more wordcount_result

i?????? 2

your??? 1

crazyant,?????? 1

brother 1

hello?? 2

am????? 2

world,? 1

the???? 1

ant,??? 1

统计结果正确;

参考文章:http://hadoop.apache.org/docs/r0.18.3/mapred_tutorial.html#Example%3A+WordCount+v1.0

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menjadikan Peta Google sebagai peta lalai dalam iPhone Bagaimana untuk menjadikan Peta Google sebagai peta lalai dalam iPhone Apr 17, 2024 pm 07:34 PM

Peta lalai pada iPhone ialah Peta, pembekal geolokasi proprietari Apple. Walaupun peta semakin baik, ia tidak berfungsi dengan baik di luar Amerika Syarikat. Ia tiada apa-apa untuk ditawarkan berbanding Peta Google. Dalam artikel ini, kami membincangkan langkah yang boleh dilaksanakan untuk menggunakan Peta Google untuk menjadi peta lalai pada iPhone anda. Cara Menjadikan Peta Google Peta Lalai dalam iPhone Menetapkan Peta Google sebagai aplikasi peta lalai pada telefon anda adalah lebih mudah daripada yang anda fikirkan. Ikut langkah di bawah – Langkah prasyarat – Anda mesti memasang Gmail pada telefon anda. Langkah 1 – Buka AppStore. Langkah 2 – Cari “Gmail”. Langkah 3 – Klik di sebelah apl Gmail

Betulkan: Operator menolak ralat permintaan dalam Windows Task Scheduler Betulkan: Operator menolak ralat permintaan dalam Windows Task Scheduler Aug 01, 2023 pm 08:43 PM

Untuk mengautomasikan tugas dan mengurus berbilang sistem, perisian perancangan tugas ialah alat yang berharga dalam senjata anda, terutamanya sebagai pentadbir sistem. Penjadual Tugas Windows melakukan tugas dengan sempurna, tetapi baru-baru ini ramai orang telah melaporkan ralat permintaan yang ditolak oleh operator. Masalah ini wujud dalam semua lelaran sistem pengendalian, dan walaupun ia telah dilaporkan dan dilindungi secara meluas, tiada penyelesaian yang berkesan. Teruskan membaca untuk mengetahui perkara yang mungkin berkesan untuk orang lain! Apakah permintaan dalam Penjadual Tugas 0x800710e0 yang dinafikan oleh pengendali atau pentadbir? Penjadual Tugas membolehkan mengautomasikan pelbagai tugas dan aplikasi tanpa input pengguna. Anda boleh menggunakannya untuk menjadualkan dan mengatur aplikasi tertentu, mengkonfigurasi pemberitahuan automatik, membantu menghantar mesej dan banyak lagi. ia

Bagaimana untuk mengisih foto mengikut wajah pada Windows 10 dan 11 Bagaimana untuk mengisih foto mengikut wajah pada Windows 10 dan 11 Aug 08, 2023 pm 10:41 PM

Pengendalian Windows semakin baik dan lebih baik dengan setiap versi, dengan ciri menarik untuk meningkatkan pengalaman pengguna. Satu ciri yang ingin diterokai oleh pengguna pada Windows 10 dan 11 ialah keupayaan untuk mengisih foto mengikut wajah. Ciri ini membolehkan anda mengumpulkan foto rakan dan keluarga menggunakan pengecaman muka. Bunyinya menyeronokkan, bukan? Teruskan membaca untuk mengetahui cara memanfaatkan ciri ini. Bolehkah saya mengumpulkan foto mengikut wajah pada Windows? Ya, anda boleh menggunakan apl Foto untuk mengumpulkan gambar mengikut wajah pada Windows 10 dan 11. Walau bagaimanapun, ciri ini tidak tersedia pada versi apl Photos. Selain itu, anda boleh memautkan foto ini kepada kenalan menggunakan tab Orang. Oleh itu, menggunakan fungsi ini anda boleh

Bagaimana untuk menulis program undur mudah dalam C++? Bagaimana untuk menulis program undur mudah dalam C++? Nov 03, 2023 pm 01:39 PM

C++ ialah bahasa pengaturcaraan yang digunakan secara meluas yang sangat mudah dan praktikal dalam menulis program undur. Program undur ialah aplikasi biasa yang boleh memberikan kita pengiraan masa dan fungsi kira detik yang sangat tepat. Artikel ini akan memperkenalkan cara menggunakan C++ untuk menulis program kira detik yang mudah. Kunci untuk melaksanakan program kira detik ialah menggunakan pemasa untuk mengira peredaran masa. Dalam C++, kita boleh menggunakan fungsi dalam fail pengepala time.h untuk melaksanakan fungsi pemasa. Berikut ialah kod untuk program kira detik yang mudah

Apl jam tiada dalam iPhone: Cara membetulkannya Apl jam tiada dalam iPhone: Cara membetulkannya May 03, 2024 pm 09:19 PM

Adakah apl jam hilang dari telefon anda? Tarikh dan masa masih akan dipaparkan pada bar status iPhone anda. Walau bagaimanapun, tanpa apl Jam, anda tidak akan dapat menggunakan jam dunia, jam randik, jam penggera dan banyak ciri lain. Oleh itu, membetulkan apl jam yang hilang hendaklah berada di bahagian atas senarai tugasan anda. Penyelesaian ini boleh membantu anda menyelesaikan isu ini. Betulkan 1 – Letakkan Apl Jam Jika anda tersilap mengalih keluar apl Jam daripada skrin utama anda, anda boleh meletakkan semula apl Jam pada tempatnya. Langkah 1 – Buka kunci iPhone anda dan mula meleret ke kiri sehingga anda mencapai halaman Pustaka Apl. Langkah 2 – Seterusnya, cari "jam" dalam kotak carian. Langkah 3 – Apabila anda melihat "Jam" di bawah dalam hasil carian, tekan dan tahan dan

Bagaimana untuk membuka tapak web menggunakan Penjadual Tugas Bagaimana untuk membuka tapak web menggunakan Penjadual Tugas Oct 02, 2023 pm 11:13 PM

Adakah anda kerap melawat tapak web yang sama pada masa yang hampir sama setiap hari? Ini boleh menyebabkan menghabiskan banyak masa dengan berbilang tab penyemak imbas dibuka dan mengacaukan penyemak imbas semasa melakukan tugas harian. Nah, bagaimana pula dengan membukanya tanpa perlu melancarkan penyemak imbas secara manual? Ia sangat mudah dan tidak memerlukan anda memuat turun sebarang apl pihak ketiga, seperti yang ditunjukkan di bawah. Bagaimanakah cara saya menyediakan Penjadual Tugas untuk membuka tapak web? Tekan kekunci, taip Penjadual Tugas dalam kotak carian, dan kemudian klik Buka. Windows Pada bar sisi kanan, klik pada pilihan Cipta Tugas Asas. Dalam medan Nama, masukkan nama tapak web yang ingin anda buka dan klik Seterusnya. Seterusnya, di bawah Pencetus, klik Kekerapan Masa dan klik Seterusnya. Pilih berapa lama anda mahu acara itu berulang dan klik Seterusnya. Pilih dayakan

iOS 17: Cara mengatur apl iMessage dalam Messages iOS 17: Cara mengatur apl iMessage dalam Messages Sep 18, 2023 pm 05:25 PM

Dalam iOS 17, Apple bukan sahaja menambah beberapa ciri pemesejan baharu, tetapi juga mengubah reka bentuk aplikasi Mesej untuk memberikan rupa yang lebih bersih. Semua apl dan alatan iMessage, seperti pilihan kamera dan foto, kini boleh diakses dengan mengetik butang "+" di atas papan kekunci dan di sebelah kiri medan input teks. Mengklik butang "+" memaparkan lajur menu dengan susunan pilihan lalai. Bermula dari bahagian atas, terdapat kamera, foto, pelekat, wang tunai (jika ada), audio dan lokasi. Di bahagian paling bawah terdapat butang "Lagi", yang apabila diketik akan mendedahkan sebarang apl pemesejan lain yang dipasang (anda juga boleh meleret ke atas untuk mendedahkan senarai tersembunyi ini). Cara menyusun semula apl iMessage anda Anda boleh melakukannya dengan mengikuti

Tidak boleh membenarkan akses kepada kamera dan mikrofon dalam iPhone Tidak boleh membenarkan akses kepada kamera dan mikrofon dalam iPhone Apr 23, 2024 am 11:13 AM

Adakah anda mendapat "Tidak dapat membenarkan akses kepada kamera dan mikrofon" apabila cuba menggunakan apl itu? Biasanya, anda memberikan kebenaran kamera dan mikrofon kepada orang tertentu berdasarkan keperluan untuk disediakan. Walau bagaimanapun, jika anda menafikan kebenaran, kamera dan mikrofon tidak akan berfungsi dan sebaliknya akan memaparkan mesej ralat ini. Menyelesaikan masalah ini adalah sangat asas dan anda boleh melakukannya dalam satu atau dua minit. Betulkan 1 – Sediakan Kebenaran Kamera, Mikrofon Anda boleh memberikan kebenaran kamera dan mikrofon yang diperlukan secara terus dalam tetapan. Langkah 1 – Pergi ke tab Tetapan. Langkah 2 – Buka panel Privasi & Keselamatan. Langkah 3 – Hidupkan kebenaran "Kamera" di sana. Langkah 4 – Di dalam, anda akan menemui senarai apl yang telah meminta kebenaran untuk kamera telefon anda. Langkah 5 – Buka "Kamera" apl yang ditentukan

See all articles